Определите "зависть" набора данных - Python

Я работаю над программным обеспечением, которое должно реализовать вигильность набора данных. Здесь образец ввода, который я получил бы, слился бы с графиком блеска каждой вертикальной полосы пикселей: alt text

Легко видеть, что левый край действительно вигглый (т.е. имеет тонну минимумов/максимумов), и я хочу создать набор критических точек изображения. Я применил гауссовскую функцию сглаживания к данным ~ 10 раз, но для начала она кажется довольно wiggly.

Любые идеи?

Здесь мой оригинальный код, но он не дает очень приятных результатов (для зависти):

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))

Ответы

Ответ 1

Взгляните на фильтры нижних частот/верхних частот/выемок/полосовых фильтров, преобразований Фурье или всплесков. Основная идея заключается в том, что существует множество способов выяснить частотное содержание сигнала, квантованного в разные периоды времени.

Если мы сможем выяснить, что такое вигильность, это поможет. Я бы сказал, что крайний край поля wiggly b/c имеет более высокочастотный контент, который вы могли бы визуализировать, используя преобразование Фурье.

Если вы берете фильтр верхних частот этого красного сигнала, вы получите только высокочастотное содержимое, а затем вы можете измерить амплитуды и сделать пороговые значения, чтобы определить вигильность. Но я предполагаю, что за ним нужно больше формализма.

Ответ 2

Для таких вещей numpy делает вещи намного проще, поскольку предоставляет полезные функции для управления векторными данными, например. добавление скаляра к каждому элементу, вычисление среднего значения и т.д.

Например, вы можете попробовать с нулевым коэффициентом пересечения либо с исходными данными-wiggliness1, либо с первой разницей-wiggliness2 (в зависимости от того, какая вигильность должна быть, точно - если глобальные тенденции следует игнорировать, вы, вероятно, должны использовать данные разности). Для x вы бы взяли фрагмент или окно интереса из исходных данных, получив своего рода меру местной вигильности. Если вы используете исходные данные, после удаления смещения вы также можете установить все значения, меньшие некоторого порога, на 0, чтобы игнорировать малые амплитудные колебания.

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))))))