Puedo escribir algo yo mismo al encontrar cruces por cero de la primera derivada o algo así, pero parece una función lo suficientemente común como para incluirla 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, hay múltiples picos fuertes, y luego muchos "picos" más pequeños que son causados por el 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 el valor máximo, probablemente usando interpolación cuadrática o algo así.
Por lo general, solo le interesan 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, clasificados por amplitud.
Como dije, sé cómo escribir algo como esto yo mismo. Solo pregunto si hay una función o paquete preexistente que funcione bien.
Actualizar:
Yo traduje una secuencia de comandos de MATLAB y funciona bastante bien para el caso 1-D, pero podría ser mejor.
Actualización actualizada:
sixtenbe creó una mejor versión para el caso 1-D.
fuente
find_peaks
, así que agregué esta respuesta que podría ser útil para referencia futura. (Estoy seguro de que ya ha encontrado esto desde 2009, ¡pero es para otras personas + yo mismo cuando me haga la pregunta nuevamente en unos años!)Respuestas:
La función
scipy.signal.find_peaks
, como su nombre lo indica, es útil para esto. Pero es importante comprender bien sus parámetroswidth
ythreshold
,distance
sobre todo,prominence
obtener una buena extracción de picos.Según mis pruebas y la documentación, el concepto de prominencia es "el concepto útil" para mantener los picos buenos y descartar los picos ruidosos.
¿Qué es la prominencia (topográfica) ? Es "la altura mínima necesaria para descender para llegar desde la cumbre a cualquier terreno más alto" , como se puede ver aquí:
La idea es:
Prueba:
Usé un sinusoide (ruidoso) que varía en frecuencia a propósito porque muestra muchas dificultades. Podemos ver que el
width
parámetro no es muy útil aquí porque si establece un mínimowidth
demasiado alto, entonces no podrá rastrear picos muy cercanos en la parte de alta frecuencia. Si establecewidth
demasiado bajo, tendría muchos picos no deseados en la parte izquierda de la señal. Mismo problema condistance
.threshold
solo se compara con los vecinos directos, lo que no es útil aquí.prominence
Es el que da la mejor solución. ¡Tenga en cuenta que puede combinar muchos de estos parámetros!Código:
fuente
Estoy viendo un problema similar, y he encontrado que algunas de las mejores referencias provienen de la química (de picos encontrados en datos de especificaciones de masa). Para una buena revisión exhaustiva de los algoritmos de búsqueda de picos, lea esto . Esta es una de las mejores revisiones más claras de las técnicas de búsqueda de picos que he encontrado. (Las wavelets 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 ese el caso, recomendaría usar derivados suaves de savtizky-golay para encontrar los picos (si solo diferencia los datos anteriores, tendrá un montón de falsos positivos). Esta es una técnica muy efectiva y es bastante fácil de implementar (necesita una clase de matriz con operaciones básicas). Si simplemente encuentra el cruce por cero de la primera derivada SG, creo que será feliz.
fuente
Hay una función en scipy llamada
scipy.signal.find_peaks_cwt
que parece adecuada para sus necesidades, sin embargo, no tengo experiencia con ella, así que no puedo recomendarla.http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
fuente
Para aquellos que no están seguros sobre qué algoritmos de búsqueda de picos usar en Python, aquí hay una descripción general rápida de las alternativas: https://github.com/MonsieurV/py-findpeaks
Al querer un equivalente a la
findpeaks
función MatLab , descubrí que la función detect_peaks de Marcos Duarte es una buena captura.Bastante fácil de usar:
Lo que te dará:
fuente
find_peaks
se agregó la función ascipy
.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 los años 80. Busque "Modelado sinusoidal" en la literatura.
Si sus señales son tan claras como el ejemplo, un simple "dame algo con una amplitud mayor que N vecinos" debería funcionar razonablemente bien. Si tiene señales ruidosas, una forma simple pero efectiva es mirar sus picos a tiempo, 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).
fuente
No creo que lo que estás buscando sea provisto por SciPy. Escribiría el código yo mismo, en esta situación.
La interpolación de spline y el suavizado de scipy.interpolate son bastante agradables y pueden ser bastante útiles para ajustar picos y luego encontrar la ubicación de su máximo.
fuente
Existen funciones y métodos estadísticos estándar para encontrar valores atípicos en los datos, que probablemente sea lo que necesita en el primer caso. Usar derivados resolvería tu segundo. Sin embargo, no estoy seguro de un método que resuelva funciones continuas y datos muestreados.
fuente
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í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 por debajo 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 conocido como "desenmascaramiento de valores extremos". Sus aplicaciones típicas incluyen identificar eventos de peligro basados en lecturas continuas de variables ambientales, por ejemplo, analizar la velocidad del viento para detectar eventos de tormenta.
fuente