Update: Der beste Ergebnis erzielt Algorithmus so weit ist dies ein .
In dieser Frage werden robuste Algorithmen zum Erkennen plötzlicher Spitzen in Echtzeit-Zeitreihendaten untersucht.
Betrachten Sie den folgenden Datensatz:
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];
(Matlab-Format, aber es geht nicht um die Sprache, sondern um den Algorithmus)
Sie können deutlich sehen, dass es drei große und einige kleine Gipfel gibt. Dieser Datensatz ist ein spezifisches Beispiel für die Klasse von Zeitreihen-Datensätzen, um die es in der Frage geht. Diese Klasse von Datensätzen weist zwei allgemeine Merkmale auf:
- Es gibt Grundgeräusche mit einem allgemeinen Mittelwert
- Es gibt große " Spitzen " oder " höhere Datenpunkte ", die erheblich vom Rauschen abweichen.
Nehmen wir auch Folgendes an:
- Die Breite der Peaks kann nicht vorher bestimmt werden
- Die Höhe der Peaks weicht deutlich und deutlich von den anderen Werten ab
- Der verwendete Algorithmus muss Echtzeit berechnen (also mit jedem neuen Datenpunkt ändern).
Für eine solche Situation muss ein Grenzwert konstruiert werden, der Signale auslöst. Der Grenzwert kann jedoch nicht statisch sein und muss in Echtzeit anhand eines Algorithmus ermittelt werden.
Meine Frage: Was ist ein guter Algorithmus, um solche Schwellenwerte in Echtzeit zu berechnen? Gibt es spezielle Algorithmen für solche Situationen? Was sind die bekanntesten Algorithmen?
Robuste Algorithmen oder nützliche Erkenntnisse werden sehr geschätzt. (kann in jeder Sprache antworten: es geht um den Algorithmus)
Antworten:
Robuster Peak-Erkennungsalgorithmus (unter Verwendung von Z-Scores)
Ich habe einen Algorithmus entwickelt, der für diese Arten von Datensätzen sehr gut funktioniert. Es basiert auf dem Prinzip der Dispersion : Wenn ein neuer Datenpunkt eine gegebene x Anzahl von Standardabweichungen von einem sich bewegenden Mittelwert entfernt ist, signalisiert der Algorithmus (auch als Z-Score bezeichnet ). Der Algorithmus ist sehr robust, da er einen separaten gleitenden Mittelwert und eine separate Abweichung erstellt, sodass Signale den Schwellenwert nicht verfälschen. Zukünftige Signale werden daher unabhängig von der Anzahl der vorherigen Signale mit ungefähr derselben Genauigkeit identifiziert. Der Algorithmus benötigt 3 Eingaben :
lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
undinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. Zum Beispiel verwendet alag
von 5 die letzten 5 Beobachtungen, um die Daten zu glätten. EINthreshold
von 3,5 signalisiert, wenn ein Datenpunkt 3,5 Standardabweichungen vom gleitenden Mittelwert entfernt ist. Und ein Wertinfluence
von 0,5 gibt Signalen die Hälfte des Einflusses, den normale Datenpunkte haben. Ebensoinfluence
ignoriert ein von 0 Signale vollständig, um den neuen Schwellenwert neu zu berechnen. Ein Einfluss von 0 ist daher die robusteste Option (setzt jedoch Stationarität voraus ); Die Einflussoption auf 1 zu setzen ist am wenigsten robust. Bei instationären Daten sollte die Einflussoption daher irgendwo zwischen 0 und 1 liegen.Es funktioniert wie folgt:
Pseudocode
Faustregeln für die Auswahl guter Parameter für Ihre Daten finden Sie unten.
Demo
Den Matlab-Code für diese Demo finden Sie hier . Um die Demo zu verwenden, führen Sie sie einfach aus und erstellen Sie selbst eine Zeitreihe, indem Sie auf das obere Diagramm klicken. Der Algorithmus beginnt zu arbeiten, nachdem die
lag
Anzahl der Beobachtungen gezeichnet wurde .Ergebnis
Für die ursprüngliche Frage, wird dieser Algorithmus die folgende Ausgabe geben , wenn die folgenden Einstellungen:
lag = 30, threshold = 5, influence = 0
:Implementierungen in verschiedenen Programmiersprachen:
Matlab (ich)
R (ich)
Golang (Xeoncross)
Python (R Kiselev)
Python [effiziente Version] (Delica)
Swift (ich)
Groovy (JoshuaCWebDeveloper)
C ++ (Brad)
C ++ (Animesh Pandey)
Rust (Zauberer)
Scala (Mike Roberts)
Kotlin (leoderprofi)
Rubin (Kimmo Lehto)
Fortran [zur Resonanzerkennung] (THo)
Julia (Matt Camp)
C # (Ocean Airdrop)
C (DavidC)
Java (takanuva15)
JavaScript (Dirk Lüsebrink)
TypeScript (Jerry Gamble)
Perl (Alen)
PHP (Radhoo)
Faustregeln zur Konfiguration des Algorithmus
lag
: Der Lag-Parameter bestimmt, wie stark Ihre Daten geglättet werden und wie anpassungsfähig der Algorithmus an Änderungen im langfristigen Durchschnitt der Daten ist. Je stationärer Ihre Daten sind, desto mehr Verzögerungen sollten Sie berücksichtigen (dies sollte die Robustheit des Algorithmus verbessern). Wenn Ihre Daten zeitlich variierende Trends enthalten, sollten Sie überlegen, wie schnell sich der Algorithmus an diese Trends anpassen soll. Das heißt, wenn Sielag
auf 10 setzen, dauert es 10 'Perioden', bis der Schwellenwert des Algorithmus an systematische Änderungen des langfristigen Durchschnitts angepasst wird. Wählen Sie denlag
Parameter also basierend auf dem Trendverhalten Ihrer Daten und der Anpassungsfähigkeit des Algorithmus.influence
: Dieser Parameter bestimmt den Einfluss von Signalen auf die Erkennungsschwelle des Algorithmus. Bei 0 haben Signale keinen Einfluss auf den Schwellenwert, sodass zukünftige Signale basierend auf einem Schwellenwert erfasst werden, der mit einem Mittelwert und einer Standardabweichung berechnet wird, die nicht durch vergangene Signale beeinflusst werden. Eine andere Möglichkeit, darüber nachzudenken, besteht darin, dass Sie implizit Stationarität annehmen, wenn Sie den Einfluss auf 0 setzen (dh unabhängig von der Anzahl der Signale kehrt die Zeitreihe langfristig immer zum gleichen Durchschnitt zurück). Ist dies nicht der Fall, sollten Sie den Einflussparameter irgendwo zwischen 0 und 1 setzen, je nachdem, inwieweit Signale den zeitlich variierenden Trend der Daten systematisch beeinflussen können. ZB wenn Signale zu einem Strukturbruch führen Im Langzeitdurchschnitt der Zeitreihen sollte der Einflussparameter hoch (nahe 1) gesetzt werden, damit sich der Schwellenwert schnell an diese Änderungen anpassen kann.threshold
: Der Schwellenwertparameter ist die Anzahl der Standardabweichungen vom gleitenden Mittelwert, über denen der Algorithmus einen neuen Datenpunkt als Signal klassifiziert. Wenn beispielsweise ein neuer Datenpunkt 4,0 Standardabweichungen über dem gleitenden Mittelwert liegt und der Schwellenwertparameter auf 3,5 eingestellt ist, identifiziert der Algorithmus den Datenpunkt als Signal. Dieser Parameter sollte basierend auf der Anzahl der erwarteten Signale eingestellt werden. Wenn Ihre Daten beispielsweise normal verteilt sind, entspricht ein Schwellenwert (oder: Z-Score) von 3,5 einer Signalisierungswahrscheinlichkeit von 0,00047 (aus dieser Tabelle)), was bedeutet, dass Sie alle 2128 Datenpunkte (1 / 0,00047) einmal ein Signal erwarten. Die Schwelle beeinflusst daher direkt, wie empfindlich der Algorithmus ist und damit auch, wie oft der Algorithmus signalisiert. Untersuchen Sie Ihre eigenen Daten und bestimmen Sie einen vernünftigen Schwellenwert, der den Algorithmus signalisiert, wann Sie dies möchten (hier ist möglicherweise ein Versuch und Irrtum erforderlich, um einen für Ihren Zweck geeigneten Schwellenwert zu erreichen).WARNUNG: Der obige Code durchläuft bei jeder Ausführung immer alle Datenpunkte. Stellen Sie bei der Implementierung dieses Codes sicher, dass Sie die Berechnung des Signals in eine separate Funktion (ohne Schleife) aufteilen. Dann , wenn ein neuer Datenpunkt ankommt, zu aktualisieren
filteredY
,avgFilter
undstdFilter
einmal. Berechnen Sie die Signale nicht jedes Mal neu, wenn ein neuer Datenpunkt vorhanden ist (wie im obigen Beispiel). Dies wäre äußerst ineffizient und langsam!Andere Möglichkeiten zum Ändern des Algorithmus (für mögliche Verbesserungen) sind:
influence
Parameter für den Mittelwert und den Standard ( wie in dieser Swift-Übersetzung beschrieben ).(Bekannte) akademische Zitate zu dieser StackOverflow-Antwort:
Yin, C. (2020). Dinukleotid-Wiederholungen im SARS-CoV-2-Genom des Coronavirus: evolutionäre Implikationen . ArXiv E-Print, zugänglich unter: https://arxiv.org/pdf/2006.00280.pdf
Esnaola-Gonzalez, I., Gómez-Omella, M., Ferreiro, S., Fernandez, I., Lázaro, I. & García, E. (2020). Eine IoT-Plattform zur Verbesserung der Geflügelproduktionsketten . Sensors, 20 (6), 1549.
Gao, S. & Calderon, DP (2020). Kontinuierliche Regime der kortiko-motorischen Integration kalibrieren den Erregungsgrad während des Auftretens aus der Anästhesie . bioRxiv.
Cloud, B., Tarien, B., Liu, A., Shedd, T., Lin, X., Hubbard, M., ... & Moore, JK (2019). Adaptive Smartphone-basierte Sensorfusion zur Schätzung wettbewerbsfähiger kinematischer Rudermetriken . PloS eins, 14 (12).
F. Ceyssens, MB Carmona, D. Kil, M. Deprez, E. Tooten, B. Nuttin, ... & R. Puers (2019). Chronische neuronale Aufzeichnung mit Sonden mit subzellulärem Querschnitt unter Verwendung von 0,06 mm² auflösenden Mikronadeln als Insertionsvorrichtung . Sensors and Actuators B: Chemical , 284, S. 369–376.
Dons, E., Laeremans, M., Orjuela, JP, Avila-Palencia, I., de Nazelle, A., Nieuwenhuijsen, M., ... & Nawrot, T. (2019). Transport, der im Alltag am wahrscheinlichsten zu Luftverschmutzungsspitzen führt: Belege aus über 2000 Tagen persönlicher Überwachung . Atmospheric Environment , 213, 424 & ndash; 432.
Schaible BJ, Snook KR, Yin J. et al. (2019). Twitter-Gespräche und englische Medienberichte über Poliomyelitis in fünf verschiedenen Ländern, Januar 2014 bis April 2015 . The Permanente Journal , 23, 18-181.
Lima, B. (2019). Objektoberflächenerkundung mit einer taktilen Roboter-Fingerspitze (Dissertation, Université d'Ottawa / Universität Ottawa).
Lima, BMR, Ramos, LCS, de Oliveira, TEA, da Fonseca, VP, & Petriu, EM (2019). Herzfrequenzerkennung mit einem multimodalen taktilen Sensor und einem Z-Score-basierten Peak-Erkennungsalgorithmus . CMBES-Verfahren , 42.
Lima, BMR, de Oliveira, TEA, da Fonseca, VP, Zhu, Q., Goubran, M., Groza, VZ, & Petriu, EM (2019, Juni). Herzfrequenzerkennung mit einem miniaturisierten multimodalen taktilen Sensor . 2019 Internationales IEEE-Symposium für medizinische Messungen und Anwendungen (MeMeA) (S. 1-6). IEEE.
Ting, C., Field, R., Quach, T., Bauer, T. (2019). Verallgemeinerte Grenzerkennung mithilfe komprimierungsbasierter Analysen . ICASSP 2019 - 2019 Internationale IEEE-Konferenz für Akustik, Sprach- und Signalverarbeitung (ICASSP) , Brighton, Vereinigtes Königreich, S. 3522-3526.
Carrier, EE (2019). Nutzung der Komprimierung bei der Lösung diskretisierter linearer Systeme . Doktorarbeit , Universität von Illinois in Urbana-Champaign.
A. Khandakar, ME Chowdhury, R. Ahmed, A. Dhib, M. Mohammed, NA Al-Emadi & D. Michelson (2019). Tragbares System zur Überwachung und Steuerung des Fahrerverhaltens und der Verwendung eines Mobiltelefons während der Fahrt . Sensors , 19 (7), 1563.
Baskozos, G., Dawes, JM, Austin, JS, Antunes-Martins, A., McDermott, L., Clark, AJ, ... & Orengo, C. (2019). Eine umfassende Analyse der langen nichtkodierenden RNA-Expression im Ganglion der Rückenwurzel zeigt die Zelltypspezifität und Dysregulation nach einer Nervenverletzung . Pain , 160 (2), 463.
Cloud, B., Tarien, B., Crawford, R. & Moore, J. (2018). Adaptive Smartphone-basierte Sensorfusion zur Schätzung wettbewerbsfähiger kinematischer Rudermetriken . engrXiv Preprints .
Zajdel, TJ (2018). Elektronische Schnittstellen für die bakterienbasierte Biosensierung . Doktorarbeit , UC Berkeley.
Perkins, P., Heber, S. (2018). Identifizierung von Ribosomenpausenstellen unter Verwendung eines Z-Score-basierten Peak-Detektionsalgorithmus . IEEE 8. Internationale Konferenz über Computerfortschritte in den Bio- und Medizinwissenschaften (ICCABS) , ISBN: 978-1-5386-8520-4.
Moore, J., Goffin, P., Meyer, M., Lundrigan, P., Patwari, N., Sward, K. & Wiese, J. (2018). Verwalten von In-Home-Umgebungen durch Erfassen, Kommentieren und Visualisieren von Luftqualitätsdaten . Verfahren des ACM zu interaktiven, mobilen, tragbaren und allgegenwärtigen Technologien , 2 (3), 128.
Lo, O., Buchanan, WJ, Griffiths, P. und Macfarlane, R. (2018), Entfernungsmessverfahren für verbesserte Insider-Bedrohungserkennungs- , Sicherheits- und Kommunikationsnetzwerke . 2018, Artikel-ID 5906368.
Apurupa, NV, Singh, P., Chakravarthy, S. & Buduru, AB (2018). Eine kritische Untersuchung der Stromverbrauchsmuster in Indian Apartments . Doktorarbeit , IIIT-Delhi.
Scirea, M. (2017). Affektive Musikgenerierung und ihre Auswirkungen auf das Spielerlebnis . Doktorarbeit , IT Universität Kopenhagen, Digital Design.
M. Scirea, P. Eklund, J. Togelius & S. Risi (2017). Primal-Improvisation: Auf dem Weg zur koevolutionären musikalischen Improvisation . Informatik und Elektronik (MOEL) , 2017 (S. 172-177). IEEE.
MC Catalbas, T. Cegovnik, J. Sodnik und A. Gulten (2017). Ermüdungserkennung des Fahrers basierend auf sakkadischen Augenbewegungen , 10. Internationale Konferenz für Elektrotechnik und Elektronik (ELECO), S. 913-917.
Andere arbeiten mit dem Algorithmus
Bernardi, D. (2019). Eine Machbarkeitsstudie zum Koppeln einer Smartwatch und eines mobilen Geräts durch multimodale Gesten . Masterarbeit , Aalto University.
Lemmens, E. (2018). Ausreißererkennung in Ereignisprotokollen mit statistischen Methoden , Masterarbeit , Universität Eindhoven.
Willems, P. (2017). Stimmungsgesteuertes affektives Ambiente für ältere Menschen , Masterarbeit , Universität Twente.
Ciocirdel, GD und Varga, M. (2016). Wahlvorhersage basierend auf Wikipedia-Seitenaufrufen . Projektarbeit , Vrije Universiteit Amsterdam.
Andere Anwendungen dieses Algorithmus
Machine Laboratory Financial Laboratory , Python-Paket basierend auf der Arbeit von De Prado, ML (2018). Fortschritte beim finanziellen maschinellen Lernen . John Wiley & Sons.
Adafruit CircuitPlayground Library , Adafruit Board (Adafruit Industries)
Step-Tracker-Algorithmus , Android App (jeeshnair)
Links zu anderen Algorithmen zur Peakerkennung
Wenn Sie diese Funktion irgendwo verwenden, schreiben Sie mir oder dieser Antwort gut. Wenn Sie Fragen zu diesem Algorithmus haben, posten Sie diese in den Kommentaren unten oder wenden Sie sich an mich auf LinkedIn .
quelle
threshold
Diagramm nach einer großen Spitze von bis zu 20 in den Daten nur zu einer flachen grünen Linie, und es bleibt für den Rest des Diagramms so ... Wenn Ich entferne das Sike, das passiert nicht, also scheint es durch den Spike in den Daten verursacht zu werden. Irgendeine Idee, was los sein könnte? Ich bin ein Neuling in Matlab, also kann ich es nicht herausfinden ...Hier ist die
Python
/numpy
Implementierung des geglätteten Z-Score-Algorithmus (siehe Antwort oben ). Das Wesentliche finden Sie hier .Unten sehen Sie den Test für denselben Datensatz, der das gleiche Diagramm wie in der ursprünglichen Antwort für
R
/ ergibtMatlab
quelle
y
ist das Datenarray, das Sie übergeben. Essignals
ist das+1
oder das-1
Ausgabearray, das für jeden Datenpunkt angibt,y[i]
ob dieser Datenpunkt angesichts der von Ihnen verwendeten Einstellungen ein "signifikanter Peak" ist.Ein Ansatz besteht darin, Peaks basierend auf der folgenden Beobachtung zu erfassen:
Es vermeidet Fehlalarme, indem es wartet, bis der Aufwärtstrend vorbei ist. Es ist nicht gerade "Echtzeit" in dem Sinne, dass es den Peak um einen dt verfehlt. Die Empfindlichkeit kann gesteuert werden, indem zum Vergleich ein Spielraum benötigt wird. Es gibt einen Kompromiss zwischen verrauschter Erkennung und zeitlicher Verzögerung der Erkennung. Sie können das Modell erweitern, indem Sie weitere Parameter hinzufügen:
Dabei sind dt und m Parameter zur Steuerung der Empfindlichkeit gegenüber der Zeitverzögerung
Folgendes erhalten Sie mit dem genannten Algorithmus:
Hier ist der Code zum Reproduzieren der Handlung in Python:
Durch Einstellen
m = 0.5
können Sie ein saubereres Signal mit nur einem falsch positiven Ergebnis erhalten:quelle
Bei der Signalverarbeitung erfolgt die Spitzenwerterfassung häufig über eine Wavelet-Transformation. Grundsätzlich führen Sie eine diskrete Wavelet-Transformation Ihrer Zeitreihendaten durch. Nulldurchgänge in den zurückgegebenen Detailkoeffizienten entsprechen Spitzen im Zeitreihensignal. Sie erhalten unterschiedliche Spitzenamplituden bei unterschiedlichen Detailkoeffizienten, wodurch Sie eine Auflösung von mehreren Ebenen erhalten.
quelle
Wir haben versucht, den geglätteten Z-Score-Algorithmus für unseren Datensatz zu verwenden, der entweder zu Überempfindlichkeit oder zu Unterempfindlichkeit führt (abhängig davon, wie die Parameter eingestellt sind), mit wenig Mittelweg. In der Verkehrsampel unserer Site haben wir eine niederfrequente Basislinie beobachtet, die den täglichen Zyklus darstellt, und selbst mit den bestmöglichen Parametern (siehe unten) ist sie insbesondere am 4. Tag immer noch abgeklungen, da die meisten Datenpunkte als Anomalie erkannt werden .
Aufbauend auf dem ursprünglichen Z-Score-Algorithmus haben wir einen Weg gefunden, dieses Problem durch umgekehrte Filterung zu lösen. Die Details des modifizierten Algorithmus und seine Anwendung auf die Verkehrszuweisung von TV-Werbung werden in unserem Team-Blog veröffentlicht .
quelle
In der Computertopologie führt die Idee der persistenten Homologie zu einer effizienten - so sortierschnellen - Lösung. Es erkennt nicht nur Peaks, sondern quantifiziert auf natürliche Weise die "Signifikanz" der Peaks, sodass Sie die für Sie signifikanten Peaks auswählen können.
Zusammenfassung des Algorithmus. In einer eindimensionalen Einstellung (Zeitreihen, reelles Signal) kann der Algorithmus leicht durch die folgende Abbildung beschrieben werden:
Stellen Sie sich das Funktionsdiagramm (oder seine untergeordnete Ebene) als Landschaft vor und betrachten Sie einen abnehmenden Wasserstand ab Stufe unendlich (oder 1,8 in diesem Bild). Während der Pegel abnimmt, tauchen bei lokalen Maxima Inseln auf. Bei lokalen Minima verschmelzen diese Inseln miteinander. Ein Detail dieser Idee ist, dass die später erscheinende Insel mit der älteren Insel verschmolzen wird. Die "Persistenz" einer Insel ist ihre Geburtszeit abzüglich ihrer Todeszeit. Die Längen der blauen Balken zeigen die Persistenz, die die oben erwähnte "Bedeutung" eines Peaks ist.
Effizienz. Es ist nicht allzu schwer, eine Implementierung zu finden, die in linearer Zeit ausgeführt wird - tatsächlich handelt es sich um eine einzelne, einfache Schleife -, nachdem die Funktionswerte sortiert wurden. Daher sollte diese Implementierung in der Praxis schnell sein und ist auch leicht zu implementieren.
Verweise. Eine Zusammenfassung der gesamten Geschichte und Hinweise auf die Motivation aus persistenter Homologie (ein Feld in der rechnergestützten algebraischen Topologie) finden Sie hier: https://www.sthu.org/blog/13-perstopology-peakdetection/index.html
quelle
Fand einen anderen Algorithmus von GH Palshikar in einfachen Algorithmen zur Peakerkennung in Zeitreihen .
Der Algorithmus sieht folgendermaßen aus:
Vorteile
Nachteile
k
undh
vorherBeispiel:
quelle
Hier ist eine Implementierung des Smoothed Z-Score-Algorithmus (oben) in Golang. Es wird ein Slice von
[]int16
(PCM 16bit Samples) angenommen. Einen Kern finden Sie hier .quelle
Hier ist eine C ++ - Implementierung des geglätteten Z-Score-Algorithmus aus dieser Antwort
quelle
Dieses Problem ähnelt dem, das ich in einem Kurs über Hybrid- / Embedded-Systeme festgestellt habe, aber es hing mit der Erkennung von Fehlern zusammen, wenn die Eingabe von einem Sensor verrauscht ist. Wir haben einen Kalman-Filter verwendet , um den verborgenen Zustand des Systems abzuschätzen / vorherzusagen, und dann statistische Analysen verwendet, um die Wahrscheinlichkeit zu bestimmen, dass ein Fehler aufgetreten ist . Wir haben mit linearen Systemen gearbeitet, aber es gibt nichtlineare Varianten. Ich erinnere mich, dass der Ansatz überraschend anpassungsfähig war, aber ein Modell der Dynamik des Systems erforderte.
quelle
C ++ Implementierung
quelle
In Anlehnung an die von @ Jean-Paul vorgeschlagene Lösung habe ich seinen Algorithmus in C # implementiert
Anwendungsbeispiel:
quelle
Hier ist eine C-Implementierung von @ Jean-Pauls Smoothed Z-Score für den Arduino-Mikrocontroller, mit dem Beschleunigungsmesser abgelesen und entschieden werden, ob die Richtung eines Aufpralls von links oder rechts stammt. Dies funktioniert sehr gut, da dieses Gerät ein zurückgeworfenes Signal zurückgibt. Hier ist diese Eingabe für diesen Spitzenerkennungsalgorithmus vom Gerät - zeigt einen Aufprall von rechts, gefolgt von und einen Aufprall von links. Sie können die anfängliche Spitze und dann die Schwingung des Sensors sehen.
Ihr Ergebnis mit Einfluss = 0
Nicht großartig, aber hier mit Einfluss = 1
das ist sehr gut.
quelle
Hier ist eine aktuelle Java-Implementierung, die auf der Groovy-Antwort basiert . (Ich weiß, dass bereits Groovy- und Kotlin-Implementierungen veröffentlicht wurden, aber für jemanden wie mich, der nur Java ausgeführt hat, ist es ein echtes Problem, herauszufinden, wie man zwischen anderen Sprachen und Java konvertiert.)
(Die Ergebnisse stimmen mit den Grafiken anderer Personen überein.)
Implementierung des Algorithmus
Hauptmethode
Ergebnisse
quelle
Anhang 1 zur ursprünglichen Antwort:
Matlab
undR
ÜbersetzungenMatlab-Code
Beispiel:
R-Code
Beispiel:
Dieser Code (beide Sprachen) liefert das folgende Ergebnis für die Daten der ursprünglichen Frage:
Anhang 2 zur ursprünglichen Antwort:
Matlab
Demonstrationscode(Klicken, um Daten zu erstellen)
quelle
Hier ist mein Versuch, aus der akzeptierten Antwort eine Ruby-Lösung für das "Smoothed Z-Score Algo" zu erstellen:
Und Anwendungsbeispiel:
quelle
Eine iterative Version in Python / Numpy zur Beantwortung https://stackoverflow.com/a/22640362/6029703 finden Sie hier. Dieser Code ist schneller als die Berechnung des Durchschnitts und der Standardabweichung bei jeder Verzögerung für große Datenmengen (100000+).
quelle
Ich dachte, ich würde meine Julia-Implementierung des Algorithmus für andere bereitstellen. Das Wesentliche finden Sie hier
quelle
Hier ist eine Groovy (Java) -Implementierung des geglätteten Z-Score-Algorithmus ( siehe Antwort oben ).
Im Folgenden finden Sie einen Test für denselben Datensatz, der dieselben Ergebnisse wie die obige Python / Numpy-Implementierung liefert .
quelle
Hier ist eine (nicht idiomatische) Scala-Version des geglätteten Z-Score-Algorithmus :
Hier ist ein Test, der dieselben Ergebnisse wie die Versionen Python und Groovy liefert:
Kern hier
quelle
Ich brauchte so etwas in meinem Android-Projekt. Ich dachte, ich könnte die Kotlin- Implementierung zurückgeben.
Ein Beispielprojekt mit Verifizierungsdiagrammen finden Sie bei github .
quelle
Hier ist eine geänderte Fortran-Version des Z-Score-Algorithmus . Es wurde speziell für die Spitzen- (Resonanz-) Erkennung in Übertragungsfunktionen im Frequenzraum geändert (jede Änderung hat einen kleinen Kommentar im Code).
Die erste Änderung warnt den Benutzer, wenn in der Nähe der Untergrenze des Eingabevektors eine Resonanz vorliegt, die durch eine Standardabweichung angezeigt wird, die über einem bestimmten Schwellenwert liegt (in diesem Fall 10%). Dies bedeutet einfach, dass das Signal nicht flach genug ist, um die Filter ordnungsgemäß zu initialisieren.
Die zweite Modifikation besteht darin, dass nur der höchste Wert eines Peaks zu den gefundenen Peaks addiert wird. Dies wird erreicht, indem jeder gefundene Spitzenwert mit der Größe seiner (Verzögerungs-) Vorgänger und seiner (Verzögerungs-) Nachfolger verglichen wird.
Die dritte Änderung besteht darin, zu berücksichtigen, dass Resonanzspitzen normalerweise irgendeine Form von Symmetrie um die Resonanzfrequenz zeigen. Daher ist es natürlich, den Mittelwert und den Standard symmetrisch um den aktuellen Datenpunkt zu berechnen (und nicht nur für die Vorgänger). Dies führt zu einem besseren Peakerkennungsverhalten.
Die Modifikationen haben zur Folge, dass das gesamte Signal der Funktion vorher bekannt sein muss, was bei der Resonanzerkennung üblich ist (so etwas wie das Matlab-Beispiel von Jean-Paul, bei dem die Datenpunkte im laufenden Betrieb erzeugt werden, funktioniert nicht).
Für meine Anwendung funktioniert der Algorithmus wie ein Zauber!
quelle
Wenn Sie Ihre Daten in einer Datenbanktabelle gespeichert haben, finden Sie hier eine SQL-Version eines einfachen Z-Score-Algorithmus:
quelle
Python-Version, die mit Echtzeit-Streams arbeitet (berechnet nicht alle Datenpunkte bei Ankunft jedes neuen Datenpunkts neu). Vielleicht möchten Sie die Rückgabe der Klassenfunktion optimieren - für meine Zwecke brauchte ich nur die Signale.
quelle
Ich habe mir erlaubt, eine Javascript-Version davon zu erstellen. Könnte es hilfreich sein. Das Javascript sollte eine direkte Transkription des oben angegebenen Pseudocodes sein. Verfügbar als npm-Paket und Github-Repo:
Javascript Übersetzung:
quelle
Wenn der Grenzwert oder andere Kriterien von zukünftigen Werten abhängen, besteht die einzige Lösung (ohne Zeitmaschine oder andere Kenntnis zukünftiger Werte) darin, eine Entscheidung zu verzögern, bis genügend zukünftige Werte vorliegen. Wenn Sie ein Niveau über einem Mittelwert von beispielsweise 20 Punkten wünschen, müssen Sie warten, bis Sie mindestens 19 Punkte vor einer Spitzenentscheidung haben. Andernfalls könnte der nächste neue Punkt Ihre Schwelle vor 19 Punkten vollständig überschreiten .
Ihr aktuelles Diagramm weist keine Spitzen auf ... es sei denn, Sie wissen im Voraus, dass der nächste Punkt nicht 1e99 ist, was nach einer Neuskalierung der Y-Dimension Ihres Diagramms bis zu diesem Punkt flach wäre.
quelle
.. As large as in the picture
meinte ich: für ähnliche Situationen, in denen es signifikante Spitzen und Grundgeräusche gibt.Und hier kommt die PHP-Implementierung des ZSCORE-Algo:
quelle
($len - 1)
statt$len
instddev()
Anstatt ein Maximum mit dem Mittelwert zu vergleichen, kann man die Maxima auch mit benachbarten Minima vergleichen, wobei die Minima nur oberhalb einer Rauschschwelle definiert sind. Wenn das lokale Maximum> 3-mal (oder ein anderer Konfidenzfaktor) eines der benachbarten Minima ist, dann ist dieses Maximum ein Peak. Die Peakbestimmung ist bei breiteren beweglichen Fenstern genauer. Das obige verwendet übrigens eine Berechnung, die in der Mitte des Fensters zentriert ist, und keine Berechnung am Ende des Fensters (== Verzögerung).
Beachten Sie, dass ein Maximum als Zunahme des Signals vor und Abnahme nach dem Signal gesehen werden muss.
quelle
Die Funktion ist
scipy.signal.find_peaks
, wie der Name schon sagt, hierfür nützlich. Aber es ist wichtig , gut seine Parameter zu verstehenwidth
,threshold
,distance
und vor allemprominence
eine gute Spitzen Extraktion zu erhalten.Nach meinen Tests und der Dokumentation ist das Konzept der Bekanntheit "das nützliche Konzept", um die guten Spitzen beizubehalten und die lauten Spitzen zu verwerfen.
Was ist (topografische) Bedeutung ? Es ist "die Mindesthöhe, die erforderlich ist, um vom Gipfel in ein höheres Gelände zu gelangen" , wie hier zu sehen ist:
Die Idee ist:
quelle
Objektorientierte Version des Z-Score-Algorithmus mit moderner C +++
quelle
filtered_signal
,signal
,avg_filtered
undstd_filtered
als private Variablen und aktualisiert nur die Arrays einmal , wenn ein neuer Datenpunkt kommt (jetzt die Code Schleifen über alle Datenpunkte jedes Mal sie genannt wird). Das würde die Leistung Ihres Codes verbessern und passt noch besser zur OOP-Struktur.