13

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

Il est facile de voir que la marge de gauche est vraiment wiggly (c.-à-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 gaussienne aux données ~ 10 fois, mais il semble que ce soit assez flou pour commencer.

Des idées?

Voici mon code d'origine, mais il ne produit pas 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)) 
+10

Pourriez-vous poster un lien vers une définition précise de wiggliness? –

+0

La statistique que vous cherchez à caractériser une caractéristique de fréquence ou une caractéristique d'amplitude? – SingleNegationElimination

+1

Si vous demandez un moyen de caractériser Wiggliness au lieu d'un moyen d'implémenter cette caractérisation par programme, vous pouvez avoir plus de chance sur http://stats.stackexchange.com/. – katrielalex

Répondre

5

Jetez un oeil à des filtres passe-bas/passe-haut/notch/passe-bande, Transformées de Fourier ou vaguelettes. L'idée de base est qu'il existe de nombreuses façons de déterminer le contenu fréquentiel d'un signal quantifié sur différentes périodes.

Si nous pouvons comprendre ce que wiggliness est, cela aiderait. Je dirais que la marge la plus à gauche est wiggly b/c il a plus de contenu à haute fréquence, que vous pourriez visualiser en utilisant une transformée de Fourier. Si vous prenez un filtre passe-haut de ce signal rouge, vous obtiendrez seulement le contenu haute fréquence, et vous pourrez alors mesurer les amplitudes et faire des seuils pour déterminer le wiggliness. Mais je suppose que Wiggliness a juste besoin de plus de formalisme derrière.

+0

Merci! Je vais les regarder. J'essaie toujours de comprendre ce que signifie toute cette terminologie;) – Blender

1

Pour des choses comme celles-ci, numpy rend les choses beaucoup plus faciles, car il fournit des fonctions utiles pour manipuler des données vectorielles, par ex. Par exemple, vous pouvez essayer avec le taux de passage à zéro de l'original data-wiggliness1 ou de la première différence-wiggliness2 (en fonction de ce que wiggliness est censé être, exactement-si les tendances globales doivent être ignorées, vous devriez probablement utiliser les données de différence). Pour x, vous devez prendre la tranche ou la fenêtre d'intérêt à partir des données d'origine, obtenant une sorte de mesure de la torsion locale. Si vous utilisez les données d'origine, après avoir supprimé le biais, vous pouvez également définir toutes les valeurs inférieures à un certain seuil sur 0 pour ignorer les oscillations 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)))))) 
+0

Merci, je n'ai jamais pensé à ça. Je pense que je vais l'utiliser, car mon algorithme de lissage supprime certains points critiques ... – Blender

Questions connexes