Почему Wavelet Denoising дает одинаковые результаты независимо от порогового уровня? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь обесценить финансовые данные временных рядов (секунда за секундой). У меня очень длинный временной ряд, но я работал с 100 000 наблюдений, просто чтобы проверить, насколько хорошо работает шумоподавление (хаар) вейвлета. Это не так.

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

Я пытался изменить материнский вейвлет, длину временного ряда, режим, в котором выполняется реконструкция временного ряда (мягкий против жесткого), и, очевидно, я перепутал само пороговое значение. Я начал с рекомендуемого / стандартного порогового значения sqrt (2 * log (len (сигнал))), но это практически ничего не сделало для меня, поэтому я постепенно увеличивал его, пока не достиг совершенно нелепой 2 * len (сигнал) * * 2 - который должен был сгладить график до неузнаваемости, но в основном ничего не сделал.

WAVELET = "haar"
LEVEL = 2 

signal = training_series
mean = signal.mean()
mean_series = [mean] * len(signal)
signal = [a - b for a, b in zip(signal, mean_series)]

coeffs = pywt.wavedec(signal, WAVELET, level=LEVEL)
sigma = mad(coeffs[-LEVEL])
threshold = sigma * np.sqrt(2*np.log(len(signal)))
coeffs[1:] = (pywt.threshold(i, value=threshold, mode="soft" ) for i in coeffs[1:])
reconstructed_signal = pywt.waverec(coeffs, WAVELET)

Я ожидал, что восстановленный сигнал будет значительно отличаться от исходного сигнала (например, сглаженный, с шумом, менее ... идентичный оригиналу), но это не имело место. Наименьшая шкала (подумайте каждые 10 или 20 секунд на шкале 100 000 секунд), есть некоторое очень незначительное сглаживание, которое, по сути, просто игнорирует пики и впадины размером 0,01 (наименьшее возможное изменение), но оно практически ничтожно.

Я ожидал сигнала, который, ну, я не знаю, - не слышал? Я что-то не так делаю?

1 Ответ

0 голосов
/ 28 июня 2019

Ваш порог может быть слишком высоким.

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

threshold=np.std(coeff[i])

и оттуда, по крайней мере, вы начинаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...