Saya memahami prinsip dasar filter partikel dan mencoba menerapkannya. Namun, saya terpaku pada bagian resampling.
Secara teori, ini cukup sederhana: Dari set partikel lama (dan berbobot), gambarkan set partikel baru dengan penggantian. Sambil melakukannya, nikmatilah partikel-partikel yang memiliki bobot tinggi. Partikel dengan bobot tinggi lebih sering ditarik dan partikel dengan bobot rendah lebih jarang. Mungkin hanya sekali atau tidak sama sekali. Setelah resampling, semua bobot diberi bobot yang sama.
Ide pertama saya tentang bagaimana mengimplementasikan ini pada dasarnya adalah ini:
- Menormalkan bobot
- Lipat gandakan setiap bobot dengan jumlah total partikel
- Bulatkan bobot yang diskalakan ke bilangan bulat terdekat (mis. Dengan dengan
int()
Python)
Sekarang saya harus tahu seberapa sering menggambar setiap partikel, tetapi karena kesalahan pembulatannya, saya akhirnya memiliki lebih sedikit partikel daripada sebelum langkah resampling.
Pertanyaan: Bagaimana cara saya "mengisi" partikel yang hilang untuk mendapatkan jumlah partikel yang sama seperti sebelum langkah resampling? Atau, kalau-kalau saya benar-benar keluar jalur di sini, bagaimana saya melakukan resample dengan benar?
sumber
Seperti yang saya kira Anda tahu sendiri, metode resampling yang Anda usulkan sedikit cacat, karena seharusnya tidak mengubah jumlah partikel (kecuali jika Anda mau). Prinsipnya adalah berat mewakili probabilitas relatif terhadap partikel lain. Pada langkah resampling, Anda menggambar dari himpunan partikel sedemikian rupa sehingga untuk setiap partikel, berat dinormalisasi kali jumlah partikel mewakili berapa kali rata-rata partikel digambar. Dalam hal itu ide Anda benar. Hanya dengan menggunakan pembulatan alih-alih pengambilan sampel, Anda akan selalu menghilangkan partikel yang nilainya kurang dari setengahnya.
Ada sejumlah cara untuk melakukan resampling dengan benar. Ada sebuah makalah yang bagus yang disebut pada resampling algoritma untuk filter partikel , membandingkan berbagai metode. Hanya untuk memberikan gambaran singkat:
Resampling multinomial: bayangkan selembar kertas di mana setiap partikel memiliki bagian, di mana panjangnya sebanding dengan beratnya. Pilih lokasi secara acak pada jalur N kali, dan pilih partikel yang terkait dengan bagian tersebut.
Resampling residual: pendekatan ini mencoba mengurangi varians pengambilan sampel, dengan terlebih dahulu mengalokasikan masing-masing partikel bilangan bulat dari nilai yang diharapkan, dan membiarkan sisanya untuk multinomial resampling. Misalnya suatu partikel dengan nilai yang diharapkan dari 2,5 akan memiliki 2 salinan dalam set yang di-resampled dan yang lainnya dengan nilai yang diharapkan dari 0,5.
Resampling sistematis: ambil penggaris dengan tanda spasi reguler, sehingga tanda N sama panjangnya dengan potongan kertas Anda. Secara acak letakkan penggaris di sebelah strip Anda. Ambil partikel pada tanda.
Resampling bertingkat: sama dengan resampling sistematis, kecuali bahwa tanda pada penggaris tidak ditempatkan secara merata, tetapi ditambahkan sebagai N proses pengambilan sampel acak dari interval 0..1 / N.
Jadi untuk menjawab pertanyaan Anda: apa yang telah Anda implementasikan dapat diperluas ke bentuk residual sampling. Anda mengisi slot yang hilang dengan mengambil sampel berdasarkan distribusi multinonmial dari pengingat.
sumber
Untuk contoh kode python yang mengimplementasikan resampling dengan benar, Anda mungkin menemukan proyek github ini berguna: https://github.com/mjl/particle_filter_demo
Plus, ia hadir dengan representasi visualnya sendiri dari proses resampling, yang seharusnya membantu Anda men-debug implementasi Anda sendiri.
Dalam visualisasi ini, penyu hijau menunjukkan posisi sebenarnya, titik abu-abu besar menunjukkan posisi yang diperkirakan dan berubah menjadi hijau ketika konvergen. Bobotnya berubah dari kemungkinan (merah) menjadi tidak mungkin (biru).
sumber
satu cara sederhana untuk melakukan ini adalah numpy.random.choice (N, N, p = w, ganti = True) di mana N adalah no. partikel dan w = bobot dinormalisasi.
sumber
p
di fungsi Anda? Semakin rinci jawaban Anda, semakin bermanfaat bagi pengunjung masa depan yang memiliki masalah yang sama.Saya menggunakan pendekatan @ narayan untuk mengimplementasikan filter partikel saya:
a adalah vektor partikel Anda untuk sampel, ukuran adalah jumlah partikel dan p adalah vektor bobot dinormalisasi. replace = True menangani pengambilan sampel bootstrap dengan penggantian. Nilai kembali adalah vektor objek partikel baru.
sumber