13

Sto lavorando a un software che deve implementare la giocosità di un set di dati. Ecco un esempio dell'ingresso avrei ricevuto, è fusa con la trama leggerezza di ciascuna striscia pixel verticale: alt textDeterminare "wiggliness" del set di dati - Python

È facile vedere che il margine sinistro è davvero sinuoso (cioè ha una tonnellata di minimi/massimi), e voglio generare una serie di punti critici dell'immagine. Ho applicato una funzione di smoothing gaussiana ai dati ~ 10 volte, ma sembra essere abbastanza sinuosa per cominciare.

Qualche idea?

Ecco il mio codice originale, ma non produce molto bello risultati (per la 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

Potresti postare un link per una definizione accurata di wiggliness? –

+0

La statistica che si sta cercando di caratterizzare una funzione di frequenza o una funzione di ampiezza? – SingleNegationElimination

+1

Se stai chiedendo un modo per caratterizzare la giocosità invece di un modo per implementare tale caratterizzazione a livello di codice, potresti avere più fortuna su http://stats.stackexchange.com/. – katrielalex

risposta

5

Date un'occhiata a passa-basso/passa-alto/notch/filtri passa-banda, trasformate di Fourier, o piccole onde. L'idea di base è che ci sono molti modi diversi per capire il contenuto di frequenza di un segnale quantizzato su diversi periodi di tempo.

Se riusciamo a capire che cosa sia, questo potrebbe aiutare. Direi che il margine più a sinistra è sinistramente b/c ha più contenuto ad alta frequenza, che è possibile visualizzare utilizzando una trasformata di Fourier.

Se si prende un filtro passa-alto di quel segnale rosso, si otterrà solo il contenuto ad alta frequenza, e quindi è possibile misurare le ampiezze e fare le soglie per determinare la baldoria. Ma immagino che la sciatteria abbia solo bisogno di più formalismo.

+0

Grazie! Li darò un'occhiata. Sto ancora cercando di capire cosa significhi tutta questa terminologia;) – Blender

1

Per cose come queste, numpy rende le cose molto più semplici, poiché fornisce utili funzioni per manipolare i dati vettoriali, ad es. aggiungendo uno scalare a ciascun elemento, calcolando il valore medio, ecc.

Ad esempio, si potrebbe provare con una velocità di incrocio pari a zero del wiggliness dei dati originale1 o della prima differenza-wiggliness2 (a seconda di quale dovrebbe essere il wiggliness, esattamente - se le tendenze globali devono essere ignorate, dovresti probabilmente usare i dati delle differenze). Per x si prenderà la fetta o la finestra di interesse dai dati originali, ottenendo una sorta di misura di wiggliness locale. Se si utilizzano i dati originali, dopo aver rimosso il bias si potrebbe anche voler impostare tutti i valori più piccoli di qualche soglia su 0 per ignorare le vibrazioni di ampiezza bassa.

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

Grazie, non ci avevo mai pensato. Penso che lo userò, poiché il mio algoritmo di smoothing rimuove alcuni punti critici ... – Blender