Je peux écrire quelque chose moi-même en trouvant des passages par zéro du premier dérivé ou quelque chose du genre, mais cela semble être une fonction assez courante pour être incluse dans les bibliothèques standard. Quelqu'un en connait un?
Mon application particulière est un tableau 2D, mais il serait généralement utilisé pour trouver des pics dans les FFT, etc.
Plus précisément, dans ces types de problèmes, il y a plusieurs pics forts, puis beaucoup de "pics" plus petits qui sont juste causés par du bruit qui doit être ignoré. Ce ne sont que des exemples; pas mes données réelles:
Pics à une dimension:
Pics bidimensionnels:
L'algorithme de recherche de pics trouverait l'emplacement de ces pics (pas seulement leurs valeurs) et, idéalement, trouverait le véritable pic inter-échantillon, pas seulement l'indice avec la valeur maximale, probablement en utilisant une interpolation quadratique ou quelque chose du genre.
En règle générale, vous ne vous souciez que de quelques pics forts, ils seraient donc soit choisis parce qu'ils sont au-dessus d'un certain seuil, soit parce qu'ils sont les n premiers pics d'une liste ordonnée, classés par amplitude.
Comme je l'ai dit, je sais écrire moi-même quelque chose comme ça. Je demande simplement s'il existe une fonction ou un package préexistant qui fonctionne bien.
Mettre à jour:
J'ai traduit un script MATLAB et cela fonctionne décemment pour le cas 1-D, mais pourrait être mieux.
Mise à jour mise à jour:
sixtenbe a créé une meilleure version pour le cas 1-D.
la source
find_peaks
, j'ai donc ajouté cette réponse qui pourrait être utile pour référence future. (Je suis sûr que vous l'avez déjà trouvé depuis 2009 mais c'est pour d'autres personnes + moi-même quand je me poserai la question à nouveau dans quelques années!)Réponses:
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.D'après mes tests et la documentation, le concept de proéminence est "le concept utile" pour garder les bons pics, et écarter les pics bruyants.
Qu'est-ce que la proéminence (topographique) ? C'est "la hauteur minimale nécessaire pour descendre pour aller du sommet à tout terrain plus élevé" , comme on peut le voir ici:
L'idée est:
Tester:
J'ai utilisé une sinusoïde (bruyante) à fréquence variable car elle présente de nombreuses difficultés. Nous pouvons voir que le
width
paramètre n'est pas très utile ici car si vous définissez un minimumwidth
trop élevé, il ne pourra pas suivre les pics très proches dans la partie haute fréquence. Si vous réglezwidth
trop bas, vous auriez de nombreux pics indésirables dans la partie gauche du signal. Même problème avecdistance
.threshold
se compare uniquement avec les voisins directs, ce qui n'est pas utile ici.prominence
est celui qui donne la meilleure solution. Notez que vous pouvez combiner plusieurs de ces paramètres!Code:
la source
Je regarde un problème similaire et j'ai trouvé que certaines des meilleures références proviennent de la chimie (des pics trouvés dans les données de spécification de masse). Pour un bon examen approfondi des algorithmes de recherche de pics, lisez ceci . C'est l'une des meilleures critiques les plus claires des techniques de recherche de pics que j'ai rencontrées. (Les ondelettes sont les meilleures pour trouver des pics de ce type dans des données bruyantes.).
Il semble que vos pics sont clairement définis et ne sont pas cachés dans le bruit. Cela étant le cas, je recommanderais d'utiliser des dérivés savtizky-golay lisses pour trouver les pics (si vous différenciez simplement les données ci-dessus, vous aurez un désordre de faux positifs.). C'est une technique très efficace et assez facile à implémenter (vous avez besoin d'une classe de matrice avec des opérations de base). Si vous trouvez simplement le passage à zéro du premier dérivé SG, je pense que vous serez heureux.
la source
Il y a une fonction dans scipy nommée
scipy.signal.find_peaks_cwt
qui semble convenir à vos besoins, mais je n'ai pas d'expérience avec elle, donc je ne peux pas recommander.http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
la source
Pour ceux qui ne savent pas quels algorithmes de recherche de pics utiliser en Python, voici un rapide aperçu des alternatives: https://github.com/MonsieurV/py-findpeaks
En me voulant un équivalent à la
findpeaks
fonction MatLab , j'ai trouvé que la fonction detect_peaks de Marcos Duarte est une bonne prise.Assez facile à utiliser:
Ce qui vous donnera:
la source
find_peaks
fonction a été ajoutéescipy
.La détection fiable des pics d'un spectre a été assez étudiée, par exemple tous les travaux sur la modélisation sinusoïdale des signaux musicaux / audio dans les années 80. Recherchez «Modélisation sinusoïdale» dans la littérature.
Si vos signaux sont aussi propres que l'exemple, un simple "donnez-moi quelque chose avec une amplitude supérieure à N voisins" devrait fonctionner raisonnablement bien. Si vous avez des signaux bruyants, un moyen simple mais efficace est de regarder vos pics dans le temps, de les suivre: vous détectez alors des raies spectrales au lieu de pics spectraux. IOW, vous calculez la FFT sur une fenêtre glissante de votre signal, pour obtenir un ensemble de spectre dans le temps (également appelé spectrogramme). Vous regardez ensuite l'évolution du pic spectral dans le temps (ie dans des fenêtres consécutives).
la source
Je ne pense pas que ce que vous recherchez soit fourni par SciPy. J'écrirais le code moi-même, dans cette situation.
L'interpolation et le lissage des splines de scipy.interpolate sont assez agréables et pourraient être très utiles pour ajuster les pics et trouver ensuite l'emplacement de leur maximum.
la source
Il existe des fonctions et des méthodes statistiques standard pour trouver des valeurs aberrantes aux données, ce dont vous avez probablement besoin dans le premier cas. L'utilisation de dérivés résoudrait votre deuxième. Je ne suis cependant pas sûr d'une méthode qui résout à la fois les fonctions continues et les données échantillonnées.
la source
Tout d'abord, la définition de «pic» est vague si elle n'est pas spécifiée. Par exemple, pour la série suivante, appelleriez-vous 5-4-5 un pic ou deux?
1-2-1-2-1-1-5-4-5-1-1-5-1
Dans ce cas, vous aurez besoin d'au moins deux seuils: 1) un seuil haut seulement au-dessus duquel une valeur extrême peut enregistrer comme un pic; et 2) un seuil bas pour que les valeurs extrêmes séparées par de petites valeurs en dessous de lui deviennent deux pics.
La détection des pics est un sujet bien étudié dans la littérature sur la théorie des valeurs extrêmes, également connu sous le nom de «désintégration des valeurs extrêmes». Ses applications typiques comprennent l'identification des événements dangereux sur la base de lectures continues de variables environnementales, par exemple l'analyse de la vitesse du vent pour détecter les événements de tempête.
la source