-1

金融時系列データのノイズを除去しようとしています (秒ごと)。私は非常に長い時系列を持っていますが、ウェーブレットのノイズ除去 (haar) がどれだけうまく機能するかをテストするためだけに、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)

再構築された信号は元の信号とは大幅に異なると予想していましたが (平滑化され、ノイズが除去され、元の信号とまったく同じではありません)、そうではありませんでした。最小のスケール (100,000 秒のスケールで 10 秒または 20 秒ごとと考えてください) では、サイズ 0.01 のピークと谷を本質的に無視する非常にマイナーなスムージングがあります (可能な最小の変化) が、ほとんど無視できます。

私は信号を期待していました。私は何か間違ったことをしていますか?

4

2 に答える 2

0

私は同じ問題を抱えており、しきい値の倍率を着実に増やすことで発見しました。

アコースティック エミッション信号のノイズ除去を試みましたが、再構成しか得られませんでした。シグマに増加するスケール係数を掛けることで、信号の再生を停止するために必要なしきい値をどれだけ高くする必要があるかを知ることができました.

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 に答える