我正在尝试将财务时间序列数据(第二(。我有一个很长时间的系列,但是我一直在处理100,000个观察,只是为了测试小波DeNoising(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的峰值和山谷(最小的更改(,但几乎可以忽略不计。<<<<<<<<<<<<<<
我期望一个信号,我不知道 - 被剥夺了吗?我做错了吗?
您的阈值可能太高。
您应该尝试根据每个级别的详细信息系数而不是原始时间跟踪设置它。通常从:
开始threshold=np.std(coeff[i])
至少从那里开始一个。
我也有相同的问题,并通过稳步增加阈值的比例因素有帮助。
我试图降低声发射信号,并且只有重建。通过将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()