Question

Je travaille sur un logiciel qui doit mettre en œuvre le wiggliness d'un ensemble de données. Voici un exemple de l'entrée que je recevrais, a fusionné avec la parcelle légèreté de chaque bande de pixel vertical: text alt

Il est facile de voir que la marge de gauche est vraiment wiggly (à savoir a une tonne de minima / maxima), et je veux générer un ensemble de points critiques de l'image. J'ai appliqué une fonction de lissage gaussien aux données ~ 10 fois, mais il semble être assez tortille pour commencer.

Toutes les idées?

Voici mon code d'origine, mais il ne produit pas de résultats très agréable (pour le wiggliness):

def local_maximum(list, center, delta):
  maximum = [0, 0]

  for i in range(delta):
    if list[center + i] > maximum[1]: maximum = [center + i, list[center + i]]
    if list[center - i] > maximum[1]: maximum = [center - i, list[center - i]]

  return maximum

def count_maxima(list, start, end, delta, threshold = 10):
      count = 0

  for i in range(start + delta, end - delta):
    if abs(list[i] - local_maximum(list, i, delta)[1]) < threshold: count += 1

  return count

def wiggliness(list, start, end, delta, threshold = 10):
  return float(abs(start - end) * delta) / float(count_maxima(list, start, end, delta, threshold))
Était-ce utile?

La solution

Jetez un oeil à passe-bas / passe-haut / coupe-bande / passe-bande, Transformées de Fourier ou vaguelettes. L'idée de base est qu'il ya beaucoup de façons différentes de comprendre la teneur en fréquence d'un signal quantifié sur plusieurs périodes de temps.

Si nous pouvons comprendre ce qui est wiggliness, cela aiderait. Je dirais que la marge est plus à gauche wiggly b / c il a plus de contenu à haute fréquence, que vous pouvez visualiser en utilisant une transformée de Fourier.

Si vous prenez un filtre passe-haut de ce signal rouge, vous aurez juste la teneur élevée en fréquence, et vous pouvez mesurer les amplitudes et faire des seuils pour déterminer wiggliness. Mais je suppose que wiggliness a juste besoin de plus formalisme derrière.

Autres conseils

Pour des choses comme celles-ci, numpy rend les choses beaucoup plus facile, car il fournit des fonctions utiles pour manipuler des données vectorielles, par exemple l'ajout d'un scalaire à chaque élément, le calcul de la valeur moyenne etc.

Par exemple, vous pouvez essayer avec un taux zéro de passage soit l'origine des données wiggliness1 ou la première différence wiggliness2 (selon ce que wiggliness est censé être, exactement, si les tendances mondiales doivent être ignorées, vous devriez probablement utiliser les données de différence). Pour x vous prendriez la tranche ou d'une fenêtre d'intérêt à partir des données d'origine, obtenir une sorte de mesure de wiggliness locale. Si vous utilisez les données d'origine, après avoir enlevé le biais, vous pouvez également définir toutes les valeurs inférieures à un certain seuil à 0 pour ignorer Wiggles de faible amplitude.

import numpy as np

def wiggliness1(x):
    #remove bias:
    x=x-np.average(x)
    #calculate zero crossing rate:
    np.sum(np.abs(np.sign(np.diff(x))))


def wiggliness(x):
    #calculate zero crossing rate of the first difference:
    return np.sum(np.abs(np.sign(np.diff(np.sign(np.diff(x))))))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top