Pendahuluan
Saat melakukan analisis CWT menggunakan pustaka PyWavelets (perangkat lunak open source gratis yang dirilis di bawah lisensi MIT), ada masalah dengan memvisualisasikan hasilnya. Program uji visualisasi
yang diusulkan oleh pengembang ditunjukkan dalam daftar berikut:
Daftarimport pywt import numpy as np import matplotlib.pyplot as plt t = np.linspace(-1, 1, 200, endpoint=False) sig = np.cos(2 * np.pi * 7 * t) + np.real(np.exp(-7*(t-0.4)**2)*np.exp(1j*2*np.pi*2*(t-0.4))) widths = np.arange(1, 31) cwtmatr, freqs = pywt.cwt(sig, widths, 'cmor1-1.5') plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto', vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
Saat bekerja dengan wavelet yang kompleks, misalnya dengan 'cmor1-1.5', program menghasilkan kesalahan:
File"C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\image.py", line 642, in set_data raise TypeError("Image data cannot be converted to float") TypeError: Image data cannot be converted to float
Kesalahan ini, serta kesulitan dalam memilih skala (lebar) untuk memberikan resolusi temporal yang diperlukan, menyulitkan, terutama bagi pengguna pemula, untuk mempelajari analisis CWT, yang mendorong saya untuk menulis artikel pendidikan ini.
Tujuan dari publikasi ini adalah untuk mempertimbangkan penggunaan
modul visualisasi
scaleogram baru untuk analisis sinyal sederhana dan khusus, serta ketika menggunakan metode normalisasi, penskalaan dan sintesis logaritmik, yang memberikan informasi tambahan dalam analisis deret waktu.
Artikel ini menggunakan informasi dari publikasi
"Pengantar wavelet untuk analisis data" . Dalam daftar contoh yang diberikan dalam publikasi, kesalahan diperbaiki, dan setiap daftar contoh dibawa ke formulir selesai, yang memungkinkan untuk digunakan tanpa pengenalan dengan yang sebelumnya. Untuk analisis wavelet sinyal khusus, data dari database
sampel PyWavelets digunakan.
Skalogram wavelet adalah representasi dua dimensi dari data satu dimensi. Waktu diplot pada sumbu X, dan skala pada sumbu Y adalah hasil dari transformasi wavelet dari sinyal yang sesuai dengan amplitudo sinyal pada waktu X. Nilai analitik dari tampilan grafik sinyal adalah bahwa resolusi waktu ditampilkan pada sumbu Y, yang memberikan informasi tambahan tentang sifat dinamis dari sinyal.
Wavelet - Skalogram Sinyal Sederhana
1. Gelombang kosinus dengan amplop Gaussian (Mengganti wavelet. Anda dapat mempelajari ketergantungan resolusi waktu pada skala):
Daftar from numpy import* from pylab import* import scaleogram as scg import pywt
Fungsi wavelet untuk konversi sinyal: cmor1-1.5 (wavelet Morlet Kompleks)


Sinyal periodik sekarang muncul dalam bentuk strip kontinu horisontal pada titik Y = p1, intensitasnya bervariasi tergantung pada amplitudo sinyal periodik.
Ada beberapa ketidakjelasan dalam pendeteksian, karena bandwidth tidak sama dengan nol, ini disebabkan oleh fakta bahwa wavelet tidak mendeteksi satu frekuensi, melainkan sebuah band. Efek ini dikaitkan dengan bandwidth wavelet.
2. Tiga pulsa ditambahkan secara berurutan dengan periode yang meningkat (Untuk mempertimbangkan variasi periodik pada skala yang berbeda: analisis multi-resolusi):
Daftar from numpy import* import pandas as pd from pylab import* import scaleogram as scg


Impuls muncul di tempat yang diharapkan Y, sesuai dengan periodisitasnya, mereka dilokalisasi dalam frekuensi dan waktu. Awal strip dan ujung sesuai dengan denyut nadi.
Bandwidth berskala dengan panjang periode. Ini adalah properti transformasi wavelet yang terkenal: ketika skala meningkat, resolusi waktu berkurang. Ini juga dikenal sebagai pertukaran antara waktu dan frekuensi. Ketika Anda melihat spektrogram jenis ini, Anda melakukan banyak analisis resolusi.
3. Tiga osilasi periodik dari frekuensi yang berbeda secara bersamaan (Wavelet - analisis dapat membedakan komponen sinyal dengan frekuensi, jika perbedaannya signifikan):
Daftar from numpy import* import pandas as pd from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


4. Sinyal periodik non-sinusoidal (Perbedaan dalam transformasi wavelet dari sinyal gelombang segitiga dengan periode 30 detik dari yang sebelumnya dianggap dipertimbangkan):
Daftar from numpy import* from pylab import* import scipy.signal import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


Sebuah band besar adalah harmonik pertama. Harmoni kedua terlihat persis pada setengah nilai periode harmonik pertama. Ini adalah hasil yang diharapkan untuk sinyal non-sinusoidal berkala. Elemen vertikal fuzzy muncul di sekitar harmonik kedua, yang lebih lemah dan memiliki amplitudo 1/4 dari yang pertama untuk bentuk gelombang segitiga.
5. Impuls halus (Gaussians) mirip dengan struktur data nyata. (Contoh ini menunjukkan cara menggunakan analisis wavelet untuk mendeteksi perubahan sinyal yang dilokalkan dari waktu ke waktu):
Serangkaian pulsa halus dengan nilai sigma yang berbeda:
Lebar pulsa:
Daftar from numpy import* from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


Pulsa diskrit menciptakan struktur kerucut pada sialogram, yang juga dikenal sebagai pengaruh kerucut. Impuls halus (Gaussians) mirip dengan struktur data nyata dan membuat kerucut meluas ke skala besar. Garis panduan horizontal berhubungan kira-kira dengan periode waktu (2 detik, 10 detik, 20 detik). Oleh karena itu, pulsa ini mirip dengan sinyal periodik dengan satu periode.
6. Kebisingan (Menampilkan kebisingan pada sialogram):
Daftar from numpy import* from pylab import* import scaleogram as scg import random scg.set_default_wavelet('cmor1-1.5')


Noise biasanya ditampilkan sebagai satu set elemen, dan beberapa penyimpangan mungkin terlihat seperti objek data nyata, jadi ketika menggunakan data nyata, Anda harus berhati-hati dan, jika perlu, periksa tingkat kebisingan. Jadwal atas akan berbeda setiap kali program dimulai.
Skalogram Wavelet dari Sinyal Khusus
Database PyWavelets berisi dua puluh sinyal transformasi wavelet khusus yang akan berguna untuk studi dan pengembangan. Oleh karena itu, saya akan memberikan daftar yang memungkinkan Anda untuk melakukan analisis wavelet dari semua dua puluh sinyal:
Saya hanya akan memberikan satu hasil dari transformasi wavelet dari sinyal Doppler:


Varietas yang paling umum dari sinyal sederhana dan khusus dipertimbangkan, yang memungkinkan kita untuk beralih menggunakan skalogram untuk menyelesaikan beberapa masalah analisis deret waktu.
Skalog garis waktu wavelet
1. Data kesuburan CDC di AS 1969-2008 (data kesuburan berisi fitur periodik, baik dalam skala tahunan dan yang lebih kecil):
Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()


Garis horizontal muncul dengan frekuensi sekitar 7 hari. Nilai-nilai tinggi muncul di dekat batas skala, yang merupakan perilaku normal pemrosesan wavelet. Efek-efek ini dikenal sebagai kerucut pengaruh, itulah sebabnya masker (opsional) menutupi area ini.
2. Normalisasi (Menghapus mean -
births_normed = births-births.mean () adalah wajib, jika tidak, batas data dianggap sebagai tahap yang membuat banyak deteksi berbentuk kerucut palsu):
Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

3. Perubahan skala dalam amplitudo (Untuk melihat objek tahunan, gunakan
period2scales () skala di sepanjang sumbu Y ditentukan).
Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

Kisaran amplitudo dari peta warna (sumbu Y) sekarang ditetapkan oleh clim = (0,2500). Nilai tepat untuk amplitudo osilasi tergantung pada wavelet, tetapi akan tetap dekat dengan urutan nilai aktual. Ini jauh lebih baik, sekarang kita melihat variasi tahunan dengan sangat baik, juga sekitar 6 bulan!
4. Menggunakan skala logaritmik (Untuk melihat periode kecil dan besar pada saat yang sama, lebih baik menggunakan skala logaritmik pada sumbu Y. Ini dicapai dengan menggunakan opsi xscale = log.)
Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

Hasilnya jauh lebih baik, tetapi sekarang piksel pada nilai periode rendah memanjang di sepanjang sumbu Y.
5. Distribusi seragam pada skala logaritmik (Untuk mendapatkan distribusi seragam pada skala, nilai periode harus didistribusikan secara merata dan kemudian dikonversi ke nilai skala, seperti yang ditunjukkan di bawah ini :):
Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

Kita bisa melihat perubahan sinyal di semua skala. Sialogram ditampilkan setiap tahun dalam periode yang sama.
6. Sorot bagian dari garis waktu (Memeriksa data perantara antara tanda garis waktu untuk mencari artefak atau data yang hilang.):
Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

Pada pandangan pertama, pola mingguan terlihat sangat merata, tetapi sesuatu terjadi pada Hari Natal, mari kita lihat periode ini lagi:Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

Sekarang sudah jelas bahwa ini adalah efek akhir tahun:- Natal: 23/24 Desember 2525 menunjukkan jumlah kelahiran yang rendah secara abnormal, dan hari-hari ini menyimpang dari jadwal mingguan;
- Ada data untuk bulan Desember, yang konsisten dengan keberadaan beberapa nilai untuk tanggal yang terpengaruh pada tanggal 1 dan 2 Januari, tanggal-tanggal ini biasanya kurang dari kejadian pribadi
7. Sintesis (Sialogram dibangun dari data yang dinormalisasi, dengan keterbacaan yang lebih baik untuk semua skala):Daftar import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()
CWT mengungkapkan banyak informasi dalam waktu singkat:Variasi mingguan yang menunjukkan kebiasaan rumah sakit telah ada selama beberapa dekade;Pada tahun 80-an ada peningkatan dalam indikator mingguan, yang mungkin disebabkan oleh perubahan dalam kebiasaan kerja rumah sakit, perubahan kesuburan, atau perubahan sederhana dalam populasi;Band setengah tahun kedua jelas harmonik kedua. Pola kabur muncul di zona dari 3 hingga 1 bulan, yang mungkin karena harmonik ketiga, karena fluktuasi tahunan sangat kuat. Mungkin juga disebabkan oleh efek liburan pada kesuburan dan mungkin memerlukan studi lebih lanjut;Efek akhir tahun tercatat pada Natal dan 1 Januari. Yang ini mungkin tetap tidak terlihat dengan metode frekuensi lain.Kesimpulan:
Dalam publikasi ini, kami melihat bagaimana bentuk dasar dari variasi sinyal diterjemahkan menjadi skalogram. Contoh dataset yang dipesan waktu kemudian digunakan untuk menunjukkan langkah demi langkah bagaimana CWT diterapkan pada data standar.Teknik di atas dapat diperluas untuk menganalisis lalu lintas jaringan dan untuk mendeteksi perilaku objek yang tidak biasa. CWT adalah alat yang ampuh yang semakin banyak digunakan sebagai input ke jaringan saraf dan dapat digunakan untuk membuat fungsi baru untuk mengklasifikasikan atau mendeteksi anomali.Setiap contoh diimplementasikan sebagai program independen, yang memungkinkan Anda untuk memilih contoh untuk tugas Anda, tanpa mempelajari contoh sebelumnya dan selanjutnya. Pengguna dapat mencoba fungsi wavelet apa saja dari daftar yang diberikan di awal setiap program, misalnya, seperti mexh atau gaus5. Misalnya masing-masing 1:
PS Untuk penggunaan praktis daftar, saya akan memberikan versi modul yang digunakan di dalamnya: >>> import scaleogram; print(scaleogram .__version__) 0.9.5 >>> import pandas; print(pandas .__version__) 0.24.1 >>> import numpy; print(numpy .__version__) 1.16.1 >>> import matplotlib; print(matplotlib .__version__) 3.0.2
Untuk kumpulan data independen dalam file * .csv, saya berikan struktur data (dalam satu kolom):tahun, bulan, hari, jenis kelamin, kelahiran1969,1,1, F, 40461969,1,1, M, 44401969,1,2 , F,4454 1969.1.2, M, 4548...
Untuk panda versi 0.24.1, Anda harus mendaftarkan konverter matplotlib secara eksplisit.Untuk mendaftarkan konverter: from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()