Mise à jour: L'algorithme le plus performant jusqu'à présent est celui-ci .
Cette question explore des algorithmes robustes pour détecter les pics soudains dans les données de série temporelle en temps réel.
Considérez l'ensemble de données suivant:
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];
(Format Matlab mais ce n'est pas la langue mais l'algorithme)
Vous pouvez clairement voir qu'il y a trois grands pics et quelques petits pics. Cet ensemble de données est un exemple spécifique de la classe d'ensembles de données série temporelle sur laquelle porte la question. Cette classe d'ensembles de données présente deux caractéristiques générales:
- Il y a un bruit de base avec une moyenne générale
- Il existe de grands « pics » ou « points de données plus élevés » qui s'écartent considérablement du bruit.
Supposons également ce qui suit:
- la largeur des pics ne peut pas être déterminée à l'avance
- la hauteur des pics s'écarte clairement et significativement des autres valeurs
- l'algorithme utilisé doit calculer en temps réel (changez donc à chaque nouveau point de données)
Pour une telle situation, une valeur limite doit être construite qui déclenche des signaux. Cependant, la valeur limite ne peut pas être statique et doit être déterminée en temps réel sur la base d'un algorithme.
Ma question: quel est un bon algorithme pour calculer de tels seuils en temps réel? Existe-t-il des algorithmes spécifiques pour de telles situations? Quels sont les algorithmes les plus connus?
Des algorithmes robustes ou des informations utiles sont tous très appréciés. (peut répondre dans n'importe quelle langue: il s'agit de l'algorithme)
Réponses:
Algorithme de détection de pic robuste (utilisant les z-scores)
J'ai trouvé un algorithme qui fonctionne très bien pour ces types de jeux de données. Il est basé sur le principe de la dispersion : si un nouveau point de donnée est un nombre x donné d'écarts-types à l'écart d'une moyenne mobile, l'algorithme signale (également appelé z-score ). L'algorithme est très robuste car il construit une moyenne et une déviation mobiles distinctes , de sorte que les signaux ne corrompent pas le seuil. Les signaux futurs sont donc identifiés avec approximativement la même précision, quelle que soit la quantité de signaux précédents. L'algorithme prend 3 entrées:
lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
etinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. Par exemple, unlag
sur 5 utilisera les 5 dernières observations pour lisser les données. UNEthreshold
de 3,5 signalera si un point de données est à 3,5 écarts-types de la moyenne mobile. Et une valeurinfluence
de 0,5 donne aux signaux la moitié de l'influence des points de données normaux. De même, uninfluence
de 0 ignore complètement les signaux pour recalculer le nouveau seuil. Une influence de 0 est donc l'option la plus robuste (mais suppose une stationnarité ); mettre l'option d'influence à 1 est moins robuste. Pour les données non stationnaires, l'option d'influence doit donc être placée quelque part entre 0 et 1.Cela fonctionne comme suit:
Pseudocode
Vous trouverez ci-dessous des règles générales pour sélectionner de bons paramètres pour vos données.
Démo
Le code Matlab pour cette démo peut être trouvé ici . Pour utiliser la démo, il suffit de l'exécuter et de créer vous-même une série chronologique en cliquant sur le graphique supérieur. L'algorithme commence à fonctionner après avoir tracé le
lag
nombre d'observations.Résultat
Pour la question d'origine, cet algorithme donnera la sortie suivante lors de l'utilisation des paramètres suivants
lag = 30, threshold = 5, influence = 0
::Implémentations dans différents langages de programmation:
Matlab (moi)
R (moi)
Golang (Xeoncross)
Python (R Kiselev)
Python [version efficace] (delica)
Swift (moi)
Groovy (JoshuaCWebDeveloper)
C ++ (brad)
C ++ (Animesh Pandey)
Rouille (magicien)
Scala (Mike Roberts)
Kotlin (leoderprofi)
Rubis (Kimmo Lehto)
Fortran [pour la détection de résonance] (THo)
Julia (Matt Camp)
C # (Ocean Airdrop)
C (DavidC)
Java (takanuva15)
JavaScript (Dirk Lüsebrink)
TypeScript (Jerry Gamble)
Perl (Alen)
PHP (radhoo)
Règles générales pour configurer l'algorithme
lag
: le paramètre de décalage détermine le niveau de lissage de vos données et l'adaptation de l'algorithme aux changements de la moyenne à long terme des données. Plus vos données sont stationnaires , plus vous devez inclure de retards (cela devrait améliorer la robustesse de l'algorithme). Si vos données contiennent des tendances variant dans le temps, vous devez considérer la vitesse à laquelle vous souhaitez que l'algorithme s'adapte à ces tendances. Autrement dit, si vous mettezlag
à 10, il faut 10 «périodes» avant que le seuil de l'algorithme ne soit ajusté à tout changement systématique de la moyenne à long terme. Choisissez donc lelag
paramètre en fonction du comportement de tendance de vos données et de l'adaptation que vous souhaitez que l'algorithme soit.influence
: ce paramètre détermine l'influence des signaux sur le seuil de détection de l'algorithme. Si mis à 0, les signaux n'ont aucune influence sur le seuil, de sorte que les signaux futurs sont détectés sur la base d'un seuil calculé avec une moyenne et un écart type qui ne sont pas influencés par les signaux passés. Une autre façon de penser à cela est que si vous mettez l'influence à 0, vous supposez implicitement la stationnarité (c'est-à-dire quel que soit le nombre de signaux, la série temporelle revient toujours à la même moyenne sur le long terme). Si ce n'est pas le cas, vous devez placer le paramètre d'influence quelque part entre 0 et 1, selon la mesure dans laquelle les signaux peuvent systématiquement influencer la tendance variant dans le temps des données. Par exemple, si les signaux entraînent une rupture structurelle de la moyenne à long terme de la série chronologique, le paramètre d'influence doit être élevé (près de 1) afin que le seuil puisse s'adapter rapidement à ces changements.threshold
: le paramètre seuil est le nombre d'écarts-types par rapport à la moyenne mobile au-dessus desquels l'algorithme classera un nouveau point de donnée comme étant un signal. Par exemple, si un nouveau point de données est à 4,0 écarts-types au-dessus de la moyenne mobile et que le paramètre de seuil est défini sur 3,5, l'algorithme identifiera le point de données comme un signal. Ce paramètre doit être défini en fonction du nombre de signaux que vous attendez. Par exemple, si vos données sont normalement distribuées, un seuil (ou: z-score) de 3,5 correspond à une probabilité de signalisation de 0,00047 (à partir de ce tableau), ce qui implique que vous attendez un signal tous les 2128 points de données (1 / 0,00047). Le seuil influence donc directement la sensibilité de l'algorithme et donc aussi la fréquence des signaux de l'algorithme. Examinez vos propres données et déterminez un seuil raisonnable qui émet l'algorithme lorsque vous le souhaitez (certains essais et erreurs peuvent être nécessaires ici pour atteindre un bon seuil pour votre objectif).AVERTISSEMENT: le code ci-dessus boucle toujours sur tous les points de données à chaque exécution. Lors de la mise en œuvre de ce code, assurez-vous de diviser le calcul du signal en une fonction distincte (sans la boucle). Puis , quand une nouvelle arrive du point de données, mise à jour
filteredY
,avgFilter
etstdFilter
une fois. Ne recalculez pas les signaux pour toutes les données chaque fois qu'il y a un nouveau point de données (comme dans l'exemple ci-dessus), ce serait extrêmement inefficace et lent!D'autres façons de modifier l'algorithme (pour des améliorations potentielles) sont:
influence
paramètre séparé pour la moyenne et la std ( comme cela est fait dans cette traduction Swift )Citations académiques (connues) de cette réponse StackOverflow:
Yin, C. (2020). Répétition de dinucléotides dans le génome du coronavirus SARS-CoV-2: implications évolutives . ArXiv e-print, accessible depuis: https://arxiv.org/pdf/2006.00280.pdf
Esnaola-Gonzalez, I., Gómez-Omella, M., Ferreiro, S., Fernandez, I., Lázaro, I., et García, E. (2020). Une plateforme IoT vers l'amélioration des chaînes de production avicole . Capteurs, 20 (6), 1549.
Gao, S. et Calderon, DP (2020). Les régimes continus d'intégration cortico-motrice calibrent les niveaux d'excitation pendant la sortie de l'anesthésie . bioRxiv.
Cloud, B., Tarien, B., Liu, A., Shedd, T., Lin, X., Hubbard, M., ... & Moore, JK (2019). Fusion de capteurs adaptative sur smartphone pour estimer les métriques cinématiques compétitives de l'aviron . PloS one, 14 (12).
Ceyssens, F., Carmona, MB, Kil, D., Deprez, M., Tooten, E., Nuttin, B., ... & Puers, R. (2019). Enregistrement neuronal chronique avec des sondes de section subcellulaire utilisant des microaiguilles à dissolution de 0,06 mm² comme dispositif d'insertion . Sensors and Actuators B: Chemical , 284, p. 369-376.
Dons, E., Laeremans, M., Orjuela, JP, Avila-Palencia, I., de Nazelle, A., Nieuwenhuijsen, M., ... & Nawrot, T. (2019). Les transports les plus susceptibles de provoquer des pics d'exposition à la pollution atmosphérique dans la vie de tous les jours: preuves de plus de 2000 jours de surveillance personnelle . Environnement atmosphérique , 213, 424-432.
Schaible BJ, Snook KR, Yin J., et al. (2019). Conversations Twitter et reportages en anglais sur la poliomyélite dans cinq pays différents, janvier 2014 à avril 2015 . The Permanente Journal , 23, 18-181.
Lima, B. (2019). Exploration de la surface d'un objet à l'aide d'un doigt robotique activé par le toucher (thèse de doctorat, Université d'Ottawa / Université d'Ottawa).
Lima, BMR, Ramos, LCS, de Oliveira, TEA, da Fonseca, VP et Petriu, EM (2019). Détection de fréquence cardiaque L' utilisation d' un capteur tactile et un Multimodal Z-score basé crête algorithme de détection . Actes du CMBES , 42.
Lima, BMR, de Oliveira, TEA, da Fonseca, VP, Zhu, Q., Goubran, M., Groza, VZ, & Petriu, EM (2019, juin). Détection de la fréquence cardiaque à l'aide d'un capteur tactile multimodal miniaturisé . En 2019 IEEE International Symposium on Medical Measurements and Applications (MeMeA) (pp. 1-6). IEEE.
Ting, C., Field, R., Quach, T., Bauer, T. (2019). Détection généralisée des limites à l'aide d'analyses basées sur la compression . ICASSP 2019-2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) , Brighton, Royaume-Uni, pp. 3522-3526.
Carrier, EE (2019). Exploiter la compression dans la résolution de systèmes linéaires discrétisés . Thèse de doctorat , Université de l'Illinois à Urbana-Champaign.
Khandakar, A., Chowdhury, ME, Ahmed, R., Dhib, A., Mohammed, M., Al-Emadi, NA, et Michelson, D. (2019). Système portable pour surveiller et contrôler le comportement du conducteur et l'utilisation d'un téléphone portable pendant la conduite . Capteurs , 19 (7), 1563.
Baskozos, G., Dawes, JM, Austin, JS, Antunes-Martins, A., McDermott, L., Clark, AJ, ... & Orengo, C. (2019). Une analyse complète de l'expression longue d'ARN non codant dans le ganglion de la racine dorsale révèle une spécificité de type cellulaire et une dérégulation après une lésion nerveuse . Douleur , 160 (2), 463.
Cloud, B., Tarien, B., Crawford, R., et Moore, J. (2018). Fusion de capteurs adaptative sur smartphone pour estimer les métriques cinématiques compétitives de l'aviron . Préimpressions engrXiv .
Zajdel, TJ (2018). Interfaces électroniques pour la biodétection basée sur les bactéries . Thèse de doctorat , UC Berkeley.
Perkins, P., Heber, S. (2018). Identification des ribosome Pause sites à l' aide d' un Z-score basée sur l' algorithme de détection de crête . IEEE 8th International Conference on Computational Advances in Bio and Medical Sciences (ICCABS) , ISBN: 978-1-5386-8520-4.
Moore, J., Goffin, P., Meyer, M., Lundrigan, P., Patwari, N., Sward, K., et Wiese, J. (2018). Gestion des environnements à domicile grâce à la détection, l'annotation et la visualisation des données sur la qualité de l'air . Actes de l'ACM sur les technologies interactives, mobiles, portables et ubiquitaires , 2 (3), 128.
Lo, O., Buchanan, WJ, Griffiths, P., et Macfarlane, R. (2018), Méthodes de mesure de la distance pour une meilleure détection des menaces internes , réseaux de sécurité et de communication , vol. 2018, article ID 5906368.
Apurupa, NV, Singh, P., Chakravarthy, S., et Buduru, AB (2018). Une étude critique des modèles de consommation d'énergie dans les appartements indiens . Thèse de doctorat , IIIT-Delhi.
Scirea, M. (2017). Génération de musique affective et son effet sur l'expérience du joueur . Thèse de doctorat , IT University of Copenhagen, Digital Design.
Scirea, M., Eklund, P., Togelius, J., & Risi, S. (2017). Primal-improv: Vers une improvisation musicale co-évolutive . Informatique et génie électronique (PECO) , 2017 (pp.172-177). IEEE.
Catalbas, MC, Cegovnik, T., Sodnik, J. et Gulten, A. (2017). Détection de fatigue du conducteur basée sur les mouvements oculaires saccadés , 10e Conférence internationale sur l'ingénierie électrique et électronique (ELECO), pp. 913-917.
Autres travaux utilisant l'algorithme
Bernardi, D. (2019). Une étude de faisabilité sur l'association d'une smartwatch et d'un appareil mobile via des gestes multimodaux . Mémoire de maîtrise , Université Aalto.
Lemmens, E. (2018). Détection des valeurs aberrantes dans les journaux d'événements à l'aide de méthodes statistiques , mémoire de maîtrise , Université d'Eindhoven.
Willems, P. (2017). Ambiances affectives contrôlées par l'humeur pour les personnes âgées , mémoire de maîtrise , Université de Twente.
Ciocirdel, GD et Varga, M. (2016). Prédiction électorale basée sur les pages vues de Wikipedia . Document de projet , Vrije Universiteit Amsterdam.
Autres applications de cet algorithme
Machine Learning Financial Laboratory , package Python basé sur les travaux de De Prado, ML (2018). Progrès dans l'apprentissage automatique financier . John Wiley & Sons.
Adafruit CircuitPlayground Library , Adafruit board (Adafruit Industries)
Algorithme de suivi des étapes , application Android (jeeshnair)
Liens vers d'autres algorithmes de détection des pics
Si vous utilisez cette fonction quelque part, merci de me créditer cette réponse. Si vous avez des questions concernant cet algorithme, postez-les dans les commentaires ci-dessous ou contactez-moi sur LinkedIn .
la source
threshold
graphique devient juste une ligne verte plate après un gros pic jusqu'à 20 dans les données, et il reste comme ça pour le reste du graphique ... Si J'enlève le sike, cela ne se produit pas, il semble donc être causé par le pic des données. Une idée de ce qui pourrait se passer? Je suis un débutant à Matlab, donc je ne peux pas le comprendre ...Voici l' implémentation
Python
/numpy
de l'algorithme de z-score lissé (voir réponse ci-dessus ). Vous pouvez trouver l' essentiel ici .Ci-dessous, le test sur le même ensemble de données qui donne le même tracé que dans la réponse d'origine pour
R
/Matlab
la source
y
est le tableau de données que vous passez,signals
est le+1
ou-1
tableau de sortie qui indiquent pour chaque point de donnéesy[i]
que ce point de données est un « pic significatif » étant donné les paramètres que vous utilisez.Une approche consiste à détecter les pics sur la base de l'observation suivante:
Il évite les faux positifs en attendant la fin de la tendance haussière. Ce n'est pas exactement "en temps réel" dans le sens où il manquera le pic d'un dt. la sensibilité peut être contrôlée en exigeant une marge de comparaison. Il existe un compromis entre la détection bruyante et le délai de détection. Vous pouvez enrichir le modèle en ajoutant plus de paramètres:
où dt et m sont des paramètres pour contrôler la sensibilité par rapport à la temporisation
Voici ce que vous obtenez avec l'algorithme mentionné:
voici le code pour reproduire l'intrigue en python:
En réglant
m = 0.5
, vous pouvez obtenir un signal plus propre avec un seul faux positif:la source
Dans le traitement du signal, la détection des pics se fait souvent par transformée en ondelettes. Vous effectuez essentiellement une transformation en ondelettes discrète sur vos données de série chronologique. Les passages par zéro dans les coefficients de détail renvoyés correspondront à des pics dans le signal de série temporelle. Vous obtenez différentes amplitudes de crête détectées à différents niveaux de coefficient de détail, ce qui vous donne une résolution à plusieurs niveaux.
la source
Nous avons tenté d'utiliser l'algorithme de score z lissé sur notre jeu de données, ce qui entraîne une sur-sensibilité ou une sous-sensibilité (selon la façon dont les paramètres sont réglés), avec peu de compromis. Dans le signal de trafic de notre site, nous avons observé une ligne de base à basse fréquence qui représente le cycle quotidien et même avec les meilleurs paramètres possibles (indiqués ci-dessous), elle s'est toujours interrompue surtout le 4ème jour car la plupart des points de données sont reconnus comme anomalie .
En s'appuyant sur l'algorithme d'origine du score z, nous avons trouvé un moyen de résoudre ce problème en filtrant à l'envers. Les détails de l'algorithme modifié et son application sur l'attribution du trafic commercial TV sont publiés sur notre blog d'équipe .
la source
En topologie informatique, l'idée d'une homologie persistante conduit à une solution efficace - rapide comme le tri des nombres -. Il ne détecte pas seulement les pics, il quantifie la «signification» des pics d'une manière naturelle qui vous permet de sélectionner les pics qui sont importants pour vous.
Résumé de l'algorithme. Dans un cadre à une dimension (série chronologique, signal à valeur réelle), l'algorithme peut être facilement décrit par la figure suivante:
Considérez le graphique de fonction (ou son ensemble de sous-niveaux) comme un paysage et envisagez une baisse du niveau d'eau à partir du niveau infini (ou 1,8 sur cette image). Alors que le niveau diminue, des maxima locaux apparaissent. Aux minima locaux, ces îles fusionnent. Un détail de cette idée est que l'île qui est apparue plus tard dans le temps est fusionnée avec l'île qui est plus ancienne. La "persistance" d'une île est son heure de naissance moins son heure de mort. Les longueurs des barres bleues représentent la persistance, qui est la «signification» mentionnée ci-dessus d'un pic.
Efficacité. Il n'est pas trop difficile de trouver une implémentation qui s'exécute en temps linéaire - en fait, c'est une boucle simple et simple - après le tri des valeurs de fonction. Cette implémentation doit donc être rapide dans la pratique et facilement implémentée également.
Références. Une synthèse de toute l'histoire et des références à la motivation de l'homologie persistante (un domaine de la topologie algébrique informatique) peut être trouvée ici: https://www.sthu.org/blog/13-perstopology-peakdetection/index.html
la source
Trouvé un autre algorithme de GH Palshikar dans Simple Algorithms for Peak Detection in Time-Series .
L'algorithme va comme ceci:
Les avantages
Désavantages
k
et à l'h
avanceExemple:
la source
Voici une implémentation de l'algorithme Smoothed z-score (ci-dessus) à Golang. Il suppose une tranche de
[]int16
(échantillons PCM 16 bits). Vous pouvez trouver un résumé ici .la source
Voici une implémentation C ++ de l'algorithme de score z lissé de cette réponse
la source
Ce problème ressemble à celui que j'ai rencontré dans un cours sur les systèmes hybrides / embarqués, mais qui était lié à la détection de défauts lorsque l'entrée d'un capteur est bruyante. Nous avons utilisé un filtre de Kalman pour estimer / prédire l'état caché du système, puis avons utilisé une analyse statistique pour déterminer la probabilité qu'un défaut se soit produit . Nous travaillions avec des systèmes linéaires, mais des variantes non linéaires existent. Je me souviens que l'approche était étonnamment adaptative, mais elle nécessitait un modèle de la dynamique du système.
la source
Implémentation C ++
la source
Dans la continuité de la solution proposée par @ Jean-Paul, j'ai implémenté son algorithme en C #
Exemple d'utilisation:
la source
Voici une implémentation C du Smoothed Z-score de @ Jean-Paul pour le microcontrôleur Arduino utilisé pour prendre des mesures d'accéléromètre et décider si la direction d'un impact est venue de la gauche ou de la droite. Cela fonctionne très bien car cet appareil renvoie un signal rebondi. Voici cette entrée pour cet algorithme de détection des pics de l'appareil - montrant un impact de la droite suivi d'un impact de la gauche. Vous pouvez voir le pic initial puis l'oscillation du capteur.
Son résultat avec influence = 0
Pas génial mais ici avec influence = 1
ce qui est très bon.
la source
Voici une implémentation Java réelle basée sur la réponse Groovy publiée précédemment. (Je sais qu'il y a déjà des implémentations Groovy et Kotlin publiées, mais pour quelqu'un comme moi qui n'a fait que Java, c'est un vrai tracas de comprendre comment convertir entre d'autres langages et Java).
(Les résultats correspondent aux graphiques d'autres personnes)
Implémentation d'algorithme
Méthode principale
Résultats
la source
Annexe 1 à la réponse originale:
Matlab
etR
traductionsCode Matlab
Exemple:
Code R
Exemple:
Ce code (les deux langues) donnera le résultat suivant pour les données de la question d'origine:
Annexe 2 à la réponse originale:
Matlab
code de démonstration(cliquez pour créer des données)
la source
Voici ma tentative de création d'une solution Ruby pour le "Algo z-score lissé" à partir de la réponse acceptée:
Et exemple d'utilisation:
la source
Une version itérative en python / numpy pour la réponse https://stackoverflow.com/a/22640362/6029703 est ici. Ce code est plus rapide que la moyenne informatique et l'écart type à chaque décalage pour les données volumineuses (100000+).
la source
Je pensais que je fournirais mon implémentation Julia de l'algorithme pour les autres. L'essentiel peut être trouvé ici
la source
Voici une implémentation Groovy (Java) de l'algorithme de score z lissé ( voir la réponse ci-dessus ).
Vous trouverez ci-dessous un test sur le même ensemble de données qui donne les mêmes résultats que l' implémentation Python / numpy ci - dessus .
la source
Voici une version Scala (non idiomatique) de l' algorithme de score z lissé :
Voici un test qui renvoie les mêmes résultats que les versions Python et Groovy:
Gist here
la source
J'avais besoin de quelque chose comme ça dans mon projet Android. J'ai pensé que je pourrais rendre l' implémentation de Kotlin .
un exemple de projet avec des graphiques de vérification peut être trouvé sur github .
la source
Voici une version modifiée de Fortran de l'algorithme z-score . Il est modifié spécifiquement pour la détection de crête (résonance) dans les fonctions de transfert dans l'espace des fréquences (chaque changement a un petit commentaire dans le code).
La première modification donne un avertissement à l'utilisateur s'il y a une résonance près de la limite inférieure du vecteur d'entrée, indiquée par un écart-type supérieur à un certain seuil (10% dans ce cas). Cela signifie simplement que le signal n'est pas suffisamment plat pour que la détection initialise correctement les filtres.
La deuxième modification est que seule la valeur la plus élevée d'un pic est ajoutée aux pics trouvés. Ceci est atteint en comparant chaque valeur de crête trouvée à la magnitude de ses prédécesseurs (décalés) et de ses successeurs (décalés).
Le troisième changement consiste à respecter le fait que les pics de résonance montrent généralement une certaine forme de symétrie autour de la fréquence de résonance. Il est donc naturel de calculer la moyenne et la std symétriquement autour du point de données actuel (plutôt que juste pour les prédécesseurs). Il en résulte un meilleur comportement de détection des pics.
Les modifications ont pour effet que l'ensemble du signal doit être connu de la fonction au préalable, ce qui est le cas habituel pour la détection de résonance (quelque chose comme l'exemple Matlab de Jean-Paul où les points de données sont générés à la volée ne fonctionnera pas).
Pour mon application, l'algorithme fonctionne comme un charme!
la source
Si vous avez vos données dans une table de base de données, voici une version SQL d'un simple algorithme z-score:
la source
Version Python qui fonctionne avec les flux en temps réel (ne recalcule pas tous les points de données à l'arrivée de chaque nouveau point de données). Vous voudrez peut-être modifier ce que la fonction de classe renvoie - pour mes besoins, j'avais juste besoin des signaux.
la source
Je me suis permis d'en créer une version javascript. Cela pourrait-il être utile. Le javascript doit être la transcription directe du pseudocode donné ci-dessus. Disponible en tant que package npm et repo github:
Traduction Javascript:
la source
Si la valeur limite ou d'autres critères dépendent des valeurs futures, alors la seule solution (sans machine à remonter le temps ou autre connaissance des valeurs futures) est de retarder toute décision jusqu'à ce que l'on ait suffisamment de valeurs futures. Si vous voulez un niveau supérieur à une moyenne qui s'étend sur, par exemple, 20 points, alors vous devez attendre d'avoir au moins 19 points d'avance sur toute décision de pointe, sinon le nouveau nouveau point pourrait complètement abaisser votre seuil il y a 19 points .
Votre tracé actuel n'a pas de pics ... à moins que vous ne sachiez à l'avance que le point suivant n'est pas 1e99, ce qui, après avoir redimensionné la dimension Y de votre tracé, serait plat jusqu'à ce point.
la source
.. As large as in the picture
je voulais dire: pour des situations similaires où il y a des pics importants et du bruit de base.Et voici l' implémentation PHP de l'algo ZSCORE:
la source
($len - 1)
au lieu de$len
instddev()
Au lieu de comparer un maximum à la moyenne, on peut également comparer le maximum à des minima adjacents où les minima ne sont définis qu'au-dessus d'un seuil de bruit. Si le maximum local est> 3 fois (ou un autre facteur de confiance) soit des minima adjacents, alors ces maxima sont un pic. La détermination du pic est plus précise avec des fenêtres mobiles plus larges. Ce qui précède utilise un calcul centré au milieu de la fenêtre, soit dit en passant, plutôt qu'un calcul à la fin de la fenêtre (== décalage).
Notez qu'un maximum doit être considéré comme une augmentation du signal avant et une diminution après.
la source
La fonction
scipy.signal.find_peaks
, comme son nom l'indique, est utile pour cela. Mais il est important de bien comprendre ses paramètreswidth
,threshold
,distance
et surtoutprominence
d'obtenir une bonne extraction de pointe.Selon mes tests et la documentation, le concept de proéminence est "le concept utile" pour garder les bons pics et éliminer les pics bruyants.
Qu'est-ce que la proéminence (topographique) ? C'est "la hauteur minimale nécessaire pour descendre du sommet vers tout terrain plus élevé" , comme on peut le voir ici:
L'idée est:
la source
Version orientée objet de l'algorithme z-score utilisant le mordern C +++
la source
filtered_signal
,signal
,avg_filtered
et enstd_filtered
tant que variables privées et les mises à jour que ces tableaux une fois quand un nouveau point de données arrive (maintenant les boucles de code sur tous les points de données à chaque fois qu'il est appelé). Cela améliorerait les performances de votre code et convient encore mieux à la structure OOP.