13

Pracuję na kawałku oprogramowania, które musi wprowadzić wiggliness zestawu danych. Oto próbka wejścia chciałbym otrzymać, połączyła się z działki lekkość każdego pionowego paska pikseli: alt textOkreślić "wiggliness" zestawu danych - Python

Łatwo jest zauważyć, że lewy margines jest naprawdę wiggly (czyli ma mnóstwo minimów/maksimów) i chcę wygenerować zestaw krytycznych punktów obrazu. Zastosowałem funkcję wygładzania Gaussa do danych ~ 10 razy, ale wydaje mi się, że początkowo jest to dość nierozważne.

Wszelkie pomysły?

Oto mój oryginalny kod, ale nie produkują bardzo ładne wyniki (dla 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

Czy możesz zamieścić link do dokładnej definicji wiggliness? –

+0

Czy statystyka, którą chcesz scharakteryzować, ma cechę częstotliwości lub funkcję amplitudy? – SingleNegationElimination

+1

Jeśli pytasz o sposób scharakteryzowania wiggliness zamiast sposobu zaimplementowania tej charakterystyki programowo, możesz mieć więcej szczęścia na http://stats.stackexchange.com/. – katrielalex

Odpowiedz

5

Spójrz na dolnoprzepustowy/górnoprzepustowy/wycięcie/filtry pasmowe, transformaty Fouriera lub falki. Podstawową ideą jest to, że istnieje wiele różnych sposobów obliczania zawartości częstotliwościowej skwantyzowanego sygnału w różnych okresach czasu.

Jeśli uda nam się ustalić, jaka to jest skromność, to mogłoby pomóc. Powiedziałbym, że lewy skrajny margines jest falisty b/c ma więcej zawartości o wysokiej częstotliwości, które można było wizualizować za pomocą transformacji Fouriera.

Jeśli weźmiesz filtr górnoprzepustowy tego czerwonego sygnału, dostaniesz tylko zawartość o wysokiej częstotliwości, a następnie możesz zmierzyć amplitudy i zrobić progi, aby określić wagę. Ale myślę, że wiggliness potrzebuje więcej formalizmu.

+0

Dzięki! Przyjrzę im się. Wciąż próbuję dowiedzieć się, co oznacza ta cała terminologia;) – Blender

1

Dla takich rzeczy, numpy znacznie ułatwia, ponieważ zapewnia przydatne funkcje do manipulowania danymi wektorowymi, np. dodawanie skalaru do każdego elementu, obliczanie średniej wartości itd.

Przykładowo, możesz próbować z zerowym współczynnikiem przekroczenia albo pierwotnej wiggliness1 danych, albo pierwszej różnicy-wiggliness2 (w zależności od tego, jaka to powinna być wiggota, dokładnie - jeśli globalne trendy mają być ignorowane, prawdopodobnie powinieneś użyć danych różnicowych). W przypadku x możesz wziąć wycinek lub okno zainteresowania z oryginalnych danych, uzyskując pewną miarę lokalnej wiggliness. Jeśli korzystasz z oryginalnych danych, po usunięciu stronniczości możesz również ustawić wszystkie wartości mniejsze niż próg na 0, aby zignorować ruchy o małej amplitudzie.

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

Dzięki, nigdy o tym nie myślałem. Myślę, że wykorzystam to, ponieważ mój algorytm wygładzania usuwa pewne krytyczne punkty ... – Blender

Powiązane problemy