Puedo escribir algo de mí mismo por la búsqueda de cero-los cruces de la primera derivada o algo, pero me parece un común suficientemente función para ser incluidos en las bibliotecas estándar. Alguien sabe de uno?

Mi aplicación en particular es una matriz 2D, pero generalmente, sería utilizado para la búsqueda de picos en la Fft, etc.

Específicamente, en este tipo de problemas, hay varios fuertes picos, y luego un montón de pequeños «picos» que son causados sólo por el ruido que debe ser ignorado. Estos son solo ejemplos; no mis datos reales:

1-dimensional picos:

El pico de encontrar el algoritmo para Python/SciPy

2-dimensional picos:

El pico de encontrar el algoritmo para Python/SciPy

El pico de encontrar el algoritmo encuentra la ubicación de estos picos (no sólo sus valores), y lo ideal sería encontrar el verdadero inter-pico de la muestra, no sólo el índice con valor máximo, probablemente con el uso de la interpolación cuadrática o algo.

Normalmente sólo la atención sobre un par de fuertes picos, por lo que o bien iba a ser el elegido porque están por encima de un cierto umbral, o porque son el primer n picos de una lista ordenada, clasificada por la amplitud.

Como dije, no sé cómo escribir algo como esto a mí mismo. Sólo estoy preguntando si hay una pre-existente o de la función de paquete que se sabe que funcionan bien.

Actualización:

Me traducir una secuencia de comandos de MATLAB y funciona decentemente para el 1-D caso, pero podría ser mejor.

Actualizado actualización:

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

InformationsquelleAutor endolith | 2009-11-11

8 Comentarios

  1. 3

    No creo que lo que se busca es la proporcionada por SciPy. Me gustaría escribir el código de mí mismo, en esta situación.

    La interpolación spline y suavizado de scipy.interpolar son muy agradable y puede ser bastante útil en el ajuste de los picos y, a continuación, encontrar la ubicación de su máximo.

    • Mis disculpas, pero creo que este debería ser un comentario, no una respuesta. Sólo se sugiere escribir por sí mismo, con una vaga sugerencia de funciones que podrían ser útiles (los que en la respuesta de Pablo es mucho más relevante, por cierto).
  2. 42

    Estoy buscando a un problema similar, y he encontrado algunas de las mejores referencias provienen de la química (de los picos de encontrar en masa-especificaciones de datos). Para una buena revisión exhaustiva de pico algoritmos de búsqueda con la lectura este. Este es uno de los mejores clara revisiones de pico encontrar técnicas que me he encontrado de todo. (Wavelets son los mejores para encontrar los picos de este tipo de datos ruidosos.).

    Parece que sus picos están claramente definidos y no están ocultos en el ruido. Siendo ese el caso, me gustaría recomendar el uso suave savtizky-golay derivados para encontrar los picos (Si usted acaba de diferenciar los datos de arriba vas a tener un monton de falsos positivos.). Esta es una técnica muy efectiva y es bastante fácil de implementar (se necesita una matriz de clase w/operaciones básicas). Si usted sólo tiene que encontrar el cruce por cero de la primera S-G derivado creo que voy a ser feliz.

    • Yo estaba buscando una solución de propósito general, no uno que sólo funciona en las imágenes. Me he adaptado una secuencia de comandos de MATLAB para Python y funciona decentemente.
    • A la derecha en. Matlab es una buena fuente para los algoritmos. ¿Qué técnica de la secuencia de comandos de uso? (BTW, la SG es una muy de propósito general técnica).
    • He enlazado más arriba. Es, básicamente, sólo busca los máximos locales que son mayores que un cierto umbral por encima de sus vecinos. Sin duda hay mejores métodos.
    • He marcado esa página. IYO y en resumen, ¿qué técnica específica ¿crees que funciona mejor para este pico de picking de negocios?
    • ¿por qué son los ceros de la derivada mejor que comprobar si la media de los tres puntos es mayor o menor de los otros dos. ya he aplicado sg transfor, parece un costo extra.
  3. 34

    La función scipy.de la señal.find_peaks, como su nombre lo indica, es útil para esto. Pero es importante entender bien sus parámetros width, threshold, distance y, sobre todo, prominence para conseguir un buen pico de extracción.

    Según mis pruebas y la documentación, el concepto de protagonismo es «el concepto útil» para mantener la buena picos, y descartar el ruido de los picos.

    Lo que es (topográfico) prominencia? Es «la altura mínima necesaria para descender para llegar desde la cumbre más alta del terreno», como se puede ver aquí:

    El pico de encontrar el algoritmo para Python/SciPy

    La idea es:

    La mayor relevancia, el más «importante» el pico es.

    Prueba:

    El pico de encontrar el algoritmo para Python/SciPy

    He utilizado un (ruido) de frecuencia variable en el sinusoide a propósito porque muestra muchas dificultades. Podemos ver que el width parámetro no es muy útil porque si se establece un mínimo width demasiado alta, entonces no será capaz de seguir la pista muy cerca de los picos en las frecuencias altas de la parte. Si establece width demasiado bajo, usted tendría muchos picos no deseados en la parte izquierda de la señal. Mismo problema con distance. threshold sólo se compara con los vecinos directos, que no es útil aquí. prominence es el que da la mejor solución. Tenga en cuenta que puede combinar varios de estos parámetros!

    Código:

    import numpy as np
    import matplotlib.pyplot as plt 
    from scipy.signal import find_peaks
    
    x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15
    peaks, _ = find_peaks(x, distance=20)
    peaks2, _ = find_peaks(x, prominence=1)      # BEST!
    peaks3, _ = find_peaks(x, width=20)
    peaks4, _ = find_peaks(x, threshold=0.4)     # Required vertical distance to its direct neighbouring samples, pretty useless
    plt.subplot(2, 2, 1)
    plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
    plt.subplot(2, 2, 2)
    plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
    plt.subplot(2, 2, 3)
    plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
    plt.subplot(2, 2, 4)
    plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
    plt.show()
    • Esto es lo que yo busco. Pero ¿por casualidad usted conoce alguna aplicación que busca protagonismo en la matriz 2D?
  4. 20

    Hay una función en scipy nombre scipy.signal.find_peaks_cwt que suena es adecuado para sus necesidades, sin embargo no tengo experiencia con ella así que no puedo recomendar..

    http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html

    • Sí, que no existía cuando yo pregunté esto, y todavía no estoy seguro de cómo usarlo
    • Añadido a esto hace un tiempo, pero esto funcionó impresionante. Su uso es simple como el pastel. Acaba de pasar en la matriz, y otra matriz (es decir. np.arange(1,10)) la lista de todas las anchuras de los picos que usted quiere; buen beneficio para filtrar por el flaco o el ancho de los picos si uno necesita. Gracias de nuevo!
  5. 14

    Para aquellos que no están seguros acerca de los cuales el pico de algoritmos de búsqueda a utilizar Python, aquí un rápido resumen de las alternativas: https://github.com/MonsieurV/py-findpeaks

    Querer a mí mismo un equivalente a la de MatLab findpeaks función, me he encontrado con que la detect_peaks función de Marcos Duarte es un buen partido.

    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))

    Que le dará:

    El pico de encontrar el algoritmo para Python/SciPy

    • Desde este post fue escrito, el find_peaks función fue añadida a scipy.
  6. 6

    La detección de picos en el espectro, de forma fiable, se ha estudiado un poco, por ejemplo, todo el trabajo de modelado sinusoidal para la música/las señales de audio en la década de los 80. Buscar «Modelado Sinusoidal» en la literatura.

    Si las señales son tan limpia como en el ejemplo, un simple «me da algo con una amplitud mayor que N vecinos» debería funcionar razonablemente bien. Si usted tiene señales ruidosas, de una manera sencilla pero eficaz es mirar sus picos en el tiempo, para el seguimiento de los mismos: se detectan las líneas espectrales en lugar de picos espectrales. IOW, calcular la FFT en una ventana deslizante de la señal, para obtener un conjunto de espectro en tiempo (también llamado espectrograma). A continuación, busque en la evolución del pico espectral en el tiempo (es decir, en las ventanas consecutivas).

    • Mira picos en el tiempo? Detectar las líneas espectrales? No estoy seguro de lo que esto significa. Es trabajar para que las ondas cuadradas?
    • Oh, usted está hablando sobre el uso de STFT en lugar de FFT. Esta pregunta no es acerca de la Fft, específicamente; eso es sólo un ejemplo. Se trata de encontrar los picos en general 1D o 2D de la matriz.
  7. 1

    Hay estándar de funciones estadísticas y métodos para encontrar los valores extremos de los datos, que es probablemente lo que usted necesita en el primer caso. El uso de derivados de resolver la segunda. No estoy seguro de que para un método que resuelve ambas funciones continuas y datos de muestreo, sin embargo.

  8. 0

    Lo primero es lo primero, la definición de «pico» es vago si, sin más especificaciones. Por ejemplo, para la siguiente serie, iba a 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, usted necesitará por lo menos dos umbrales: 1) un alto umbral, sólo por encima de lo que puede un valor extremo registrarse como un pico; y 2) un umbral bajo para que los valores extremos separados por pequeños valores por debajo de ella se convierte en dos picos.

    De detección de pico es un tema estudiado en la Teoría de valores Extremos de la literatura, también conocido como «declustering de los valores extremos». Sus aplicaciones típicas incluyen la identificación de los eventos de peligro basa en la continua lecturas de variables ambientales, por ejemplo, el análisis de la velocidad del viento para detectar los eventos de la tormenta.

Dejar respuesta

Please enter your comment!
Please enter your name here