13

Estoy trabajando en una pieza de software que necesita para implementar la wiggliness de un conjunto de datos. He aquí una muestra de la entrada iba a recibir, se fusionó con la trama ligereza de cada tira de píxeles verticales: alt textDetermine "wiggliness" del conjunto de datos - Python

Es fácil ver que el margen izquierdo es realmente ondulada (es decir, tiene una tonelada de mínimos/máximos), y quiero generar un conjunto de puntos críticos de la imagen. Apliqué una función de suavizado de Gauss a los datos ~ 10 veces, pero parece ser bastante ondulante para empezar.

¿Alguna idea?

Aquí está mi código original, pero no produce muy buenos resultados (para el 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

¿Podría publicar un enlace a una definición precisa de wiggliness? –

+0

¿La estadística que busca caracteriza una función de frecuencia o una función de amplitud? – SingleNegationElimination

+1

Si está preguntando sobre una manera de caracterizar la wiggliness en lugar de una forma de implementar esa caracterización programáticamente, puede tener más suerte en http://stats.stackexchange.com/. – katrielalex

Respuesta

5

Tome un vistazo a paso bajo/paso alto/muesca/filtros de paso de banda, transformadas de Fourier, o wavelets. La idea básica es que hay muchas formas diferentes de determinar el contenido de frecuencia de una señal cuantificada en diferentes períodos de tiempo.

Si podemos descubrir qué es la wiggliness, eso ayudaría. Yo diría que el margen más a la izquierda es ondulante b/c tiene más contenido de alta frecuencia, que se puede visualizar mediante el uso de una transformada de Fourier.

Si toma un filtro de paso alto de esa señal roja, obtendrá solo el contenido de alta frecuencia y luego podrá medir las amplitudes y los umbrales para determinar la ondulación. Pero supongo que la wiggliness solo necesita más formalismo detrás de esto.

+0

Gracias! Los echaré un vistazo. Todavía estoy intentando descubrir qué significa toda esta terminología;) – Blender

1

Para cosas como estas, numpy hace las cosas mucho más fáciles, ya que proporciona funciones útiles para manipular datos vectoriales, p. agregar un escalar a cada elemento, calcular el valor promedio, etc.

Por ejemplo, puede intentar con la tasa de cruce cero de la original-wiggliness1 o la primera difference-wiggliness2 (dependiendo de qué wiggliness se supone que sea, exactamente, si las tendencias globales deben ignorarse, probablemente debería usar los datos de diferencia). Para x tomaría la porción o ventana de interés de los datos originales, obteniendo una especie de medida de la fluctuación local. Si utiliza los datos originales, después de eliminar el sesgo, es posible que también desee establecer todos los valores menores que algunos umbrales en 0 para ignorar ondulaciones de baja amplitud.

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

Gracias, nunca pensé en eso. Creo que usaré eso, ya que mi algoritmo de suavizado elimina algunos puntos críticos ... – Blender

Cuestiones relacionadas