secuencial qué ordenamiento ejemplo codigo búsqueda busquedas busqueda binarias binaria algoritmos algoritmo python scipy fft hough-transform

qué - Algoritmo de búsqueda de picos para Python/SciPy



ordenamiento busqueda binaria python (7)

Estoy viendo un problema similar, y he encontrado que algunas de las mejores referencias provienen de la química (a partir de los picos encontrados en datos de especificaciones de masas). Para una buena revisión exhaustiva de los algoritmos de búsqueda de picos, lea this . Esta es una de las mejores críticas de las técnicas de búsqueda de picos que he encontrado. (Las ondículas son las mejores para encontrar picos de este tipo en datos ruidosos).

Parece que tus picos están claramente definidos y no están ocultos en el ruido. Siendo este el caso, recomendaría usar derivados de savtizky-golay para encontrar los picos (si solo diferencia los datos anteriores, tendrá un aluvión de falsos positivos). Esta es una técnica muy efectiva y es bastante fácil de implementar (se necesita una clase matricial con operaciones básicas). Si simplemente encuentra el cruce por cero del primer derivado SG, creo que estará contento.

Puedo escribir algo yo mismo buscando cero cruces de la primera derivada o algo así, pero parece ser una función bastante común para ser incluida en las bibliotecas estándar. Alguien sabe de uno?

Mi aplicación particular es una matriz 2D, pero generalmente se usaría para encontrar picos en FFT, etc.

Específicamente, en este tipo de problemas, existen múltiples picos fuertes, y luego muchos "picos" más pequeños que solo son causados ​​por ruido que debe ignorarse. Estos son solo ejemplos; no mis datos reales:

Picos unidimensionales:

Picos bidimensionales:

El algoritmo de búsqueda de picos encontraría la ubicación de estos picos (no solo sus valores), e idealmente encontraría el verdadero pico entre muestras, no solo el índice con valor máximo, probablemente usando interpolación cuadrática o algo así.

Por lo general, solo te importan unos pocos picos fuertes, por lo que se elegirían porque están por encima de un cierto umbral o porque son los primeros n picos de una lista ordenada, ordenados por amplitud.

Como dije, sé cómo escribir algo como esto yo mismo. Solo estoy preguntando si hay una función o paquete preexistente que se sabe que funciona bien.

Actualizar:

Traducí un script de MATLAB y funciona decentemente para el caso 1-D, pero podría ser mejor.

Actualización actualizada:

sixtenbe creó una mejor versión para el caso 1-D.


Existen funciones estadísticas estándar y métodos para encontrar valores atípicos a los datos, que es probablemente lo que necesita en el primer caso. Usar derivados resolvería tu segundo. Sin embargo, no estoy seguro de un método que resuelva tanto las funciones continuas como los datos muestreados.


La detección de picos en un espectro de manera confiable se ha estudiado bastante, por ejemplo, todo el trabajo sobre modelado sinusoidal para señales de música / audio en la década de los 80. Busque "Modelado Sinusoidal" en la literatura.

Si sus señales son tan limpias como en el ejemplo, un simple "darme algo con una amplitud superior a N vecinos" debería funcionar razonablemente bien. Si tiene señales ruidosas, una forma simple pero efectiva es mirar sus picos a tiempo, para rastrearlos: luego detecta líneas espectrales en lugar de picos espectrales. IOW, calcula la FFT en una ventana deslizante de su señal, para obtener un conjunto de espectro a tiempo (también llamado espectrograma). Luego observa la evolución del pico espectral en el tiempo (es decir, en ventanas consecutivas).


Lo primero es lo primero, la definición de "pico" es vaga si no hay más especificaciones. Por ejemplo, para la siguiente serie, ¿llamarías a 5-4-5 un pico o dos?

1-2-1-2-1-1-5-4-5-1-1-5-1

En este caso, necesitará al menos dos umbrales: 1) un umbral alto solo por encima del cual puede registrarse un valor extremo como un pico; y 2) un umbral bajo para que los valores extremos separados por valores pequeños debajo de él se conviertan en dos picos.

La detección de picos es un tema bien estudiado en la literatura de la Teoría del Valor Extremo, también conocida como "desclasificación de valores extremos". Sus aplicaciones típicas incluyen la identificación de eventos de peligro basados ​​en lecturas continuas de variables ambientales, por ejemplo, el análisis de la velocidad del viento para detectar eventos de tormentas.


No creo que lo que estás buscando sea proporcionado por SciPy. Yo escribiría el código yo mismo, en esta situación.

La interpolación spline y el suavizado desde scipy.interpolate son bastante agradables y pueden ser bastante útiles para ajustar los picos y luego encontrar la ubicación de su máximo.


Para aquellos que no están seguros acerca de qué algoritmos de búsqueda de picos utilizar en Python, aquí una descripción rápida de las alternativas: https://github.com/MonsieurV/py-findpeaks

Queriendo ser un equivalente a la función de encontrar findpeaks MatLab, descubrí que la función detectar_peaks de Marcos Duarte es una buena opción .

Bastante fácil de usar:

import numpy as np from vector import vector, plot_peaks from libs import detect_peaks print(''Detect peaks with minimum height and distance filters.'') indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2) print(''Peaks are: %s'' % (indexes))

Lo cual te dará: