Определить «волнистость» набора данных - Python - PullRequest
13 голосов
/ 16 ноября 2010

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

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

Есть идеи?

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

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

Ответы [ 2 ]

5 голосов
/ 17 ноября 2010

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

Если мы сможем выяснить, что такое волнистость, это поможет.Я бы сказал, что крайний левый край - волнистый, потому что он имеет более высокочастотный контент, который можно визуализировать с помощью преобразования Фурье.

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

1 голос
/ 17 ноября 2010

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

Например, вы можете попробоватьпри скорости пересечения нуля либо исходной волнистости данных1, либо первой разности-волнистости2 (в зависимости от того, какой должна быть волнистость, в точности - если глобальные тренды следует игнорировать, вам, вероятно, следует использовать разностные данные).Для 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))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...