Menggunakan filter Kalman untuk menyaring nilai yang didapat dari sensor. Filter Kalman Filter Kalman yang optimal

Di Internet, termasuk di Habré, Anda dapat menemukan banyak informasi tentang filter Kalman. Tetapi sulit untuk menemukan turunan formula itu sendiri yang mudah dicerna. Tanpa kesimpulan, semua ilmu ini dianggap sebagai semacam perdukunan, formula terlihat seperti kumpulan simbol tanpa wajah, dan yang paling penting, banyak pernyataan sederhana yang ada di permukaan teori berada di luar pemahaman. Tujuan artikel ini adalah untuk membicarakan filter ini dalam bahasa yang dapat diakses sebanyak mungkin.
Filter Kalman adalah alat penyaringan data yang kuat. Prinsip utamanya adalah ketika menyaring, informasi tentang fisika dari fenomena itu sendiri digunakan. Misalnya, jika Anda memfilter data dari speedometer mobil, maka kelembaman mobil memberi Anda hak untuk menganggap lompatan kecepatan yang terlalu cepat sebagai kesalahan pengukuran. Filter Kalman menarik karena, dalam arti tertentu, ini adalah filter terbaik. Kami akan membahas lebih detail di bawah ini apa sebenarnya arti kata "yang terbaik". Di akhir artikel, saya akan menunjukkan bahwa dalam banyak kasus, formula dapat disederhanakan sedemikian rupa sehingga hampir tidak ada yang tersisa darinya.

Program pendidikan

Sebelum berkenalan dengan filter Kalman, saya mengusulkan untuk mengingat beberapa definisi dan fakta sederhana dari teori probabilitas.

Nilai acak

Ketika mereka mengatakan bahwa variabel acak diberikan, mereka berarti bahwa kuantitas ini dapat mengambil nilai acak. Dibutuhkan nilai yang berbeda dengan probabilitas yang berbeda. Saat Anda menggulung, katakanlah, sebuah dadu, serangkaian nilai diskrit akan keluar:. Jika menyangkut, misalnya, kecepatan partikel yang mengembara, maka, tentu saja, kita harus berurusan dengan serangkaian nilai yang berkesinambungan. Kami akan menunjukkan nilai "putus" dari variabel acak, tetapi kadang-kadang, kami akan menggunakan huruf yang sama, yang kami gunakan untuk menunjukkan variabel acak :.
Dalam kasus rangkaian nilai yang berkesinambungan, variabel acak dicirikan oleh kerapatan probabilitas, yang menentukan kepada kita bahwa probabilitas bahwa variabel acak "jatuh" di lingkungan kecil dari suatu titik dengan panjang adalah sama dengan. Seperti yang dapat kita lihat dari gambar, probabilitas ini sama dengan luas persegi panjang yang diarsir di bawah grafik:

Cukup sering dalam kehidupan, variabel acak adalah Gaussian ketika kepadatan probabilitasnya.

Kita melihat bahwa fungsi tersebut berbentuk lonceng yang berpusat pada suatu titik dan dengan lebar orde yang khas.
Karena kita berbicara tentang distribusi Gaussian, adalah dosa untuk tidak menyebutkan dari mana asalnya. Sama seperti angka yang mapan dalam matematika dan terjadi di tempat yang paling tidak terduga, distribusi Gaussian berakar dalam pada teori probabilitas. Satu pernyataan luar biasa yang sebagian menjelaskan kemahahadiran Gaussian adalah sebagai berikut:
Biarkan ada variabel acak dengan distribusi arbitrer (sebenarnya, ada beberapa batasan pada kesewenang-wenangan ini, tetapi sama sekali tidak ketat). Mari kita lakukan eksperimen dan hitung jumlah nilai "drop out" dari variabel acak. Mari kita lakukan banyak eksperimen ini. Jelas bahwa setiap kali kita akan menerima nilai jumlah yang berbeda. Dengan kata lain, jumlah ini sendiri merupakan variabel acak dengan hukum distribusi tertentunya sendiri. Ternyata untuk cukup besar, hukum distribusi jumlah ini cenderung ke distribusi Gaussian (omong-omong, lebar karakteristik "lonceng" tumbuh seperti). Baca lebih lanjut di Wikipedia: Teorema Limit Pusat. Dalam kehidupan, sangat sering ada kuantitas yang terdiri dari sejumlah besar variabel acak independen yang didistribusikan secara merata, dan oleh karena itu didistribusikan menurut Gaussian.

Berarti

Nilai rata-rata variabel acak adalah apa yang kita dapatkan dalam batas, jika kita melakukan banyak percobaan, dan menghitung rata-rata aritmatika dari nilai yang dijatuhkan. Mean dilambangkan dengan cara yang berbeda: matematikawan suka dilambangkan dengan (harapan), dan matematikawan asing dengan (harapan). Fisikawan melalui atau. Kami akan menunjuk dengan cara asing:.
Misalnya, untuk distribusi Gaussian, rata-ratanya adalah.

Penyebaran

Dalam kasus distribusi Gaussian, kita dengan jelas melihat bahwa variabel acak lebih suka jatuh di lingkungan tertentu dari nilai rata-ratanya. Seperti dapat dilihat dari grafik, sebaran karakteristik dari nilai-nilai pesanan. Bagaimana kita bisa memperkirakan penyebaran nilai ini untuk variabel acak arbitrer, jika kita tahu distribusinya. Anda dapat menggambar grafik kepadatan probabilitasnya dan memperkirakan lebar karakteristik dengan mata. Tapi kami lebih suka mengikuti jalur aljabar. Anda dapat menemukan panjang rata-rata deviasi (modulus) dari mean:. Nilai ini akan menjadi perkiraan yang baik dari penyebaran nilai yang khas. Tapi Anda dan saya tahu betul bahwa menggunakan modul dalam rumus adalah salah satu masalah, jadi rumus ini jarang digunakan untuk memperkirakan penyebaran karakteristik.
Cara yang lebih mudah (sederhana dalam hal perhitungan) adalah menemukan. Nilai ini disebut varians, dan sering disebut sebagai. Akar varians disebut simpangan baku. Standar deviasi adalah perkiraan yang baik dari penyebaran variabel acak.
Misalnya, untuk distribusi Gaussian, kita dapat menghitung bahwa varians yang didefinisikan di atas sama persis, yang berarti bahwa standar deviasinya sama, yang sangat sesuai dengan intuisi geometri kita.
Bahkan, ada penipuan kecil yang tersembunyi di sini. Faktanya adalah bahwa dalam definisi distribusi Gaussian, di bawah eksponen adalah ekspresi. Dua penyebut ini berdiri tepat sehingga standar deviasi akan sama dengan koefisien. Artinya, rumus distribusi Gaussian itu sendiri ditulis dalam bentuk yang dipertajam secara khusus sehingga kita akan mempertimbangkan deviasi akar-rata-rata-kuadratnya.

Variabel acak independen

Variabel acak tergantung dan tidak. Bayangkan Anda melempar jarum ke pesawat dan menuliskan koordinat kedua ujungnya. Kedua koordinat ini tergantung, mereka terkait dengan syarat bahwa jarak antara keduanya selalu sama dengan panjang jarum, meskipun nilainya acak.
Variabel acak adalah independen jika hasil dari yang pertama benar-benar independen dari hasil yang kedua. Jika variabel acak independen, maka nilai rata-rata produknya sama dengan produk dari nilai rata-ratanya:

Bukti

Misalnya, memiliki mata biru dan lulus dari sekolah menengah dengan medali emas adalah variabel acak independen. Jika ada mata biru, katakanlah, peraih medali emas, maka peraih medali bermata biru. Contoh ini memberi tahu kita bahwa jika variabel acak dan diberikan oleh kepadatan probabilitasnya dan, maka independensi nilai-nilai ini dinyatakan dalam kenyataan bahwa kepadatan probabilitas (nilai pertama keluar, dan yang kedua) ditemukan dengan rumus:

Segera berikut dari ini bahwa:

Seperti yang Anda lihat, pembuktian dilakukan untuk variabel acak yang memiliki spektrum nilai kontinu dan diberikan oleh kepadatan probabilitasnya. Dalam kasus lain, ide pembuktiannya serupa.

Filter Kalman

Rumusan masalah

Mari kita tunjukkan dengan nilai yang akan kita ukur, lalu filter. Ini bisa berupa koordinat, kecepatan, percepatan, kelembaban, bau, suhu, tekanan, dll.
Mari kita mulai dengan contoh sederhana yang akan menuntun kita untuk merumuskan masalah umum. Bayangkan kita memiliki mobil yang dikendalikan radio yang hanya bisa bolak-balik. Mengetahui berat mobil, bentuk, permukaan jalan, dll., kami menghitung bagaimana joystick pengontrol memengaruhi kecepatan gerakan.

Maka koordinat mobil akan berubah sesuai dengan hukum:

Dalam kehidupan nyata, kita tidak dapat memperhitungkan dalam perhitungan kita gangguan kecil yang bekerja pada mobil (angin, gundukan, kerikil di jalan), oleh karena itu, kecepatan sebenarnya dari mobil akan berbeda dari yang dihitung. Sebuah variabel acak akan ditambahkan ke sisi kanan persamaan tertulis:

Kami memiliki sensor GPS yang dipasang pada mesin tik, yang mencoba mengukur koordinat sebenarnya dari mobil, dan, tentu saja, tidak dapat mengukurnya dengan tepat, tetapi mengukurnya dengan kesalahan, yang juga merupakan variabel acak. Akibatnya, kami menerima data yang salah dari sensor:

Tugasnya adalah, mengetahui pembacaan sensor yang salah, menemukan perkiraan yang baik untuk koordinat sebenarnya dari mobil.
Dalam perumusan tugas umum, apa pun dapat bertanggung jawab atas koordinat (suhu, kelembaban ...), dan istilah yang bertanggung jawab untuk mengendalikan sistem dari luar akan dilambangkan dengan (dalam contoh dengan mesin). Persamaan untuk koordinat dan pembacaan sensor akan terlihat seperti ini:

Mari kita bahas secara rinci apa yang kita ketahui:

Perlu dicatat bahwa tugas penyaringan bukanlah tugas anti-aliasing. Kami tidak mencoba memuluskan data dari sensor, kami mencoba untuk mendapatkan nilai yang paling dekat dengan koordinat sebenarnya.

algoritma Kalman

Kami akan berdebat dengan induksi. Bayangkan bahwa pada langkah ke- kita telah menemukan nilai yang difilter dari sensor, yang mendekati koordinat sebenarnya dari sistem dengan baik. Jangan lupa bahwa kita tahu persamaan yang mengontrol perubahan koordinat yang tidak diketahui:

oleh karena itu, belum menerima nilai dari sensor, kita dapat berasumsi bahwa pada suatu langkah sistem berkembang menurut hukum ini dan sensor akan menunjukkan sesuatu yang mendekati. Sayangnya, kami belum bisa mengatakan lebih tepatnya. Di sisi lain, pada suatu langkah, kita akan memiliki pembacaan sensor yang tidak akurat di tangan kita.
Ide Kalman adalah sebagai berikut. Untuk mendapatkan perkiraan terbaik ke koordinat sebenarnya, kita harus memilih jalan tengah antara pembacaan sensor yang tidak akurat dan prediksi kita tentang apa yang kita harapkan untuk dilihat darinya. Kami akan memberikan bobot pada pembacaan sensor dan bobot akan tetap pada nilai prediksi:

Koefisien tersebut disebut koefisien Kalman. Itu tergantung pada langkah iterasi, jadi akan lebih tepat untuk menulisnya, tetapi untuk saat ini, agar tidak mengacaukan rumus perhitungan, kami akan menghilangkan indeksnya.
Kita harus memilih koefisien Kalman agar nilai koordinat optimal yang dihasilkan paling dekat dengan nilai sebenarnya. Misalnya, jika kita tahu bahwa sensor kita sangat akurat, maka kita akan lebih mempercayai pembacaannya dan memberi nilai lebih banyak bobot (mendekati satu). Jika sensor, sebaliknya, benar-benar tidak akurat, maka kami akan lebih fokus pada nilai yang diprediksi secara teoritis.
Secara umum, untuk menemukan nilai pasti dari koefisien Kalman, Anda hanya perlu meminimalkan kesalahan:

Kami menggunakan persamaan (1) (yang ada di dalam kotak dengan latar belakang biru) untuk menulis ulang ekspresi kesalahan:

Bukti

Sekarang saatnya untuk membahas apa yang dimaksud dengan ekspresi meminimalkan kesalahan? Bagaimanapun, kesalahan, seperti yang dapat kita lihat, itu sendiri adalah variabel acak dan setiap kali mengambil nilai yang berbeda. Faktanya, tidak ada pendekatan satu-ke-satu untuk mendefinisikan apa artinya kesalahan minimal. Sama seperti dalam kasus varians dari variabel acak, ketika kita mencoba untuk memperkirakan lebar karakteristik dari penyebarannya, jadi di sini kita akan memilih kriteria yang paling sederhana untuk perhitungan. Kami akan meminimalkan rata-rata kesalahan kuadrat:

Mari kita tulis ekspresi terakhir:

Bukti

Dari fakta bahwa semua variabel acak yang termasuk dalam ekspresi untuk adalah independen, maka semua istilah "silang" sama dengan nol:

Kami menggunakan fakta bahwa rumus varians terlihat jauh lebih sederhana :.

Ekspresi ini mengambil nilai minimum ketika (kita menyamakan turunannya dengan nol):

Di sini kita sudah menulis ekspresi untuk koefisien Kalman dengan indeks langkah, jadi kami menekankan bahwa itu tergantung pada langkah iterasi.
Kami mengganti nilai optimal yang diperoleh ke dalam ekspresi, yang telah kami perkecil. Kami menerima;

Tugas kita telah selesai. Kami mendapat rumus berulang untuk menghitung koefisien Kalman.
Mari kita rangkum pengetahuan yang kita peroleh dalam satu bingkai:

Contoh

kode matlab

Bersihkan semua; N = 100% jumlah sampel a = 0,1% percepatan sigmaPsi = 1 sigmaEta = 50; k = 1: N x = k x (1) = 0 z (1) = x (1) + normrnd (0, sigmaEta); untuk t = 1: (N-1) x (t + 1) = x (t) + a * t + normrnd (0, sigmaPsi); z (t + 1) = x (t + 1) + normrnd (0, sigmaEta); akhir; % kalman filter xOpt (1) = z (1); eOpt (1) = sigmaEta; untuk t = 1: (N-1) eOpt (t + 1) = kuadrat ((sigmaEta ^ 2) * (eOpt (t) ^ 2 + sigmaPsi ^ 2) / (sigmaEta ^ 2 + eOpt (t) ^ 2 + sigmaPsi ^ 2)) K (t + 1) = (eOpt (t + 1)) ^ 2 / sigmaEta ^ 2 xOpt (t + 1) = (xOpt (t) + a * t) * (1-K (t +1)) + K (t + 1) * z (t + 1) akhir; plot (k, xOpt, k, z, k, x)

Analisis

Jika kita menelusuri bagaimana koefisien Kalman berubah dengan langkah iterasi, dapat ditunjukkan bahwa ia selalu stabil pada nilai tertentu. Misalnya, ketika kesalahan rms sensor dan model berhubungan satu sama lain sebagai sepuluh banding satu, maka plot koefisien Kalman tergantung pada langkah iterasi terlihat seperti ini:

Dalam contoh berikut, kita akan membahas bagaimana hal ini dapat membuat hidup kita lebih mudah.

Contoh kedua

Dalam praktiknya, sering terjadi bahwa kita tidak tahu sama sekali tentang model fisik dari apa yang kita filter. Misalnya, Anda ingin memfilter pembacaan dari akselerometer favorit Anda. Anda tidak tahu sebelumnya dengan hukum apa Anda bermaksud memutar akselerometer. Informasi terbanyak yang dapat Anda ambil adalah varians dari kesalahan sensor. Dalam situasi yang sulit seperti itu, semua ketidaktahuan tentang model gerak dapat didorong ke dalam variabel acak:

Tetapi, sejujurnya, sistem seperti itu tidak lagi memenuhi kondisi yang kami terapkan pada variabel acak, karena sekarang semua fisika gerak yang tidak kami ketahui tersembunyi di sana, dan oleh karena itu kami tidak dapat mengatakan bahwa pada waktu yang berbeda kesalahan model tidak bergantung pada satu sama lain dan bahwa nilai rata-ratanya adalah nol. Dalam hal ini, pada umumnya, teori filter Kalman tidak dapat diterapkan. Tapi, kami tidak akan memperhatikan fakta ini, tetapi, dengan bodohnya menerapkan semua formula kolosal, memilih koefisien dengan mata, sehingga data yang difilter terlihat lucu.
Tapi Anda bisa pergi dengan cara yang berbeda, jauh lebih sederhana. Seperti yang kita lihat di atas, koefisien Kalman selalu stabil menuju nilai dengan kenaikan. Oleh karena itu, daripada memilih koefisien dan dan menemukan koefisien Kalman menggunakan rumus kompleks, kita dapat menganggap koefisien ini selalu konstan, dan hanya memilih konstanta ini. Asumsi ini hampir tidak merusak apa pun. Pertama, kita sudah menggunakan teori Kalman secara ilegal, dan kedua, koefisien Kalman dengan cepat menjadi stabil. Akibatnya, semuanya akan menjadi sangat sederhana. Kita tidak memerlukan rumus dari teori Kalman sama sekali, kita hanya perlu mencari nilai yang dapat diterima dan memasukkannya ke dalam rumus iteratif:

Grafik berikut menunjukkan data dari sensor fiksi yang difilter dalam dua cara berbeda. Asalkan kita tidak tahu apa-apa tentang fenomena fisika. Cara pertama adalah jujur, dengan segala rumusan dari teori Kalman. Dan yang kedua disederhanakan, tanpa rumus.

Seperti yang kita lihat, metodenya hampir sama. Perbedaan kecil diamati hanya di awal, ketika koefisien Kalman belum stabil.

Diskusi

Seperti yang telah kita lihat, ide utama dari filter Kalman adalah untuk menemukan koefisien sedemikian rupa sehingga nilai yang disaring

rata-rata, itu akan menjadi paling sedikit berbeda dari nilai sebenarnya dari koordinat. Kami melihat bahwa nilai yang difilter adalah fungsi linier dari pembacaan sensor dan nilai yang difilter sebelumnya. Dan nilai yang difilter sebelumnya, pada gilirannya, merupakan fungsi linier dari pembacaan sensor dan nilai yang difilter sebelumnya. Dan seterusnya, sampai rantai sepenuhnya terbuka. Artinya, nilai yang difilter tergantung pada dari semua pembacaan sensor sebelumnya secara linier:

Oleh karena itu, filter Kalman disebut filter linier.
Dapat dibuktikan bahwa filter Kalman adalah yang terbaik dari semua filter linier. Terbaik dalam arti kuadrat rata-rata dari kesalahan filter minimal.

Kasus multidimensi

Seluruh teori filter Kalman dapat digeneralisasi ke kasus multidimensi. Rumus di sana terlihat sedikit lebih menakutkan, tetapi ide turunannya sama seperti dalam kasus satu dimensi. Anda dapat melihatnya di artikel luar biasa ini: http://habrahabr.ru/post/140274/.
Dan dalam indah ini video contoh bagaimana menggunakannya dianalisis.

Filter Wiener paling cocok untuk proses pemrosesan atau bagian dari proses secara umum (pemrosesan blok). Untuk pemrosesan sekuensial, perkiraan arus sinyal pada setiap siklus clock diperlukan, dengan mempertimbangkan informasi yang masuk ke input filter selama proses pengamatan.

Dengan penyaringan Wiener, setiap sampel sinyal baru akan memerlukan penghitungan ulang semua bobot filter. Saat ini, filter adaptif telah tersebar luas, di mana informasi baru yang masuk digunakan untuk terus mengoreksi penilaian sinyal yang dibuat sebelumnya (pelacakan target di radar, sistem kontrol otomatis dalam kontrol, dll.). Yang menarik adalah filter adaptif dari tipe rekursif yang dikenal sebagai filter Kalman.

Filter ini banyak digunakan dalam loop kontrol dalam regulasi otomatis dan sistem kontrol. Dari situlah mereka muncul, terbukti dengan terminologi khusus yang digunakan untuk menggambarkan karya mereka sebagai ruang negara.

Salah satu tugas utama yang harus diselesaikan dalam praktik komputasi saraf adalah mendapatkan algoritma yang cepat dan andal untuk mempelajari jaringan saraf. Dalam hal ini, mungkin berguna untuk menggunakan filter linier dalam loop umpan balik. Karena algoritme pelatihan bersifat iteratif, filter semacam itu harus berupa penduga rekursif sekuensial.

Masalah estimasi parameter

Salah satu masalah teori keputusan statistik, yang sangat penting secara praktis, adalah masalah memperkirakan vektor keadaan dan parameter sistem, yang dirumuskan sebagai berikut. Misalkan perlu untuk memperkirakan nilai parameter vektor $ X $, yang tidak dapat diakses untuk pengukuran langsung. Sebagai gantinya, parameter lain $ Z $ diukur, tergantung pada $ X $. Masalah estimasi adalah untuk menjawab pertanyaan: apa yang dapat dikatakan tentang $ X $, mengetahui $ Z $. Dalam kasus umum, prosedur untuk evaluasi optimal dari vektor $ X $ tergantung pada kriteria kualitas evaluasi yang diterima.

Misalnya, pendekatan Bayesian untuk masalah estimasi parameter memerlukan informasi apriori lengkap tentang sifat probabilistik dari parameter yang diestimasi, yang seringkali tidak mungkin. Dalam kasus ini, mereka menggunakan metode kuadrat terkecil (OLS), yang membutuhkan jauh lebih sedikit informasi apriori.

Mari kita pertimbangkan penerapan OLS untuk kasus ketika vektor pengamatan $ Z $ terkait dengan vektor estimasi parameter $ X $ oleh model linier, dan pengamatan mengandung noise $ V $ tidak berkorelasi dengan parameter yang diestimasi:

$Z = HX + V$, (1)

di mana $H$ adalah matriks transformasi yang menggambarkan hubungan antara besaran yang diamati dan parameter yang diestimasi.

Perkiraan $ X $ yang meminimalkan kesalahan kuadrat ditulis sebagai berikut:

$ X_ (оц) = (H ^ TR_V ^ (- 1) H) ^ (- 1) H ^ TR_V ^ (- 1) Z $, (2)

Biarkan noise $ V $ tidak dikorelasikan, dalam hal ini matriks $ R_V $ hanyalah matriks identitas, dan persamaan untuk estimasi menjadi lebih sederhana:

$ X_ (ots) = (H ^ TH) ^ (- 1) H ^ TZ $, (3)

Menulis dalam bentuk matriks sangat menghemat kertas, tetapi mungkin tidak biasa bagi sebagian orang. Contoh berikut, diambil dari monografi Yu. M. Korshunov "Mathematical Foundations of Cybernetics", menggambarkan semua ini.
Berikut rangkaian listrik yang tersedia:

Nilai yang diamati dalam hal ini adalah pembacaan perangkat $ A_1 = 1 A, A_2 = 2 A, V = 20 B $.

Selain itu, resistansi $ R = 5 $ Ohm diketahui. Diperlukan untuk memperkirakan dengan cara terbaik, dari sudut pandang kriteria kuadrat rata-rata minimum kesalahan, nilai arus $ I_1 $ dan $ I_2 $. Yang paling penting di sini adalah bahwa ada beberapa hubungan antara nilai yang diamati (pembacaan instrumen) dan parameter yang diperkirakan. Dan informasi ini dibawa dari luar.

Dalam hal ini, ini adalah hukum Kirchhoff, dalam hal penyaringan (yang akan dibahas lebih lanjut) - model autoregresif dari deret waktu, yang mengasumsikan ketergantungan nilai saat ini pada yang sebelumnya.

Jadi, pengetahuan tentang hukum Kirchhoff, yang tidak ada hubungannya dengan teori keputusan statistik, memungkinkan untuk membuat hubungan antara nilai yang diamati dan parameter yang diperkirakan (yang mempelajari teknik elektro - mereka dapat memeriksa, sisanya akan memiliki untuk mengambil kata mereka untuk itu):

$$ z_1 = A_1 = I_1 + \ xi_1 = 1 $$

$$ z_2 = A_2 = I_1 + I_2 + \ xi_2 = 2 $$

$$ z_2 = V / R = I_1 + 2 * I_2 + \ xi_3 = 4 $$

Itu sama dalam bentuk vektor:

$$ \ mulai (vmatrix) z_1 \\ z_2 \\ z_3 \ akhir (vmatrix) = \ mulai (vmatrix) 1 & 0 \\ 1 & 1 \\ 1 & 2 \ akhir (vmatrix) \ mulai (vmatrix) I_1 \ \ I_2 \ end (vmatrix) + \ begin (vmatrix) \ xi_1 \\ \ xi_2 \\ \ xi_3 \ end (vmatrix) $$

Atau $Z = HX + V $, dimana

$$ Z = \ mulai (vmatrix) z_1 \\ z_2 \\ z_3 \ akhir (vmatrix) = \ mulai (vmatrix) 1 \\ 2 \\ 4 \ akhir (vmatrix); H = \ mulai (vmatrix) 1 & 0 \\ 1 & 1 \\ 1 & 2 \ akhir (vmatrix); X = \ mulai (vmatrix) I_1 \\ I_2 \ akhir (vmatrix); V = \ mulai (vmatrix) \ xi_1 \\ \ xi_2 \\ \ xi_3 \ akhir (vmatrix) $$

Mempertimbangkan nilai interferensi yang tidak berkorelasi satu sama lain, kami menemukan perkiraan I 1 dan I 2 dengan metode kuadrat terkecil sesuai dengan rumus 3:

$ H ^ TH = \ mulai (vmatrix) 1 & 1 & 1 \\ 0 & 1 & 2 \ akhir (vmatrix) \ mulai (vmatrix) 1 & 0 \\ 1 & 1 \\ 1 & 2 \ akhir (vmatrix) = \ mulai (vmatrix) 3 & 3 \\ 3 & 5 \ akhir (vmatrix); (H ^ TH) ^ (- 1) = \ frac (1) (6) \ begin (vmatrix) 5 & -3 \\ -3 & 3 \ end (vmatrix) $;

$ H ^ TZ = \ mulai (vmatrix) 1 & 1 & 1 \\ 0 & 1 & 2 \ akhir (vmatrix) \ mulai (vmatrix) 1 \\ 2 \\ 4 \ akhir (vmatrix) = \ mulai (vmatrix) 7 \ \ 10 \ akhir (vmatrix); X (ots) = \ frac (1) (6) \ begin (vmatrix) 5 & -3 \\ -3 & 3 \ end (vmatrix) \ begin (vmatrix) 7 \\ 10 \ end (vmatrix) = \ frac (1) (6) \ mulai (vmatrix) 5 \\ 9 \ akhir (vmatrix) $;

Jadi $I_1 = 5/6 = 0,833 A $; $ I_2 = 9/6 = 1,5 A $.

Tugas penyaringan

Berbeda dengan masalah estimasi parameter yang memiliki nilai tetap, dalam masalah penyaringan diperlukan proses estimasi, yaitu untuk menemukan estimasi arus dari sinyal yang berubah-ubah waktu, terdistorsi oleh noise, dan, oleh karena itu, tidak dapat diakses secara langsung. pengukuran. Secara umum, jenis algoritma penyaringan tergantung pada sifat statistik dari sinyal dan noise.

Kami akan mengasumsikan bahwa sinyal yang berguna adalah fungsi waktu yang bervariasi secara perlahan, dan interferensinya adalah noise yang tidak berkorelasi. Kami akan menggunakan metode kuadrat terkecil, sekali lagi karena kurangnya informasi apriori tentang karakteristik probabilistik sinyal dan interferensi.

Pertama, kami memperoleh perkiraan nilai $x_n $ saat ini berdasarkan nilai $ k $ terakhir yang tersedia dari deret waktu $ z_n, z_ (n-1), z_ (n-2) \ titik z_ (n - (k-1)) $. Model observasi sama seperti pada masalah estimasi parameter:

Jelas bahwa $Z$ adalah vektor kolom yang terdiri dari nilai-nilai yang diamati dari deret waktu $ z_n, z_ (n-1), z_ (n-2) \ titik z_ (n- (k-1)) $, $ V $ - vektor-kolom noise $ \ xi _n, \ xi _ (n-1), \ xi_ (n-2) \ dots \ xi_ (n- (k-1)) $, mendistorsi kebenaran sinyal. Apa arti simbol $ H $ dan $ X $? Apa, misalnya, vektor kolom $ X $ yang dapat kita bicarakan jika yang diperlukan hanyalah memberikan perkiraan nilai deret waktu saat ini? Dan apa yang dimaksud dengan matriks transformasi $H$ tidak jelas sama sekali.

Semua pertanyaan ini dapat dijawab hanya jika konsep model pembangkitan sinyal dimasukkan ke dalam pertimbangan. Artinya, beberapa model sinyal asli diperlukan. Hal ini dapat dimengerti, dengan tidak adanya informasi apriori tentang karakteristik probabilistik dari sinyal dan interferensi, tetap hanya untuk membuat asumsi. Anda dapat menyebutnya meramal dengan alasan kopi, tetapi para ahli lebih memilih terminologi yang berbeda. Pada "pengering rambut" mereka disebut model parametrik.

Dalam hal ini, parameter model khusus ini diperkirakan. Saat memilih model pembangkitan sinyal yang sesuai, ingatlah bahwa setiap fungsi analitik dapat diperluas dalam deret Taylor. Sifat yang menakjubkan dari deret Taylor adalah bahwa bentuk suatu fungsi pada jarak berhingga $ t $ dari suatu titik $ x = a $ secara unik ditentukan oleh perilaku fungsi dalam lingkungan kecil tak terhingga dari titik $ x = a $ (kita berbicara tentang turunannya dari pesanan pertama dan lebih tinggi).

Dengan demikian, adanya deret Taylor berarti fungsi analitik memiliki struktur internal dengan kopling yang sangat kuat. Jika, misalnya, kita membatasi diri pada tiga anggota deret Taylor, maka model pembangkitan sinyal akan terlihat seperti ini:

$ x_ (n-i) = F _ (- i) x_n $, (4)

$$ X_n = \ begin (vmatrix) x_n \\ x "_n \\ x" "_ n \ end (vmatrix); F _ (- i) = \ begin (vmatrix) 1 & -i & i ^ 2/2 \\ 0 & 1 & -i \\ 0 & 0 & 1 \ akhir (vmatrix) $$

Yaitu, rumus 4, untuk urutan polinomial tertentu (dalam contoh, itu sama dengan 2) membuat hubungan antara nilai $ n $ -th dari sinyal dalam urutan waktu dan $ (ni) $ - th. Jadi, vektor keadaan yang diestimasi dalam hal ini mencakup, selain nilai taksiran aktual, turunan pertama dan kedua dari sinyal.

Dalam teori kontrol otomatis, filter semacam itu akan disebut filter astatisme orde ke-2. Matriks transformasi $ H $ untuk kasus ini (estimasi dilakukan berdasarkan sampel saat ini dan $ k-1 $ sebelumnya) terlihat seperti ini:

$$ H = \ mulai (vmatrix) 1 & -k & k ^ 2/2 \\ - & - & - \\ 1 & -2 & 2 \\ 1 & -1 & 0,5 \\ 1 & 0 & 0 \ akhir (vmatriks) $$

Semua angka ini diperoleh dari deret Taylor dengan asumsi bahwa interval waktu antara nilai pengamatan yang berdekatan adalah konstan dan sama dengan 1.

Jadi, tugas penyaringan berdasarkan asumsi kami telah direduksi menjadi tugas memperkirakan parameter; dalam hal ini, parameter dari model pembangkitan sinyal yang diadopsi diestimasi. Dan estimasi nilai vektor keadaan $ X $ dilakukan sesuai dengan rumus yang sama 3:

$$ X_ (ots) = (H ^ TH) ^ (- 1) H ^ TZ $$

Intinya, kami telah menerapkan proses estimasi parametrik berdasarkan model autoregressive dari proses pembangkitan sinyal.

Formula 3 mudah diimplementasikan secara terprogram, untuk ini Anda perlu mengisi matriks $ H $ dan kolom vektor pengamatan $ Z $. Filter ini disebut filter memori terbatas, karena mereka menggunakan pengamatan $ k $ terakhir untuk mendapatkan perkiraan $ X_ (bukan) $ saat ini. Pada setiap jam pengamatan baru, yang baru ditambahkan ke set pengamatan saat ini dan yang lama dibuang. Proses mendapatkan nilai ini disebut jendela geser.

Meningkatkan filter memori

Filter dengan memori terbatas memiliki kelemahan utama bahwa setelah setiap pengamatan baru, perlu untuk melakukan perhitungan ulang lengkap atas semua data yang disimpan dalam memori. Selain itu, perhitungan perkiraan dapat dimulai hanya setelah hasil pengamatan $k$ pertama telah diakumulasikan. Artinya, filter ini memiliki waktu transien yang lama.

Untuk mengatasi kelemahan ini, perlu untuk beralih dari filter memori persisten ke filter dengan memori tumbuh... Dalam filter seperti itu, jumlah nilai yang diamati yang estimasinya dibuat harus bertepatan dengan jumlah n dari pengamatan saat ini. Hal ini memungkinkan untuk memperoleh taksiran mulai dari jumlah pengamatan sama dengan jumlah komponen dari vektor taksiran $X$. Dan ini ditentukan oleh urutan model yang diadopsi, yaitu berapa banyak anggota dari deret Taylor yang digunakan dalam model.

Pada saat yang sama, dengan meningkatnya n, sifat pemulusan filter meningkat, yaitu akurasi perkiraan meningkat. Namun, implementasi langsung dari pendekatan ini dikaitkan dengan peningkatan biaya komputasi. Oleh karena itu, filter memori yang berkembang diimplementasikan sebagai berulang.

Faktanya adalah bahwa pada saat n kita sudah memiliki perkiraan $ X _ ((n-1) оц) $, yang berisi informasi tentang semua pengamatan sebelumnya $ z_n, z_ (n-1), z_ (n-2) \ titik z_ (n- (k-1)) $. Taksiran $ X_ (nоц) $ diperoleh dari pengamatan berikutnya $ z_n $ menggunakan informasi yang tersimpan dalam taksiran $ X _ ((n-1)) (\ mbox (оц)) $. Prosedur ini disebut penyaringan berulang dan terdiri dari berikut ini:

  • menurut perkiraan $ X _ ((n-1)) (\ mbox (оц)) $ memprediksi perkiraan $ X_n $ dengan rumus 4 dengan $ i = 1 $: $ X _ (\ mbox (notsapriori)) = F_1X _ ((n-1) sc) $. Ini adalah perkiraan apriori;
  • menurut hasil pengamatan saat ini $ z_n $, perkiraan apriori ini diubah menjadi yang benar, yaitu a posteriori;
  • prosedur ini diulang pada setiap langkah, dimulai dengan $ r + 1 $, di mana $ r $ adalah urutan filter.

Rumus terakhir untuk pemfilteran berulang terlihat seperti ini:

$ X _ ((n-1) оц) = X _ (\ mbox (notsapriori)) + (H ^ T_nH_n) ^ (- 1) h ^ T_0 (z_n - h_0 X _ (\ mbox (notsapriori))) $ , (6)

dimana untuk filter order kedua kita :

Filter memori yang berkembang yang bekerja menurut Formula 6 adalah kasus khusus dari algoritma penyaringan yang dikenal sebagai filter Kalman.

Dalam implementasi praktis rumus ini, perlu diingat bahwa perkiraan apriori yang termasuk di dalamnya ditentukan oleh rumus 4, dan nilai $ h_0 X _ (\ mbox (notspriori)) $ adalah komponen pertama dari vektor $ X _ (\ mbox (notspriori)) $.

Filter memori yang berkembang memiliki satu fitur penting. Jika melihat rumus 6, maka skor akhir adalah jumlah dari vektor skor prediksi dan suku koreksi. Koreksi ini besar untuk $ n $ kecil dan menurun dengan meningkatnya $ n $, cenderung nol sebagai $ n \ panah kanan \ infty $. Artinya, dengan peningkatan n, sifat pemulusan filter tumbuh dan model yang melekat di dalamnya mulai mendominasi. Tetapi sinyal nyata dapat sesuai dengan model hanya di area tertentu, oleh karena itu, akurasi perkiraan memburuk.

Untuk mengatasi ini, mulai dari beberapa $ n $, larangan dikenakan pada pengurangan lebih lanjut dari istilah koreksi. Ini sama dengan mengubah bandwidth filter, yaitu untuk n kecil filter lebih lebar (kurang inersia), untuk n besar menjadi lebih inersia.

Bandingkan Gambar 1 dan Gambar 2. Pada gambar pertama, filter memiliki memori yang besar, sementara itu menghaluskan dengan baik, tetapi karena pitanya yang sempit, perkiraan lintasan tertinggal di belakang yang sebenarnya. Pada gambar kedua, memori filter lebih kecil, lebih halus, tetapi mengikuti lintasan sebenarnya dengan lebih baik.

literatur

  1. YM Korshunov "Dasar Matematika Sibernetika"
  2. A.V. Balakrishnan "Teori filtrasi Kalman"
  3. VNFomin "Estimasi berulang dan pemfilteran adaptif"
  4. C.F.N. Cowan, P.M. Berikan "Filter Adaptif"

Random Forest adalah salah satu algoritma data mining favorit saya. Pertama, ini sangat serbaguna, dapat digunakan untuk menyelesaikan masalah regresi dan klasifikasi. Cari anomali dan pilih prediktor. Kedua, ini adalah algoritma yang sangat sulit untuk diterapkan secara tidak benar. Hanya karena, tidak seperti algoritme lain, ia memiliki beberapa parameter yang dapat dikonfigurasi. Ini juga sangat sederhana pada intinya. Dan pada saat yang sama, ini luar biasa karena presisinya.

Apa ide di balik algoritma yang begitu indah? Idenya sederhana: katakanlah kita memiliki beberapa algoritma yang sangat lemah, katakanlah. Jika kita membuat banyak model berbeda menggunakan algoritma yang lemah ini dan merata-ratakan hasil prediksinya, maka hasil akhirnya akan jauh lebih baik. Inilah yang disebut pelatihan ensemble dalam aksi. Oleh karena itu, algoritma Hutan Acak disebut "Hutan Acak", karena data yang diperoleh membuat banyak pohon keputusan dan kemudian merata-ratakan hasil prediksinya. Poin penting di sini adalah unsur keacakan dalam penciptaan setiap pohon. Lagi pula, jelas bahwa jika kita membuat banyak pohon yang identik, maka hasil rata-ratanya akan memiliki akurasi satu pohon.

Bagaimana dia bekerja? Misalkan kita memiliki beberapa data input. Setiap kolom sesuai dengan beberapa parameter, setiap baris sesuai dengan beberapa elemen data.

Kita dapat secara acak memilih sejumlah kolom dan baris tertentu dari seluruh dataset dan membangun pohon keputusan berdasarkan mereka.


Kamis, 10 Mei 2012

Kamis, 12 Januari 2012


Itu saja. Penerbangan 17 jam selesai, Rusia di luar negeri. Dan melalui jendela apartemen 2 kamar tidur yang nyaman di San Francisco, Lembah Silikon yang terkenal, California, AS sedang menatap kami. Ya, inilah alasan mengapa saya praktis tidak menulis akhir-akhir ini. Kami pindah.

Semuanya dimulai pada April 2011 ketika saya melakukan wawancara telepon di Zynga. Kemudian semuanya tampak seperti semacam permainan yang tidak ada hubungannya dengan kenyataan, dan saya bahkan tidak bisa membayangkan apa yang akan terjadi. Pada Juni 2011, Zynga datang ke Moskow dan melakukan serangkaian wawancara, sekitar 60 kandidat yang lulus wawancara telepon dipertimbangkan, dan sekitar 15 dari mereka dipilih (saya tidak tahu jumlah pastinya, seseorang kemudian berubah pikiran, seseorang segera menolak). Wawancara itu ternyata sangat sederhana. Tidak ada tugas pemrograman, tidak ada pertanyaan rumit tentang bentuk palka, sebagian besar kemampuan untuk mengobrol diuji. Dan pengetahuan, menurut saya, hanya dinilai secara dangkal.

Dan kemudian gimmick dimulai. Pertama kita tunggu hasilnya, lalu penawaran, lalu persetujuan LCA, lalu persetujuan permohonan visa, lalu dokumen dari USA, lalu antrian di kedutaan, lalu cek tambahan, lalu Visa. Kadang-kadang bagi saya tampaknya saya siap untuk menjatuhkan segalanya dan mencetak gol. Kadang-kadang saya ragu apakah kita membutuhkan Amerika ini, lagipula, di Rusia juga tidak buruk. Seluruh proses memakan waktu sekitar enam bulan, alhasil, pada pertengahan Desember kami menerima visa dan mulai mempersiapkan keberangkatan.

Senin adalah hari pertama saya bekerja di tempat baru. Kantor memiliki semua kondisi untuk tidak hanya bekerja tetapi juga hidup. Sarapan, makan siang, dan makan malam dari koki kami sendiri, berbagai macam makanan berdesakan di semua tempat, gym, pijat, dan bahkan penata rambut. Semua ini benar-benar gratis untuk karyawan. Banyak orang pergi bekerja dengan sepeda dan ada beberapa ruangan untuk menyimpan kendaraan. Secara umum, saya belum pernah menemukan hal seperti ini di Rusia. Semuanya, bagaimanapun, memiliki harganya sendiri, kami segera diperingatkan bahwa kami harus banyak bekerja. Apa itu "banyak", menurut standar mereka, tidak terlalu jelas bagi saya.

Mudah-mudahan, bagaimanapun, terlepas dari jumlah pekerjaan, saya akan dapat melanjutkan blogging di masa mendatang dan mungkin memberi tahu Anda sesuatu tentang kehidupan Amerika dan pekerjaan sebagai programmer di Amerika. Tunggu dan lihat. Sementara itu, saya mengucapkan Selamat Tahun Baru dan Natal kepada semua orang dan sampai jumpa lagi!


Sebagai contoh penggunaan, kami akan mencetak hasil dividen perusahaan Rusia. Sebagai harga dasar, kami mengambil harga penutupan saham pada hari penutupan register. Untuk beberapa alasan, informasi ini tidak ada di situs troika, dan ini jauh lebih menarik daripada nilai absolut dividen.
Perhatian! Kode membutuhkan waktu lama untuk dieksekusi, karena untuk setiap promosi, Anda perlu membuat permintaan ke server finam dan mendapatkan nilainya.

Hasil<- NULL for(i in (1:length(divs[,1]))){ d <- divs if (d$Divs>0) (coba ((kutipan<- getSymbols(d$Symbol, src="Finam", from="2010-01-01", auto.assign=FALSE) if (!is.nan(quotes)){ price <- Cl(quotes) if (length(price)>0) (dd<- d$Divs result <- rbind(result, data.frame(d$Symbol, d$Name, d$RegistryDate, as.numeric(dd)/as.numeric(price), stringsAsFactors=FALSE)) } } }, silent=TRUE) } } colnames(result) <- c("Symbol", "Name", "RegistryDate", "Divs") result


Demikian pula, Anda dapat membangun statistik selama beberapa tahun terakhir.

Filter Kalman mungkin adalah algoritma penyaringan paling populer yang digunakan di banyak bidang sains dan teknologi. Karena kesederhanaan dan efisiensinya, dapat ditemukan di penerima GPS, prosesor pembacaan sensor, dalam penerapan sistem kontrol, dll.

Ada banyak artikel dan buku di Internet tentang filter Kalman (kebanyakan dalam bahasa Inggris), tetapi artikel ini memiliki ambang masuk yang cukup besar, ada banyak tempat yang tidak jelas, meskipun sebenarnya ini adalah algoritma yang sangat jelas dan transparan. Saya akan mencoba memberi tahu Anda tentang hal itu dalam bahasa yang sederhana, dengan peningkatan kompleksitas secara bertahap.

Untuk apa?

Setiap alat pengukur memiliki beberapa kesalahan, dapat dipengaruhi oleh sejumlah besar pengaruh eksternal dan internal, yang mengarah pada fakta bahwa informasi darinya berisik. Semakin bising data, semakin sulit untuk memproses informasi tersebut.

Filter adalah algoritma pemrosesan data yang menghilangkan noise dan informasi yang tidak perlu. Dalam filter Kalman, dimungkinkan untuk menetapkan informasi apriori tentang sifat sistem, hubungan variabel dan, atas dasar ini, membangun perkiraan yang lebih akurat, tetapi bahkan dalam kasus yang paling sederhana (tanpa memasukkan informasi apriori ) memberikan hasil yang sangat baik.

Mari kita pertimbangkan contoh paling sederhana - misalkan kita perlu mengontrol level bahan bakar di dalam tangki. Untuk melakukan ini, sensor kapasitif dipasang di tangki, perawatannya sangat mudah, tetapi memiliki beberapa kelemahan - misalnya, ketergantungan pada bahan bakar yang diisi (konstanta dielektrik bahan bakar tergantung pada banyak faktor, misalnya, pada suhu), pengaruh besar "bumpiness" di dalam tangki. Akibatnya, informasi darinya mewakili "gergaji" khas dengan amplitudo yang layak. Jenis sensor ini sering dipasang pada peralatan penambangan berat (jangan bingung dengan volume tangki):

Filter Kalman

Mari kita sedikit menyimpang dan berkenalan dengan algoritme itu sendiri. Filter Kalman menggunakan model dinamis dari sistem (misalnya, hukum fisika gerak), tindakan kontrol yang diketahui, dan banyak pengukuran berurutan untuk membentuk perkiraan keadaan optimal. Algoritma terdiri dari dua fase berulang: prediksi dan koreksi. Pada awalnya, prediksi keadaan pada saat berikutnya dihitung (dengan mempertimbangkan ketidakakuratan pengukurannya). Pada detik, informasi baru dari sensor mengoreksi nilai prediksi (juga memperhitungkan ketidakakuratan dan kebisingan informasi ini):

Persamaan disajikan dalam bentuk matriks, jika Anda tidak tahu aljabar linier - tidak apa-apa, maka akan ada versi yang disederhanakan tanpa matriks untuk kasus dengan satu variabel. Dalam kasus satu variabel, matriks berdegenerasi menjadi nilai skalar.

Mari kita pahami dulu notasinya: subskrip menunjukkan momen dalam waktu: k - saat ini, (k-1) - sebelumnya, tanda minus dalam superskrip berarti diprediksi nilai menengah.

Deskripsi variabel disajikan pada gambar berikut:

Dimungkinkan untuk menggambarkan untuk waktu yang lama dan membosankan apa arti semua matriks transisi misterius ini, tetapi menurut pendapat saya, lebih baik mencoba menerapkan algoritme menggunakan contoh nyata - sehingga nilai abstrak akan memperoleh makna nyata.

Mari kita coba dalam tindakan

Mari kita kembali ke contoh dengan sensor ketinggian bahan bakar, karena keadaan sistem diwakili oleh satu variabel (volume bahan bakar dalam tangki), matriksnya berubah menjadi persamaan biasa:
Mendefinisikan model proses
Untuk menerapkan filter, perlu untuk menentukan matriks / nilai variabel yang menentukan dinamika sistem dan dimensi F, B dan H:

F- variabel yang menggambarkan dinamika sistem, dalam hal bahan bakar - ini dapat berupa koefisien yang menentukan konsumsi bahan bakar saat idle selama waktu pengambilan sampel (waktu antara langkah-langkah algoritma). Namun, selain konsumsi bahan bakar, ada juga pengisian bahan bakar ... oleh karena itu, untuk kesederhanaan, kami akan mengambil variabel ini sama dengan 1 (yaitu, kami menunjukkan bahwa nilai prediksi akan sama dengan keadaan sebelumnya).

B- variabel yang menentukan penerapan tindakan kontrol. Jika kita memiliki informasi tambahan tentang kecepatan mesin atau tingkat penekanan pedal akselerator, maka parameter ini akan menentukan bagaimana konsumsi bahan bakar akan berubah selama waktu pengambilan sampel. Karena tidak ada tindakan kontrol dalam model kami (tidak ada informasi tentang mereka), kami mengambil B = 0.

H- matriks yang menentukan hubungan antara pengukuran dan keadaan sistem, untuk saat ini, tanpa penjelasan, kami akan mengambil variabel ini juga sama dengan 1.

Mendefinisikan sifat smoothing
R- kesalahan pengukuran dapat ditentukan dengan menguji alat ukur dan menentukan kesalahan pengukurannya.

Q- Penentuan kebisingan proses adalah tugas yang lebih sulit, karena diperlukan untuk menentukan varians dari proses, yang tidak selalu mungkin. Bagaimanapun, Anda dapat memilih parameter ini untuk memberikan tingkat penyaringan yang diperlukan.

Menerapkan dalam kode
Untuk menghilangkan ketidakjelasan yang tersisa, kami menerapkan algoritma yang disederhanakan dalam C # (tanpa matriks dan tindakan kontrol):

kelas KalmanFilterSimple1D
{
public double X0 (dapatkan; set pribadi;) // keadaan yang diprediksi
public double P0 (dapatkan; set pribadi;) // prediksi kovarians

Public double F (get; private set;) // faktor dari nilai riil ke nilai riil sebelumnya
Q ganda publik (dapatkan; set pribadi;) // pengukuran kebisingan
public double H (get; private set;) // faktor nilai terukur ke nilai riil
R ganda publik (dapatkan; set pribadi;) // kebisingan lingkungan

Negara ganda publik (dapatkan; set pribadi;)
Kovarians ganda publik (dapatkan; set pribadi;)

KalmanFilterSimple1D Publik (ganda q, ganda r, ganda f = 1, ganda h = 1)
{
Q = q;
R = r;
F = f;
H = h;
}

Public void SetState (keadaan ganda, kovarians ganda)
{
negara = negara;
Kovarians = kovarians;
}

Kekosongan publik Benar (data ganda)
{
// pembaruan waktu - prediksi
X0 = F * Status;
P0 = F * Kovarians * F + Q;

// pembaruan pengukuran - koreksi
var K = H * P0 / (H * P0 * H + R);
Status = X0 + K * (data - H * X0);
Kovarians = (1 - K * H) * F;
}
}

// aplikasi...

Var fuelData = GetData();
var disaring = Daftar baru ();

Var kalman = new KalmanFilterSimple1D (f: 1, h: 1, q: 2, r: 15); // atur F, H, Q dan R
kalman.SetState (fuelData, 0.1); // Tetapkan nilai awal untuk Status dan Kovarians
foreach (var d di fuelData)
{
kalman.Benar (d); // Terapkan algoritma

Filtered.Add (kalman.State); // Simpan status saat ini
}

Hasil pemfilteran dengan parameter ini ditunjukkan pada gambar (untuk menyesuaikan tingkat pemulusan - Anda dapat mengubah parameter Q dan R):

Bagian paling menarik dari artikel ini tetap - penerapan filter Kalman untuk beberapa variabel, mengatur hubungan di antara mereka dan output otomatis nilai untuk variabel yang tidak dapat diamati. Saya akan mencoba untuk melanjutkan topik segera setelah ada waktu.

Saya harap deskripsinya tidak terlalu membosankan dan rumit, jika Anda memiliki pertanyaan atau klarifikasi - selamat datang di komentar)

Dalam proses otomatisasi proses teknologi untuk mengontrol mekanisme dan unit, seseorang harus berurusan dengan pengukuran berbagai kuantitas fisik. Ini bisa berupa tekanan dan laju aliran cairan atau gas, kecepatan, suhu, dan banyak lagi. Pengukuran besaran fisis dilakukan dengan menggunakan sensor analog. Sinyal analog adalah sinyal data di mana masing-masing parameter yang mewakili dijelaskan oleh fungsi waktu dan serangkaian nilai yang memungkinkan. Dari kontinuitas ruang nilai, maka setiap interferensi yang dimasukkan ke dalam sinyal tidak dapat dibedakan dari sinyal yang diinginkan. Oleh karena itu, nilai yang salah dari kuantitas fisik yang diperlukan akan dikirim ke input analog dari perangkat kontrol. Oleh karena itu, perlu dilakukan penyaringan terhadap sinyal yang berasal dari sensor.

Salah satu algoritma penyaringan yang efisien adalah filter Kalman. Filter Kalman adalah filter rekursif yang memperkirakan vektor keadaan sistem dinamis menggunakan serangkaian pengukuran yang tidak lengkap dan bising. Filter Kalman menggunakan model dinamis sistem (misalnya, hukum fisika gerak), tindakan kontrol, dan banyak pengukuran berurutan untuk membentuk perkiraan keadaan optimal. Algoritma terdiri dari dua fase berulang: prediksi dan koreksi. Pada tahap pertama, prediksi keadaan pada saat berikutnya dihitung (dengan mempertimbangkan ketidakakuratan pengukurannya). Pada yang kedua, informasi baru dari sensor mengoreksi nilai prediksi (juga memperhitungkan ketidakakuratan dan kebisingan informasi ini).

Pada tahap prediksi, hal berikut terjadi:

  1. Prediksi status sistem:

di mana prediksi keadaan sistem pada saat ini; - matriks transisi antar keadaan (model dinamis sistem); - prediksi keadaan sistem pada saat sebelumnya; - matriks penerapan tindakan kontrol; - tindakan kontrol pada saat sebelumnya dalam waktu.

  1. Memprediksi kovarians kesalahan:

di mana prediksi kesalahan; - kesalahan pada saat sebelumnya; - kovarians kebisingan proses.

Pada tahap penyesuaian terjadi hal-hal sebagai berikut:

  1. Perhitungan keuntungan Kalman:

di mana keuntungan Kalman; - matriks pengukuran yang menunjukkan hubungan pengukuran dan keadaan; - pengukuran kovarians kebisingan.

di mana adalah pengukuran pada saat ini.

  1. Pembaruan kesalahan kovarians:

dimana adalah matriks identitas.

Jika keadaan sistem digambarkan oleh satu variabel, maka = 1, dan matriks-matriksnya diturunkan menjadi persamaan biasa.

Untuk menunjukkan dengan jelas keefektifan filter Kalman, dilakukan percobaan dengan sensor volume AVR PIC KY-037, yang terhubung ke mikrokontroler Arduino Uno. Gambar 1 menunjukkan grafik pembacaan sensor tanpa filter (baris 1). Fluktuasi yang kacau pada keluaran sensor menunjukkan adanya noise.

Gambar 1. Grafik pembacaan sensor tanpa aplikasi filter

Untuk menerapkan filter, perlu untuk menentukan nilai variabel, dan yang menentukan dinamika sistem dan dimensi. Mari kita ambil dan sama dengan 1, dan sama dengan 0, karena tidak ada tindakan kontrol dalam sistem. Untuk menentukan sifat pemulusan filter, perlu menghitung nilai variabel, serta memilih nilai parameter.

Kami akan menghitung variabel di Microsoft Excel 2010. Untuk melakukan ini, perlu menghitung standar deviasi untuk sampel pembacaan sensor. = 0,62. dipilih tergantung pada tingkat filtrasi yang diperlukan, kita ambil = 0,001. Pada Gambar 2, baris kedua menunjukkan grafik pembacaan sensor dengan filter yang diterapkan.

Gambar 2. Grafik pembacaan sensor menggunakan filter Kalman

Dari grafik, kita dapat menyimpulkan bahwa filter mengatasi tugas penyaringan kebisingan, karena dalam kondisi tunak, fluktuasi pembacaan sensor yang telah melewati penyaringan tidak signifikan.

Namun, filter Kalman memiliki kelemahan yang signifikan. Jika nilai terukur dari sensor dapat berubah dengan cepat, pembacaan sensor yang difilter tidak akan berubah secepat nilai terukur. Gambar 3 menunjukkan respons filter Kalman terhadap lonjakan nilai terukur.

Gambar 3. Reaksi filter Kalman terhadap lonjakan nilai terukur

Respon filter terhadap lonjakan nilai terukur ternyata dapat diabaikan. Jika nilai terukur berubah secara signifikan dan kemudian tidak kembali ke nilai sebelumnya, maka pembacaan sensor yang difilter akan sesuai dengan nilai sebenarnya dari nilai terukur hanya setelah periode waktu yang signifikan, yang tidak dapat diterima untuk sistem kontrol otomatis yang memerlukan kinerja tinggi. .

Dari percobaan yang dilakukan dapat disimpulkan bahwa filter Kalman disarankan digunakan untuk menyaring pembacaan sensor pada sistem kecepatan rendah.

Bibliografi:

  1. GOST 17657-79. Transfer data. Istilah dan Definisi. - Moskow: Rumah penerbitan standar, 2005. - 2 hal.
  2. Filter Kalman // Wikipedia. ... Tanggal diperbarui: 26.04.2017. URL: http://ru.wikipedia.org/?oldid=85061599 (tanggal akses: 21/05/2017).