-1

我正在尝试对金融时间序列数据进行去噪(逐秒)。我有一个很长的时间序列,但我一直在使用 100,000 次观察来测试小波去噪 (haar) 的工作情况。它没有。

无论我做什么,重建的信号最终总是几乎与原始信号相同。显然,我想保留原始信号,但我觉得这个序列只是没有被去噪——一个金融时间序列,其唯一的噪声出现在几秒钟​​的分辨率中?此外,即使在最小的时间尺度上,重建图和原始图的图也几乎相同。

我尝试改变母小波、时间序列长度、完成时间序列重建的模式(软与硬),显然,我已经弄乱了阈值本身。我从 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)

我预计重建的信号会与原始信号有很大不同(如平滑、去噪、更少……与原始信号相同),但事实并非如此。在最小的尺度上(想想在 100,000 秒的尺度上每 10 或 20 秒一次),有一些非常小的平滑,基本上只是忽略了大小为 0.01 的峰和谷(可能的最小变化),但它几乎可以忽略不计。

我期待一个信号,嗯,我不知道——去噪了?难道我做错了什么?

4

2 回答 2

0

我遇到了同样的问题,并发现通过在阈值上稳步增加比例因子有所帮助。

我试图对声发射信号进行降噪,但只得到了重建。通过将 sigma 乘以增加的比例因子,我可以找出停止再现信号所需的阈值有多高。

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()
于 2021-06-20T16:06:07.107 回答
0

你的门槛可能太高了。

您应该尝试通过基于每个级别的详细系数的度量来设置它,而不是原始时间跟踪。通常开始于:

threshold=np.std(coeff[i])

从那里开始至少会开始。

于 2019-06-28T15:34:25.977 回答