Une autre approche (plus de mots, moins de code) qui peut aider:
Les emplacements des maxima et minima locaux sont également les emplacements des passages par zéro de la première dérivée. Il est généralement beaucoup plus facile de trouver des passages à zéro que de trouver directement les maxima et minima locaux.
Malheureusement, la première dérivée a tendance à "amplifier" le bruit, de sorte que lorsqu'un bruit significatif est présent dans les données d'origine, la première dérivée n'est mieux utilisée qu'après que les données d'origine ont subi un certain degré de lissage.
Étant donné que le lissage est, dans le sens le plus simple, un filtre passe-bas, le lissage est souvent mieux (enfin, le plus facilement) effectué en utilisant un noyau de convolution, et "façonner" ce noyau peut fournir une quantité surprenante de capacités de préservation / amélioration des fonctionnalités . Le processus de recherche d'un noyau optimal peut être automatisé en utilisant une variété de moyens, mais le meilleur peut être une simple force brute (très rapide pour trouver de petits noyaux). Un bon noyau déformera (comme prévu) massivement les données originales, mais n'affectera PAS l'emplacement des pics / vallées d'intérêt.
Heureusement, assez souvent, un noyau approprié peut être créé via un simple SWAG ("supposé instruit"). La largeur du noyau de lissage doit être un peu plus large que le pic "intéressant" le plus large attendu dans les données d'origine, et sa forme ressemblera à ce pic (une ondelette à échelle unique). Pour les noyaux préservant la moyenne (ce que tout bon filtre de lissage devrait être), la somme des éléments du noyau doit être exactement égale à 1,00, et le noyau doit être symétrique par rapport à son centre (ce qui signifie qu'il aura un nombre impair d'éléments.
Étant donné un noyau de lissage optimal (ou un petit nombre de noyaux optimisés pour différents contenus de données), le degré de lissage devient un facteur d'échelle pour (le «gain») du noyau de convolution.
La détermination du degré "correct" (optimal) de lissage (gain du noyau de convolution) peut même être automatisée: Comparez l'écart type des premières données dérivées avec l'écart type des données lissées. Comment le rapport des deux écarts types change avec les changements du degré de came de lissage être utilisé pour prédire les valeurs de lissage efficaces. Quelques exécutions manuelles de données (qui sont vraiment représentatives) devraient suffire.
Toutes les solutions précédentes publiées ci-dessus calculent la première dérivée, mais elles ne la traitent pas comme une mesure statistique, et les solutions ci-dessus n'essaient pas non plus d'effectuer un lissage préservant / améliorant la fonctionnalité (pour aider les pics subtils à "sauter au-dessus" du bruit).
Enfin, la mauvaise nouvelle: trouver de "vrais" pics devient une douleur royale lorsque le bruit a également des caractéristiques qui ressemblent à de vrais pics (bande passante qui se chevauchent). La solution suivante plus complexe consiste généralement à utiliser un noyau de convolution plus long (une «ouverture de noyau plus large») qui prend en compte la relation entre les pics «réels» adjacents (tels que les taux minimum ou maximum d'occurrence de pic), ou d'utiliser plusieurs la convolution passe en utilisant des noyaux de largeurs différentes (mais seulement si elle est plus rapide: c'est une vérité mathématique fondamentale que les convolutions linéaires exécutées en séquence peuvent toujours être convolutionnées ensemble en une seule convolution). Mais il est souvent beaucoup plus facile de trouver d'abord une séquence de noyaux utiles (de largeurs variables) et de les convoluer ensemble que de trouver directement le noyau final en une seule étape.
Espérons que cela fournisse suffisamment d'informations pour permettre à Google (et peut-être un bon texte de statistiques) de combler les lacunes. J'aurais vraiment aimé avoir le temps de fournir un exemple travaillé, ou un lien vers un. Si quelqu'un en trouve un en ligne, veuillez le poster ici!