Ein anderer Ansatz (mehr Wörter, weniger Code), der helfen kann:
Die Orte der lokalen Maxima und Minima sind auch die Orte der Nulldurchgänge der ersten Ableitung. Es ist im Allgemeinen viel einfacher, Nulldurchgänge zu finden, als lokale Maxima und Minima direkt zu finden.
Leider neigt die erste Ableitung dazu, das Rauschen zu "verstärken". Wenn also in den Originaldaten signifikantes Rauschen vorhanden ist, wird die erste Ableitung am besten erst verwendet, nachdem auf die Originaldaten ein gewisser Grad an Glättung angewendet wurde.
Da das Glätten im einfachsten Sinne ein Tiefpassfilter ist, wird das Glätten häufig am besten (am einfachsten) unter Verwendung eines Faltungskerns durchgeführt, und das "Formen" dieses Kernels kann eine überraschende Menge an Funktionen zum Erhalten / Verbessern von Merkmalen bereitstellen . Der Prozess des Findens eines optimalen Kernels kann mit einer Vielzahl von Mitteln automatisiert werden, aber das Beste kann einfache Brute Force sein (viel schnell, um kleine Kernel zu finden). Ein guter Kernel wird (wie beabsichtigt) die Originaldaten massiv verzerren, aber NICHT die Position der interessierenden Spitzen / Täler beeinflussen.
Glücklicherweise kann ziemlich oft ein geeigneter Kernel über eine einfache SWAG ("fundierte Vermutung") erstellt werden. Die Breite des Glättungskerns sollte etwas breiter sein als der breiteste erwartete "interessante" Peak in den Originaldaten, und seine Form ähnelt diesem Peak (einem einskalierten Wavelet). Für mittelschonende Kernel (was ein guter Glättungsfilter sein sollte) sollte die Summe der Kernelelemente genau gleich 1,00 sein, und der Kernel sollte symmetrisch zu seiner Mitte sein (was bedeutet, dass er eine ungerade Anzahl von Elementen hat.
Bei einem optimalen Glättungskern (oder einer kleinen Anzahl von Kerneln, die für unterschiedliche Dateninhalte optimiert sind) wird der Grad der Glättung zu einem Skalierungsfaktor für (den "Gewinn") des Faltungskerns.
Die Bestimmung des "richtigen" (optimalen) Glättungsgrades (Faltungskernverstärkung) kann sogar automatisiert werden: Vergleichen Sie die Standardabweichung der Daten der ersten Ableitung mit der Standardabweichung der geglätteten Daten. Wie sich das Verhältnis der beiden Standardabweichungen mit Änderungen des Glättungsgrads ändert, kann verwendet werden, um effektive Glättungswerte vorherzusagen. Ein paar manuelle Datenläufe (die wirklich repräsentativ sind) sollten alles sein, was benötigt wird.
Alle oben aufgeführten früheren Lösungen berechnen die erste Ableitung, behandeln sie jedoch weder als statistisches Maß, noch versuchen die oben genannten Lösungen, die Glättung von Merkmalen zu erhalten / zu verbessern (um subtilen Spitzen zu helfen, über das Rauschen zu "springen").
Schließlich die schlechte Nachricht: Das Finden von "echten" Peaks wird zu einem königlichen Schmerz, wenn das Rauschen auch Merkmale aufweist, die wie echte Peaks aussehen (überlappende Bandbreite). Die nächste komplexere Lösung besteht im Allgemeinen darin, einen längeren Faltungskern (eine "breitere Kernelöffnung") zu verwenden, der die Beziehung zwischen benachbarten "realen" Peaks (wie minimale oder maximale Raten für das Auftreten von Peaks) berücksichtigt, oder mehrere zu verwenden Faltungsdurchläufe werden mit Kerneln unterschiedlicher Breite durchgeführt (aber nur, wenn es schneller ist: Es ist eine grundlegende mathematische Wahrheit, dass nacheinander durchgeführte lineare Faltungen immer zusammen zu einer einzigen Faltung gefaltet werden können). Es ist jedoch oft viel einfacher, zuerst eine Folge nützlicher Kernel (unterschiedlicher Breite) zu finden und sie zusammenzufalten, als den endgültigen Kernel in einem einzigen Schritt direkt zu finden.
Hoffentlich bietet dies genügend Informationen, damit Google (und möglicherweise ein guter Statistiktext) die Lücken füllen kann. Ich wünschte wirklich, ich hätte die Zeit, ein funktionierendes Beispiel oder einen Link zu einem zu liefern. Wenn jemand online auf eines stößt, poste es bitte hier!