Actualización: el algoritmo con mejor rendimiento hasta ahora es este .
Esta pregunta explora algoritmos robustos para detectar picos repentinos en datos de series temporales en tiempo real.
Considere el siguiente conjunto de datos:
p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1, ...
1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3, ...
2.6 4 3 3.2 2 1 1 0.8 4 4 2 2.5 1 1 1];
(Formato Matlab pero no se trata del lenguaje sino del algoritmo)
Puede ver claramente que hay tres picos grandes y algunos picos pequeños. Este conjunto de datos es un ejemplo específico de la clase de conjuntos de datos de series de tiempo sobre los que trata la pregunta. Esta clase de conjuntos de datos tiene dos características generales:
- Hay ruido básico con una media general.
- Hay grandes ' picos ' o ' puntos de datos más altos ' que se desvían significativamente del ruido.
Supongamos también lo siguiente:
- el ancho de los picos no se puede determinar de antemano
- la altura de los picos se desvía clara y significativamente de los otros valores
- el algoritmo utilizado debe calcular en tiempo real (por lo tanto, cambie con cada nuevo punto de datos)
Para tal situación, se debe construir un valor límite que dispare señales. Sin embargo, el valor límite no puede ser estático y debe determinarse en tiempo real en función de un algoritmo.
Mi pregunta: ¿cuál es un buen algoritmo para calcular dichos umbrales en tiempo real? ¿Existen algoritmos específicos para tales situaciones? ¿Cuáles son los algoritmos más conocidos?
Algoritmos robustos o ideas útiles son muy apreciados. (puede responder en cualquier idioma: se trata del algoritmo)
Respuestas:
Robusto algoritmo de detección de picos (usando puntajes z)
Se me ocurrió un algoritmo que funciona muy bien para este tipo de conjuntos de datos. Se basa en el principio de dispersión : si un nuevo punto de datos es un número x dado de desviaciones estándar de una media móvil, el algoritmo señala (también llamado puntaje z ). El algoritmo es muy robusto porque construye una media móvil y una desviación separadas , de modo que las señales no corrompen el umbral. Por lo tanto, las señales futuras se identifican con aproximadamente la misma precisión, independientemente de la cantidad de señales anteriores. El algoritmo toma 3 entradas:
lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
yinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. Por ejemplo, unlag
de 5 usará las últimas 5 observaciones para suavizar los datos. UNAthreshold
de 3.5 indicará si un punto de datos está a 3.5 desviaciones estándar de la media móvil. Y unainfluence
de 0.5 da señales de la mitad de la influencia que tienen los puntos de datos normales. Del mismo modo, uninfluence
0 ignora las señales por completo para volver a calcular el nuevo umbral. Por lo tanto, una influencia de 0 es la opción más robusta (pero supone la estacionariedad ); poner la opción de influencia en 1 es menos robusto. Para datos no estacionarios, la opción de influencia debe colocarse en algún lugar entre 0 y 1.Funciona de la siguiente manera:
Pseudocódigo
Las reglas generales para seleccionar buenos parámetros para sus datos se pueden encontrar a continuación.
Manifestación
El código de Matlab para esta demostración se puede encontrar aquí . Para usar la demostración, simplemente ejecútela y cree una serie temporal usted mismo haciendo clic en el gráfico superior. El algoritmo comienza a funcionar después de dibujar el
lag
número de observaciones.Resultado
Para la pregunta original, este algoritmo dará el siguiente resultado al usar la siguiente configuración
lag = 30, threshold = 5, influence = 0
:Implementaciones en diferentes lenguajes de programación:
Matlab (yo)
R (yo)
Golang (Xeoncross)
Python (R Kiselev)
Python [versión eficiente] (delicada)
Swift (yo)
Groovy (JoshuaCWebDeveloper)
C ++ (brad)
C ++ (Animesh Pandey)
Óxido (mago)
Scala (Mike Roberts)
Kotlin (leoderprofi)
Rubí (Kimmo Lehto)
Fortran [para detección de resonancia] (THo)
Julia (Matt Camp)
C # (lanzamiento aéreo del océano)
C (DavidC)
Java (takanuva15)
JavaScript (Dirk Lüsebrink)
TypeScript (Jerry Gamble)
Perl (Alen)
PHP (radhoo)
Reglas prácticas para configurar el algoritmo
lag
: el parámetro de retraso determina cuánto se suavizarán sus datos y qué tan adaptativo es el algoritmo a los cambios en el promedio a largo plazo de los datos. Cuanto más estacionarios sean sus datos, más retrasos debe incluir (esto debería mejorar la solidez del algoritmo). Si sus datos contienen tendencias que varían con el tiempo, debe considerar qué tan rápido desea que el algoritmo se adapte a estas tendencias. Es decir, si se ponelag
a 10, se necesitan 10 'períodos' antes de que el umbral del algoritmo se ajuste a cualquier cambio sistemático en el promedio a largo plazo. Por lo tanto, elija ellag
parámetro en función del comportamiento de tendencia de sus datos y cuán adaptativo desea que sea el algoritmo.influence
: este parámetro determina la influencia de las señales en el umbral de detección del algoritmo. Si se pone a 0, las señales no tienen influencia en el umbral, de modo que las señales futuras se detectan en función de un umbral que se calcula con una media y una desviación estándar que no está influenciada por las señales pasadas. Otra forma de pensar sobre esto es que si pone la influencia en 0, asume implícitamente la estacionariedad (es decir, no importa cuántas señales haya, la serie temporal siempre vuelve al mismo promedio a largo plazo). Si este no es el caso, debe colocar el parámetro de influencia en algún lugar entre 0 y 1, dependiendo del grado en que las señales puedan influir sistemáticamente en la tendencia de los datos que varía con el tiempo. Por ejemplo, si las señales conducen a una ruptura estructural del promedio a largo plazo de las series de tiempo, el parámetro de influencia debe ponerse alto (cerca de 1) para que el umbral pueda ajustarse a estos cambios rápidamente.threshold
: el parámetro umbral es el número de desviaciones estándar de la media móvil por encima de la cual el algoritmo clasificará un nuevo punto de datos como una señal. Por ejemplo, si un nuevo punto de datos tiene desviaciones estándar de 4.0 por encima de la media móvil y el parámetro de umbral se establece como 3.5, el algoritmo identificará el punto de datos como una señal. Este parámetro debe establecerse en función de cuántas señales espera. Por ejemplo, si sus datos se distribuyen normalmente, un umbral (o: puntaje z) de 3.5 corresponde a una probabilidad de señalización de 0.00047 (de esta tabla), lo que implica que espera una señal cada 2128 puntos de datos (1 / 0.00047). Por lo tanto, el umbral influye directamente en la sensibilidad del algoritmo y, por lo tanto, también con qué frecuencia el algoritmo señala. Examine sus propios datos y determine un umbral sensible que haga que el algoritmo señale cuando lo desee (es posible que se necesite algún tipo de prueba y error aquí para llegar a un buen umbral para su propósito).ADVERTENCIA: El código anterior siempre recorre todos los puntos de datos cada vez que se ejecuta. Al implementar este código, asegúrese de dividir el cálculo de la señal en una función separada (sin el bucle). Luego, cuando llegue un nuevo punto de datos, actualice
filteredY
,avgFilter
ystdFilter
una vez. No vuelva a calcular las señales para todos los datos cada vez que haya un nuevo punto de datos (como en el ejemplo anterior), ¡eso sería extremadamente ineficiente y lento!Otras formas de modificar el algoritmo (para posibles mejoras) son:
influence
parámetro separado para la media y el estándar ( como se hizo en esta traducción rápida )(Conocidas) citas académicas a esta respuesta de StackOverflow:
Yin, C. (2020). Dinucleótido se repite en el genoma del coronavirus SARS-CoV-2: implicaciones evolutivas . ArXiv e-print, accesible desde: https://arxiv.org/pdf/2006.00280.pdf
Esnaola-González, I., Gómez-Omella, M., Ferreiro, S., Fernández, I., Lázaro, I., y García, E. (2020). Una plataforma de IoT hacia la mejora de las cadenas de producción avícola . Sensores, 20 (6), 1549.
Gao, S. y Calderón, DP (2020). Los regímenes continuos de integración cortico-motora calibran los niveles de excitación durante la emergencia de la anestesia . bioRxiv.
Cloud, B., Tarien, B., Liu, A., Shedd, T., Lin, X., Hubbard, M., ... & Moore, JK (2019). Fusión de sensores adaptable basada en teléfonos inteligentes para estimar métricas cinemáticas de remo competitivas . PloS one, 14 (12).
Ceyssens, F., Carmona, MB, Kil, D., Deprez, M., Tooten, E., Nuttin, B., ... y Puers, R. (2019). Grabación neural crónica con sondas de sección transversal subcelular utilizando microagujas de disolución de 0,06 mm² como dispositivo de inserción . Sensores y actuadores B: Chemical , 284, pp. 369-376.
Dons, E., Laeremans, M., Orjuela, JP, Avila-Palencia, I., de Nazelle, A., Nieuwenhuijsen, M., ... & Nawrot, T. (2019). Transporte con mayor probabilidad de causar la exposición máxima a la contaminación del aire en la vida cotidiana: evidencia de más de 2000 días de monitoreo personal . Ambiente atmosférico , 213, 424-432.
Schaible BJ, Snook KR, Yin J., et al. (2019) Conversaciones en Twitter e informes de medios de comunicación en inglés sobre poliomielitis en cinco países diferentes, enero de 2014 a abril de 2015 . The Permanente Journal , 23, 18-181.
Lima, B. (2019). Exploración de la superficie del objeto utilizando la punta del dedo robótica táctil (Tesis doctoral, Université d'Ottawa / University of Ottawa).
Lima, BMR, Ramos, LCS, de Oliveira, TEA, da Fonseca, VP y Petriu, EM (2019). Detección de frecuencia cardiaca mediante un sensor táctil multimodal y una puntuación Z basado en algoritmo de detección de pico . Actas de CMBES , 42.
Lima, BMR, de Oliveira, TEA, da Fonseca, VP, Zhu, Q., Goubran, M., Groza, VZ y Petriu, EM (2019, junio). Detección de frecuencia cardíaca utilizando un sensor táctil multimodal miniaturizado . En 2019 Simposio internacional IEEE sobre mediciones y aplicaciones médicas (MeMeA) (pp. 1-6). IEEE
Ting, C., Field, R., Quach, T., Bauer, T. (2019). Detección de límites generalizada mediante análisis basados en compresión . ICASSP 2019-2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) , Brighton, Reino Unido, pp. 3522-3526.
Portador, EE (2019). Explotar la compresión para resolver sistemas lineales discretos . Tesis doctoral , Universidad de Illinois en Urbana-Champaign.
Khandakar, A., Chowdhury, ME, Ahmed, R., Dhib, A., Mohammed, M., Al-Emadi, NA y Michelson, D. (2019). Sistema portátil para monitorear y controlar el comportamiento del conductor y el uso de un teléfono móvil mientras conduce . Sensores , 19 (7), 1563.
Baskozos, G., Dawes, JM, Austin, JS, Antunes-Martins, A., McDermott, L., Clark, AJ, ... y Orengo, C. (2019). El análisis exhaustivo de la expresión larga de ARN no codificante en el ganglio de la raíz dorsal revela especificidad de tipo celular y desregulación después de una lesión nerviosa . Dolor , 160 (2), 463.
Cloud, B., Tarien, B., Crawford, R. y Moore, J. (2018). Fusión de sensores adaptable basada en teléfonos inteligentes para estimar métricas cinemáticas de remo competitivas . Pregr . engrXiv .
Zajdel, TJ (2018). Interfaces electrónicas para biosensores basados en bacterias . Tesis doctoral , UC Berkeley.
Perkins, P., Heber, S. (2018). Identificación de ribosoma Sitios pausa El uso de una Z-puntuación basada pico algoritmo de detección . IEEE VIII Conferencia Internacional sobre Avances Computacionales en Bio y Ciencias Médicas (ICCABS) , ISBN: 978-1-5386-8520-4.
Moore, J., Goffin, P., Meyer, M., Lundrigan, P., Patwari, N., Sward, K. y Wiese, J. (2018). Gestión de entornos en el hogar a través de la detección, anotación y visualización de datos de calidad del aire . Actas de la ACM sobre tecnologías interactivas, móviles, portátiles y ubicuas , 2 (3), 128.
Lo, O., Buchanan, WJ, Griffiths, P. y Macfarlane, R. (2018), Métodos de medición de distancia para la detección mejorada de amenazas internas , redes de seguridad y comunicación , vol. 2018, ID de artículo 5906368.
Apurupa, NV, Singh, P., Chakravarthy, S. y Buduru, AB (2018). Un estudio crítico de los patrones de consumo de energía en Indian Apartments . Tesis doctoral , IIIT-Delhi.
Scirea, M. (2017). Generación de música afectiva y su efecto en la experiencia del jugador . Tesis doctoral , IT University of Copenhagen, Diseño digital.
Scirea, M., Eklund, P., Togelius, J. y Risi, S. (2017). Primal-improv: hacia la improvisación musical co-evolutiva . Informática e Ingeniería Electrónica (CEEC) , 2017 (pp. 172-177). IEEE
Catalbas, MC, Cegovnik, T., Sodnik, J. y Gulten, A. (2017). Detección de fatiga del conductor basada en movimientos oculares sacádicos , 10ª Conferencia Internacional de Ingeniería Eléctrica y Electrónica (ELECO), págs. 913-917.
Otro trabajo usando el algoritmo
Bernardi, D. (2019). Un estudio de viabilidad sobre el emparejamiento de un reloj inteligente y un dispositivo móvil a través de gestos multimodales . Tesis de maestría , Universidad de Aalto.
Lemmens, E. (2018). Detección de valores atípicos en registros de eventos mediante el uso de métodos estadísticos , Tesis de maestría , Universidad de Eindhoven.
Willems, P. (2017). Ambiente afectivo controlado por el estado de ánimo para los ancianos , Tesis de maestría , Universidad de Twente.
Ciocirdel, GD y Varga, M. (2016). Predicción de elecciones basada en páginas vistas de Wikipedia . Documento de proyecto , Vrije Universiteit Amsterdam.
Otras aplicaciones de este algoritmo
Machine Learning Financial Laboratory , paquete de Python basado en el trabajo de De Prado, ML (2018). Avances en el aprendizaje automático financiero . John Wiley & Sons.
Circuito Adafruit Biblioteca Playground , tablero Adafruit (Adafruit Industries)
Algoritmo de seguimiento de pasos , aplicación de Android (jeeshnair)
Enlaces a otros algoritmos de detección de picos
Si usa esta función en alguna parte, por favor, acreditenme o respondan. Si tiene alguna pregunta sobre este algoritmo, publíquela en los comentarios a continuación o comuníquese conmigo en LinkedIn .
fuente
threshold
gráfico se convierte en una línea verde plana después de un gran pico de hasta 20 en los datos, y se mantiene así para el resto del gráfico ... Si Elimino el sike, esto no sucede, por lo que parece ser causado por el pico en los datos. ¿Alguna idea de lo que podría estar pasando? Soy un novato en Matlab, así que no puedo entenderlo ...Aquí es el
Python
/numpy
la ejecución del algoritmo de puntuación z suavizado (ver respuesta anterior ). Puedes encontrar la esencia aquí .A continuación se muestra la prueba en el mismo conjunto de datos que produce el mismo gráfico que en la respuesta original para
R
/Matlab
fuente
y
es la matriz de datos que pasa,signals
es la matriz de salida+1
o-1
que indica para cada punto de datosy[i]
si ese punto de datos es un "pico significativo" dada la configuración que utiliza.Un enfoque es detectar picos basados en la siguiente observación:
Evita falsos positivos al esperar hasta que termine la tendencia alcista. No es exactamente "en tiempo real" en el sentido de que perderá el pico en un dt. La sensibilidad se puede controlar al requerir un margen de comparación. Existe una compensación entre la detección ruidosa y el tiempo de demora de la detección. Puede enriquecer el modelo agregando más parámetros:
donde dt y m son parámetros a la sensibilidad del control vs tiempo de retardo
Esto es lo que obtienes con el algoritmo mencionado:
Aquí está el código para reproducir la trama en Python:
Al configurar
m = 0.5
, puede obtener una señal más limpia con solo un falso positivo:fuente
En el procesamiento de señales, la detección de picos a menudo se realiza mediante la transformación wavelet. Básicamente, realiza una transformación wavelet discreta en los datos de su serie temporal. Los cruces por cero en los coeficientes de detalle que se devuelven corresponderán a los picos en la señal de la serie de tiempo. Obtiene diferentes amplitudes de pico detectadas en diferentes niveles de coeficiente de detalle, lo que le brinda una resolución de niveles múltiples.
fuente
Intentamos usar el algoritmo de puntuación z suavizado en nuestro conjunto de datos, lo que resulta en hipersensibilidad o infrasensibilidad (dependiendo de cómo se sintonicen los parámetros), con poco punto medio. En la señal de tráfico de nuestro sitio, hemos observado una línea de base de baja frecuencia que representa el ciclo diario e incluso con los mejores parámetros posibles (que se muestran a continuación), aún se desvaneció especialmente en el cuarto día porque la mayoría de los puntos de datos se reconocen como anomalías .
Partiendo del algoritmo original de puntuación z, encontramos una manera de resolver este problema mediante el filtrado inverso. Los detalles del algoritmo modificado y su aplicación en la atribución de tráfico comercial de televisión se publican en el blog de nuestro equipo .
fuente
En la topología computacional, la idea de homología persistente conduce a una solución eficiente, rápida como la clasificación de números. No solo detecta picos, sino que cuantifica la "importancia" de los picos de una manera natural que le permite seleccionar los picos que son significativos para usted.
Resumen de algoritmo. En un entorno unidimensional (serie temporal, señal de valor real), el algoritmo se puede describir fácilmente mediante la siguiente figura:
Piense en el gráfico de funciones (o su conjunto de subniveles) como un paisaje y considere un nivel de agua decreciente que comienza en el nivel infinito (o 1.8 en esta imagen). Mientras el nivel disminuye, en las islas máximas locales aparecen. En los mínimos locales, estas islas se fusionan. Un detalle en esta idea es que la isla que apareció más tarde se fusionó con la isla que es más antigua. La "persistencia" de una isla es su tiempo de nacimiento menos su tiempo de muerte. Las longitudes de las barras azules representan la persistencia, que es el "significado" mencionado anteriormente de un pico.
Eficiencia. No es demasiado difícil encontrar una implementación que se ejecute en tiempo lineal, de hecho es un ciclo simple y simple, después de que se ordenaron los valores de la función. Por lo tanto, esta implementación debe ser rápida en la práctica y también se implementa fácilmente.
Referencias Aquí se puede encontrar una reseña de toda la historia y referencias a la motivación de la homología persistente (un campo en topología algebraica computacional): https://www.sthu.org/blog/13-perstopology-peakdetection/index.html
fuente
Encontré otro algoritmo por GH Palshikar en Algoritmos simples para la detección de picos en series temporales .
El algoritmo es así:
Ventajas
Desventajas
k
y deh
antemanoEjemplo:
fuente
Aquí hay una implementación del algoritmo Smoothed z-score (arriba) en Golang. Asume una porción de
[]int16
(muestras PCM de 16 bits). Puedes encontrar una idea general aquí .fuente
Aquí hay una implementación en C ++ del algoritmo de puntuación z suavizado de esta respuesta
fuente
Este problema es similar al que encontré en un curso de sistemas híbridos / integrados, pero que estaba relacionado con la detección de fallas cuando la entrada de un sensor es ruidosa. Usamos un filtro de Kalman para estimar / predecir el estado oculto del sistema, luego utilizamos análisis estadísticos para determinar la probabilidad de que ocurriera una falla . Estábamos trabajando con sistemas lineales, pero existen variantes no lineales. Recuerdo que el enfoque era sorprendentemente adaptable, pero requería un modelo de la dinámica del sistema.
fuente
Implementación de C ++
fuente
Siguiendo con la solución propuesta de @ Jean-Paul, he implementado su algoritmo en C #
Ejemplo de uso:
fuente
Aquí hay una implementación en C de la puntuación Z suavizada de @ Jean-Paul para el microcontrolador Arduino que se usa para tomar lecturas del acelerómetro y decidir si la dirección del impacto proviene de la izquierda o la derecha. Esto funciona muy bien ya que este dispositivo devuelve una señal de rebote. Aquí está esta entrada a este algoritmo de detección de picos desde el dispositivo, que muestra un impacto desde la derecha seguido de un impacto desde la izquierda. Puede ver el pico inicial y luego la oscilación del sensor.
El suyo es el resultado con influencia = 0
No es genial pero aquí con influencia = 1
lo cual es muy bueno
fuente
Aquí hay una implementación real de Java basada en la respuesta Groovy publicada anteriormente. (Sé que ya se han publicado implementaciones de Groovy y Kotlin, pero para alguien como yo que solo ha hecho Java, es una verdadera molestia descubrir cómo convertir entre otros idiomas y Java).
(Los resultados coinciden con los gráficos de otras personas)
Implementación de algoritmo
Método principal
Resultados
fuente
Apéndice 1 a la respuesta original:
Matlab
yR
traduccionesCódigo Matlab
Ejemplo:
Código R
Ejemplo:
Este código (ambos idiomas) arrojará el siguiente resultado para los datos de la pregunta original:
Apéndice 2 a la respuesta original:
Matlab
código de demostración(haga clic para crear datos)
fuente
Aquí está mi intento de crear una solución Ruby para el "Algo de puntuación z suavizado" a partir de la respuesta aceptada:
Y ejemplo de uso:
fuente
Una versión iterativa en python / numpy para la respuesta https://stackoverflow.com/a/22640362/6029703 está aquí. Este código es más rápido que el promedio computacional y la desviación estándar cada retraso para datos grandes (más de 100000).
fuente
Pensé que proporcionaría mi implementación de Julia del algoritmo para otros. La esencia se puede encontrar aquí
fuente
Aquí hay una implementación Groovy (Java) del algoritmo de puntuación z suavizado ( ver la respuesta anterior ).
A continuación se muestra una prueba en el mismo conjunto de datos que produce los mismos resultados que la implementación anterior de Python / numpy .
fuente
Aquí hay una versión Scala (no idiomática) del algoritmo de puntuación z suavizado :
Aquí hay una prueba que devuelve los mismos resultados que las versiones de Python y Groovy:
Gist aquí
fuente
Necesitaba algo como esto en mi proyecto de Android. Pensé que podría devolver la implementación de Kotlin .
Un proyecto de muestra con gráficos de verificación se puede encontrar en github .
fuente
Aquí hay una versión Fortran alterada del algoritmo z-score . Se altera específicamente para la detección de picos (resonancia) en las funciones de transferencia en el espacio de frecuencia (cada cambio tiene un pequeño comentario en el código).
La primera modificación da una advertencia al usuario si hay una resonancia cerca del límite inferior del vector de entrada, indicado por una desviación estándar superior a un cierto umbral (10% en este caso). Esto simplemente significa que la señal no es lo suficientemente plana para que la detección inicialice los filtros correctamente.
La segunda modificación es que solo el valor más alto de un pico se agrega a los picos encontrados. Esto se alcanza al comparar cada valor pico encontrado con la magnitud de sus predecesores (rezagados) y sus sucesores (rezagados).
El tercer cambio es respetar que los picos de resonancia usualmente muestran alguna forma de simetría alrededor de la frecuencia de resonancia. Por lo tanto, es natural calcular la media y el estándar de forma simétrica alrededor del punto de datos actual (en lugar de solo para los predecesores). Esto da como resultado un mejor comportamiento de detección de picos.
Las modificaciones tienen el efecto de que toda la señal debe ser conocida de antemano por la función, que es el caso habitual para la detección de resonancia (algo así como el ejemplo de Matlab de Jean-Paul donde los puntos de datos se generan sobre la marcha no funcionará).
¡Para mi aplicación, el algoritmo funciona de maravilla!
fuente
Si tiene sus datos en una tabla de base de datos, aquí hay una versión SQL de un algoritmo simple de puntaje z:
fuente
Versión de Python que funciona con transmisiones en tiempo real (no recalcula todos los puntos de datos a la llegada de cada nuevo punto de datos). Es posible que desee ajustar lo que devuelve la función de clase; para mis propósitos, solo necesitaba las señales.
fuente
Me permití crear una versión de JavaScript. ¿Podría ser útil? El javascript debe ser la transcripción directa del pseudocódigo dado anteriormente. Disponible como paquete npm y repositorio github:
Traducción Javascript:
fuente
Si el valor límite u otros criterios dependen de valores futuros, entonces la única solución (sin una máquina del tiempo u otro conocimiento de valores futuros) es retrasar cualquier decisión hasta que uno tenga suficientes valores futuros. Si desea un nivel superior a una media que abarque, por ejemplo, 20 puntos, debe esperar hasta que tenga al menos 19 puntos por delante de cualquier decisión máxima, de lo contrario, el siguiente nuevo punto podría perder completamente su umbral hace 19 puntos .
Su trama actual no tiene picos ... a menos que sepa de antemano que el siguiente punto no es 1e99, que después de reescalar la dimensión Y de su trama, sería plano hasta ese punto.
fuente
.. As large as in the picture
Quise decir: para situaciones similares donde hay picos significativos y ruido básico.Y aquí viene la implementación PHP del ZSCORE algo:
fuente
($len - 1)
lugar de$len
enstddev()
En lugar de comparar un máximo con la media, también se pueden comparar los máximos con los mínimos adyacentes donde los mínimos solo se definen por encima de un umbral de ruido. Si el máximo local es> 3 veces (u otro factor de confianza) cualquiera de los mínimos adyacentes, entonces ese máximo es un pico. La determinación del pico es más precisa con ventanas móviles más anchas. Lo anterior usa un cálculo centrado en el medio de la ventana, por cierto, en lugar de un cálculo al final de la ventana (== retraso).
Tenga en cuenta que un máximo debe verse como un aumento de la señal antes y una disminución después.
fuente
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:
fuente
Versión orientada a objetos del algoritmo z-score usando Mordern C +++
fuente
filtered_signal
,signal
,avg_filtered
ystd_filtered
como variables privadas y sólo actualiza las matrices una vez cuando un nuevo punto de datos (llega ahora los bucles de código más de todos los puntos de datos cada vez que se llama). Eso mejoraría el rendimiento de su código y se adapta aún mejor a la estructura de OOP.