6
votes

Raccord de pointe de dimension unique

J'ai une seule gamme de valeurs de point variable (C # double FYI) et j'ai besoin de trouver le "pic" des valeurs ... comme si graphique.

Je ne peux pas simplement prendre la valeur la plus élevée, car le sommet est en fait un plateau qui a de petites fluctuations. Ce plateau est au milieu d'une bouquet de bruit. Je cherche trouver une solution qui me donnerait le centre de ce plateau.

Un exemple de tableau peut ressembler à ceci:

1,2,1,1,1,1,2,2,4,4,4,5,6, 8,8,8,8,7,8,7,9,7 < / forte>, 5,4,4,3,3,2,2,1,1,1,1,1,1,1,1,1

où le pic est quelque part dans la section en gras.

Des idées?


0 commentaires

4 Réponses :


6
votes

Vous pouvez appliquer un filtre passe-bas à votre tableau d'entrée, pour lisser les petites fluctuations, Trouvez ensuite le pic dans les données filtrées. L'exemple le plus simple est probablement un "boxcar" Filtre, où la valeur de sortie est la somme des valeurs d'entrée dans une certaine distance de la position de la matrice actuelle. Dans pseudocode, cela ressemblerait à ceci:

for i = 0, samplecount-1
  if (i < boxcar_radius) or (i >= (samplecount - boxcar_radius))  then
       filtered_data[i] = 0 // boxcar runs off edge of input array, don't use
  else
    filtered_data[i] = 0
    for j = i-boxcar_radius, i+boxcar_radius
       filtered_data[i] = filtered_data[i] + input_data[j]
    endfor
  endif
endfor


0 commentaires

3
votes

Vous devez d'abord définir ce que vous entendez par «petit». Dis, "petite" fluctuation autour du maximum est définie comme une valeur de ε de ε maximum. Ensuite, il est simple d'identifier le plateau.

transmettez les données pour identifier le maximum, puis effectuez une deuxième passe pour identifier toutes les valeurs dans ± ε du maximum.


1 commentaires

Quelques personnes ici ont donné des réponses similaires, la vôtre a été la première. Merci Anon, je n'ai pas pensé à aborder le problème de cette façon. J'ai récupéré les indices de tableau d'une "fenêtre" dans ± ε du maximum, et en moyenne ces deux valeurs. C'est une grande combinaison de vitesse et de précision. Merci encore!



2
votes

la détection de pointe est l'une des étapes de corrélation de phase et autres algorithmes d'estimation de mouvement utilisés dans endroits comme la compression vidéo. Une approche est la suivante: envisager un candidat pour un pic et une fenêtre d'un certain nombre de voisins. Maintenant, adaptez une fonction quadratique à l'aide de la régression standard. Le pic, avec une précision de sous-pixels, est au maximum du quadratique ajusté.


0 commentaires

1
votes

Une solution évidemment exacte dépend des détails. Si votre distribution est toujours belle comme dans votre exemple, vous pourriez avoir:

def GetPeak(l):
  large = max(l) * 0.8
  above_large = [i for i in xrange(len(l)) if l[i] > large]
  left_peak = min(above_large)
  right_peak = max(above_large)
  return (left_peak, right_peak)


0 commentaires