DWTを使用した特徴の抽出/削減


7

nタイムスタンプの長さの特定の時系列に対して、(「Haar」ウェーブレットを使用して)離散ウェーブレット変換を実行し、次に取得します(たとえば、Pythonで)-

>>> import pywt
>>> ts = [2, 56, 3, 22, 3, 4, 56, 7, 8, 9, 44, 23, 1, 4, 6, 2]
>>> (ca, cd) = pywt.dwt(ts,'haar')
>>> ca
array([ 41.01219331,  17.67766953,   4.94974747,  44.54772721,
        12.02081528,  47.37615434,   3.53553391,   5.65685425])
>>> cd
array([-38.18376618, -13.43502884,  -0.70710678,  34.64823228,
        -0.70710678,  14.8492424 ,  -2.12132034,   2.82842712])

ここで、caとcdは近似係数と詳細係数です。これらすべてを使用すると、逆DWTを使用して元の時系列を構築できます。ただし、代わりに使用する係数を減らしたい(最初の数個の係数のみを使用する場合のフーリエ変換のように、元の時系列をほぼ再構築できます)。使用しcaたり使用したりcdしても、望ましい結果が得られません。(最初の4のように)それぞれの係数のみを使用すると、時系列の半分しか得られません。

係数(caおよびからcd)を選択して、それらから元の信号(つまり、そのエネルギーのほとんど)をほぼ作成できるようにするにはどうすればよいですか?

回答:


9

ウェーブレットのノイズ除去で使用するソフトおよびハードしきい値処理に似ていると思います。このトピックに出くわしましたか?pywtこの目的のための組み込み関数がすでにあります。このコードを詳しく見て、それを試してみてください。

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

ts = [2, 56, 3, 22, 3, 4, 56, 7, 8, 9, 44, 23, 1, 4, 6, 2]

(ca, cd) = pywt.dwt(ts,'haar')

cat = pywt.thresholding.soft(ca, np.std(ca)/2)
cdt = pywt.thresholding.soft(cd, np.std(cd)/2)

ts_rec = pywt.idwt(cat, cdt, 'haar')

plt.close('all')

plt.subplot(211)
# Original coefficients
plt.plot(ca, '--*b')
plt.plot(cd, '--*r')
# Thresholded coefficients
plt.plot(cat, '--*c')
plt.plot(cdt, '--*m')
plt.legend(['ca','cd','ca_thresh', 'cd_thresh'], loc=0)
plt.grid('on')

plt.subplot(212)
plt.plot(ts)
plt.hold('on')
plt.plot(ts_rec, 'r')
plt.legend(['original signal', 'reconstructed signal'])
plt.grid('on')
plt.show()

これは以下を生み出します-これがあなたを導くことを願っています。

ここに画像の説明を入力してください

最新バージョンでコードを実行する場合の注意:

次のようなエラーが発生した場合:

モジュール 'pywt'には属性 'thresholding'がありません

9行目と10行目で使用します。

 cat = pywt.threshold(ca, np.std(ca)/2, mode='soft')
 cdt = pywt.threshold(cd, np.std(cd)/2, mode='soft')

エラーが発生した場合:

plt.hold( 'on')次に、この行をコメント化します。

  # plt.hold('on')

@theharshest:それを聞いてうれしい。幸運を!
jojek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.