13

Ich arbeite an einem Stück Software, die die Wiggliness einer Reihe von Daten implementieren muss. Hier ist ein Beispiel des Eingangs würde ich erhalten, mit der Leichtigkeit Plot jedes vertikale Pixelstreifen verschmolzen: alt textBestimmen Sie "Wiggliness" von Datensätzen - Python

Es ist leicht zu sehen, dass der linke Rand ist wirklich Verwackeln (dh eine Tonne Minima/Maxima), und ich möchte eine Reihe von kritischen Punkten des Bildes erzeugen. Ich habe eine Gaußsche Glättungsfunktion ~ 10 Mal auf die Daten angewendet, aber es scheint ziemlich wackelig zu sein.

Irgendwelche Ideen?

Hier ist meine Original-Code, aber es erzeugt keine sehr schöne Ergebnisse (für die 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

Könnten Sie einen Link zu einer genauen Definition von Wiggliness veröffentlichen? –

+0

Ist die Statistik, die Sie suchen, um ein Frequenz- oder Amplitudenmerkmal zu charakterisieren? – SingleNegationElimination

+1

Wenn Sie nach einer Möglichkeit suchen, die Wigglinigkeit zu charakterisieren, anstatt diese programmatisch zu implementieren, haben Sie vielleicht mehr Glück auf http://stats.stackexchange.com/. – katrielalex

Antwort

5

Werfen Sie einen Blick auf Tiefpass-/Hochpass/Notch/Bandpaßfiltern, Fourier-Transformationen oder Wavelets. Die Grundidee ist, dass es viele verschiedene Möglichkeiten gibt, den Frequenzinhalt eines Signals zu bestimmen, das über verschiedene Zeiträume quantisiert wird.

Wenn wir herausfinden können, was Wiggliness ist, würde das helfen. Ich würde sagen, der linke Rand ist wackeln b/c hat mehr Hochfrequenz-Inhalt, den Sie mit einer Fourier-Transformation visualisieren könnten.

Wenn Sie ein Hochpass-Filter dieses roten Signals nehmen, erhalten Sie nur den hochfrequenten Inhalt, und dann können Sie die Amplituden messen und Schwellenwerte festlegen, um die Wigglinigkeit zu bestimmen. Aber ich denke, Wigglinigkeit braucht einfach mehr Formalismus dahinter.

+0

Danke! Ich werde sie mir ansehen. Ich probiere immer noch aus, was diese ganze Terminologie bedeutet;) – Blender

1

Für solche Dinge macht numpy die Dinge viel einfacher, da es nützliche Funktionen zum Manipulieren von Vektordaten bereitstellt, z. Hinzufügen eines Skalars zu jedem Element, Berechnen des Durchschnittswerts etc.

Zum Beispiel könnten Sie versuchen mit Nulldurchgangsrate entweder der ursprünglichen Daten-Wiggliness1 oder der ersten Differenz-Wiggliness2 (je nachdem, was Wiggliness sein soll, genau - wenn globale Trends ignoriert werden sollen, sollten Sie wahrscheinlich die Differenzdaten verwenden. Für x würden Sie die Scheibe oder das Fenster von Interesse aus den Originaldaten nehmen und eine Art Maß an lokaler Wigglinigkeit erhalten. Wenn Sie die ursprünglichen Daten verwenden, sollten Sie nach dem Entfernen der Verzerrung auch alle Werte kleiner als einen Schwellenwert auf 0 setzen, um Wiggles mit geringer Amplitude zu ignorieren.

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

Danke, daran habe ich nie gedacht. Ich denke, ich werde das verwenden, da mein Glättungsalgorithmus einige kritische Punkte entfernt ... – Blender

Verwandte Themen