Почему Wavelet Denoising дает одинаковые результаты независимо от порогового уровня?

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

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

Я пробовал изменить материнский вейвлет, длину временного ряда, режим, в котором выполняется реконструкция временного ряда (мягкий против жесткого), и, очевидно, я испортил само пороговое значение. Я начал с рекомендуемого / стандартного порогового значения sqrt (2 * log (len (signal))), но это практически ничего не дало мне, поэтому я постепенно увеличивал его, пока не дошел до совершенно нелепого 2 * len (signal) * * 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 секунд в масштабе 100000 секунд) есть очень незначительное сглаживание, которое по сути просто игнорирует пики и впадины размера 0,01 (наименьшее возможное изменение), но оно почти незначительно.

Я ожидал, что сигнал будет ... ну не знаю ... с шумоподавлением? Я делаю что-то неправильно?


person TheMathBoi    schedule 27.06.2019    source источник


Ответы (2)


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

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

threshold=np.std(coeff[i])

и переход оттуда, по крайней мере, запустит один.

person NRG    schedule 28.06.2019

У меня была та же проблема, и я обнаружил, что постоянное увеличение масштабного коэффициента на пороге помогло.

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

import pywt
import numpy as np
import matplotlib.pyplot as plt

def madev(d, axis=None):
    """ Mean absolute deviation of a signal """
    return np.mean(np.absolute(d - np.mean(d, axis)), axis)

def wavelet_denoising(x, wavelet, level, s_factor):
    """ 
    deconstructs, thresholds then reconstructs
    higher thresholds = less detailed reconstruction
    """
    coeff = pywt.wavedec(x, wavelet, mode="per")
    sigma = (1/0.6745) * madev(coeff[-level])*s_factor
    uthresh = sigma * np.sqrt(2 * np.log(len(x)))
    coeff[1:] = (pywt.threshold(i, value=uthresh, mode='hard') for i in coeff[1:])
    return pywt.waverec(coeff, wavelet, mode='per')

wav = 'db4'
level=1
for s_factor in np.arange(0,20, 2):

    data = wavelet_denoising(signal, wav, level, s_factor)
    plt.plot(data)
    plt.title('scale factor = {}'.format(s_factor))
    fname = 'wavelet_{}_sf_{}_n_{}'.format(wav, s_factor, len(signal))
    plt.savefig(fname)
    plt.show()
person Jo Grundy    schedule 20.06.2021