Ich kann selbst etwas schreiben, indem ich Nulldurchgänge der ersten Ableitung oder etwas finde, aber es scheint eine ausreichend gemeinsame Funktion zu sein, um in Standardbibliotheken enthalten zu sein. Kennt jemand einen?
Meine spezielle Anwendung ist ein 2D-Array, aber normalerweise wird es zum Auffinden von Peaks in FFTs usw. verwendet.
Insbesondere bei solchen Problemen gibt es mehrere starke Spitzen und dann viele kleinere "Spitzen", die nur durch Rauschen verursacht werden und ignoriert werden sollten. Dies sind nur Beispiele; nicht meine tatsächlichen Daten:
1-dimensionale Peaks:
2-dimensionale Peaks:
Der Peak-Finding-Algorithmus würde den Ort dieser Peaks finden (nicht nur ihre Werte) und im Idealfall den wahren Inter-Sample-Peak finden, nicht nur den Index mit dem Maximalwert, wahrscheinlich unter Verwendung einer quadratischen Interpolation oder so.
Normalerweise interessieren Sie sich nur für ein paar starke Peaks, daher werden sie entweder ausgewählt, weil sie über einem bestimmten Schwellenwert liegen, oder weil sie die ersten n Peaks einer geordneten Liste sind, sortiert nach Amplitude.
Wie gesagt, ich kann so etwas selbst schreiben. Ich frage nur, ob es eine bereits vorhandene Funktion oder ein Paket gibt, von dem bekannt ist, dass es gut funktioniert.
Aktualisieren:
Ich habe ein MATLAB-Skript übersetzt und es funktioniert für den 1-D-Fall anständig, könnte aber besser sein.
Aktualisiertes Update:
sixtenbe hat eine bessere Version für den 1-D-Fall erstellt.
quelle
find_peaks
, also habe ich diese Antwort hinzugefügt , die für zukünftige Referenz nützlich sein könnte. (Ich bin sicher, dass Sie dies bereits seit 2009 gefunden haben, aber es ist für andere Leute + mich, wenn ich mir die Frage in ein paar Jahren noch einmalAntworten:
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:
Prüfung:
Ich habe absichtlich eine (verrauschte) frequenzvariable Sinuskurve verwendet, da diese viele Schwierigkeiten aufweist. Wir können sehen, dass der
width
Parameter hier nicht sehr nützlich ist, denn wenn Sie ein Minimumwidth
zu hoch einstellen, kann er keine sehr engen Spitzen im Hochfrequenzteil verfolgen. Wenn Siewidth
zu niedrig einstellen , haben Sie im linken Teil des Signals viele unerwünschte Spitzen. Gleiches Problem mitdistance
.threshold
vergleicht nur mit den direkten Nachbarn, was hier nicht sinnvoll ist.prominence
ist derjenige, der die beste Lösung gibt. Beachten Sie, dass Sie viele dieser Parameter kombinieren können!Code:
quelle
Ich betrachte ein ähnliches Problem und habe festgestellt, dass einige der besten Referenzen aus der Chemie stammen (aus Peaks, die in Massenspezifikationsdaten gefunden wurden). Lesen Sie dies, um eine gründliche Übersicht über die Algorithmen zur Ermittlung von Spitzenwerten zu erhalten . Dies ist eine der klarsten Bewertungen von Peak-Finding-Techniken, auf die ich gestoßen bin. (Wavelets eignen sich am besten, um Peaks dieser Art in verrauschten Daten zu finden.)
Es sieht so aus, als ob Ihre Spitzen klar definiert sind und nicht im Rauschen verborgen sind. In diesem Fall würde ich empfehlen, glatte Savtizky-Golay-Derivate zu verwenden, um die Peaks zu finden (Wenn Sie nur die obigen Daten differenzieren, kommt es zu einem Durcheinander von Fehlalarmen). Dies ist eine sehr effektive Technik und ziemlich einfach zu implementieren (Sie benötigen eine Matrixklasse mit grundlegenden Operationen). Wenn Sie einfach den Nulldurchgang der ersten SG-Ableitung finden, werden Sie glücklich sein.
quelle
Es gibt eine Funktion in scipy mit dem Namen,
scipy.signal.find_peaks_cwt
die für Ihre Bedürfnisse geeignet klingt. Ich habe jedoch keine Erfahrung damit und kann sie daher nicht empfehlen.http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
quelle
Für diejenigen, die sich nicht sicher sind, welche Peak-Finding-Algorithmen in Python verwendet werden sollen, finden Sie hier einen schnellen Überblick über die Alternativen: https://github.com/MonsieurV/py-findpeaks
Ich wollte, dass ich der MatLab-
findpeaks
Funktion äquivalent bin, und fand, dass die Funktion detect_peaks von Marcos Duarte ein guter Haken ist.Ziemlich einfach zu bedienen:
Welches wird Ihnen geben:
quelle
find_peaks
Funktion hinzugefügtscipy
.Die zuverlässige Erkennung von Peaks in einem Spektrum wurde eingehend untersucht, beispielsweise alle Arbeiten zur sinusförmigen Modellierung von Musik- / Audiosignalen in den 80er Jahren. Suchen Sie in der Literatur nach "Sinusmodellierung".
Wenn Ihre Signale so sauber sind wie im Beispiel, sollte ein einfaches "Gib mir etwas mit einer Amplitude höher als N Nachbarn" einigermaßen gut funktionieren. Wenn Sie verrauschte Signale haben, besteht eine einfache, aber effektive Möglichkeit darin, Ihre Peaks rechtzeitig zu betrachten und zu verfolgen: Sie erkennen dann Spektrallinien anstelle von Spektralspitzen. IOW, Sie berechnen die FFT in einem Schiebefenster Ihres Signals, um eine Reihe von zeitlichen Spektren zu erhalten (auch Spektrogramm genannt). Sie betrachten dann die zeitliche Entwicklung des Spektralpeaks (dh in aufeinanderfolgenden Fenstern).
quelle
Ich glaube nicht, dass SciPy das bietet, wonach Sie suchen. In dieser Situation würde ich den Code selbst schreiben.
Die Spline-Interpolation und die Glättung von scipy.interpolate sind sehr hilfreich und können sehr hilfreich sein, um Spitzen anzupassen und dann die Position ihres Maximums zu ermitteln.
quelle
Es gibt statistische Standardfunktionen und -methoden zum Auffinden von Ausreißern von Daten, die Sie wahrscheinlich im ersten Fall benötigen. Die Verwendung von Derivaten würde Ihre zweite lösen. Ich bin mir jedoch nicht sicher, ob eine Methode sowohl kontinuierliche Funktionen als auch abgetastete Daten löst.
quelle
Das Wichtigste zuerst: Die Definition von "Peak" ist vage, wenn auch ohne weitere Angaben. Würden Sie beispielsweise für die folgende Serie 5-4-5 einen oder zwei Peaks nennen?
1-2-1-2-1-1-5-4-5-1-1-5-1
In diesem Fall benötigen Sie mindestens zwei Schwellenwerte: 1) einen hohen Schwellenwert nur oberhalb dessen ein Extremwert als Peak registriert werden kann; und 2) eine niedrige Schwelle, so dass Extremwerte, die durch kleine Werte darunter getrennt sind, zwei Spitzen werden.
Die Peakerkennung ist ein gut untersuchtes Thema in der Literatur zur Extremwerttheorie, das auch als "Deklarieren von Extremwerten" bezeichnet wird. Zu seinen typischen Anwendungen gehört das Identifizieren von Gefahrenereignissen auf der Grundlage kontinuierlicher Ablesungen von Umgebungsvariablen, z. B. das Analysieren der Windgeschwindigkeit, um Sturmereignisse zu erkennen.
quelle