Trích xuất / giảm tính năng bằng DWT


7

Đối với một chuỗi thời gian nhất định có độ dài n thời gian, chúng ta có thể sử dụng Biến đổi Wavelet rời rạc (sử dụng sóng con 'Haar'), sau đó chúng ta nhận được (ví dụ: trong 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])

trong đó ca và cd là xấp xỉ và hệ số chi tiết. Bây giờ nếu tôi sử dụng tất cả chúng, tôi có thể xây dựng chuỗi thời gian ban đầu của mình bằng cách sử dụng DWT nghịch đảo. Nhưng thay vào đó, tôi muốn sử dụng một hệ số ít hơn (như trong Biến đổi Fourier nếu chúng ta chỉ sử dụng một vài hệ số đầu tiên, chúng ta có thể xây dựng lại chuỗi thời gian ban đầu). Nếu tôi chỉ sử dụng cahoặc chỉ sử dụng, cdtôi không nhận được kết quả mong muốn. Nếu tôi chỉ sử dụng các hệ số của chúng tôi từ mỗi trong số chúng (như 4 đầu tiên), tôi chỉ nhận được một nửa chuỗi thời gian.

Tôi nên chọn các hệ số (từ cacd) như thế nào để tôi có thể tạo ra tín hiệu gốc từ chúng (nghĩa là phần lớn năng lượng của nó)?

Câu trả lời:


9

Tôi nghĩ rằng nó tương tự như ngưỡng mềm và cứng sử dụng trong khử nhiễu sóng con. Bạn đã đi qua chủ đề này? pywtđã có một chức năng được xây dựng cho mục đích này. Vui lòng xem kỹ mã này và thử chơi với nó:

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()

Điều này sẽ tạo ra sau đây - hy vọng điều này sẽ hướng dẫn bạn.

nhập mô tả hình ảnh ở đây

Lưu ý khi chạy mã với các phiên bản mới nhất:

nếu bạn gặp lỗi như thế này:

mô-đun 'pywt' không có thuộc tính 'ngưỡng'

sử dụng trên dòng 9 và 10:

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

nếu bạn gặp lỗi trên:

plt.keep ('on') sau đó nhận xét dòng này:

  # plt.hold('on')

@theharshest: Vui mừng khi nghe điều đó. Chúc may mắn!
jojek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.