Parçacık filtreleri: Yeniden örnekleme nasıl yapılır?


24

Bir parçacık filtresinin temel prensibini anlıyorum ve bir tane uygulamaya çalıştım. Ancak, yeniden örnekleme kısmına asıldım.

Teorik olarak konuşmak gerekirse, oldukça basittir: Eski (ve ağırlıklı) parçacık kümesinden, yerine yeni bir parçacık kümesi çizin. Bunu yaparken, ağırlıkları yüksek olan parçacıkları tercih edin. Ağırlıkları yüksek olan parçacıklar daha sık ve düşük ağırlıkları olan parçacıklar daha az sıklıkta çekilir. Belki de sadece bir kez ya da hiç. Yeniden örneklemeden sonra, tüm ağırlıklar aynı ağırlıkta verilir.

Bunun nasıl uygulanacağı konusundaki ilk fikrim esas olarak şuydu:

  1. Ağırlıkları normalleştirmek
  2. Her bir ağırlığı toplam parçacık sayısı ile çarpın
  3. Ölçeklenen ağırlıkları en yakın tam sayıya yuvarlayın (örn int(). Python'da)

Şimdi her parçacığın ne sıklıkta çizileceğini bilmeliyim, ancak sonuçta ortaya çıkan hatalardan dolayı , yeniden örnekleme aşamasından önce daha az parçacığa sahip oldum .

Soru: Yeniden örnekleme aşamasından önceki ile aynı sayıda partikül elde etmek için eksik partikülleri nasıl "doldururum"? Veya, burada tam olarak izlemem durumunda, nasıl doğru şekilde yeniden örnekleyebilirim?

Yanıtlar:


19

Karşılaştığınız konuya genellikle örnek yoksulluğu denir. Yaklaşımınızın neden bunlardan sıkıntı çektiğini oldukça basit bir örnekle görebiliriz. Diyelim ki 3 parçanız var ve normalize edilmiş ağırlıkları 0,1, 0,1, 0,8'dir. Daha sonra her bir ağırlığın 3 verimi 0.3, 0.3 ve 2.4 ile çarpması. Sonra yuvarlama 0, 0, 2 verir. Bu, ilk iki parçacığı seçmeyeceğiniz ve sonuncusu iki kez seçileceği anlamına gelir. Şimdi iki partikülün altındasınız. Sanırım, "yuvarlama hataları nedeniyle, daha az parçacıklar yaşadım" derken gördüğün şeyden şüpheleniyorum.

Alternatif bir seçim yöntemi aşağıdaki gibi olacaktır.

  1. Ağırlıkları normalleştir.
  2. Ağırlıkların kümülatif toplamının bir dizisini hesaplayın.
  3. Rasgele bir sayı oluşturun ve sayının ait olduğu o toplam ağırlık dizisinde hangi aralığın olduğunu belirleyin.
  4. Bu aralığın indeksi, yaratılması gereken parçacıklara karşılık gelir.
  5. İstediğiniz sayıda örnek alana kadar tekrar edin.

Dolayısıyla yukarıdaki örneği kullanarak normalleştirilmiş ağırlıklarla başlayacağız. Daha sonra diziyi [0.1, 0.2, 1] hesaplardık. Oradan, 0.15, 0.38 ve 0.54 diyen 3 rasgele sayı hesaplıyoruz. Bu bize ikinci parçacığı bir kez ve üçüncü parçacığı iki kez seçmemizi sağlayacaktır. Mesele şu ki, küçük parçacıklara yayılma şansı veriyor.

Unutulmaması gereken bir şey, bu yöntem fakirleşmeyle ilgilenecek olsa da, asgari çözümlere yol açabileceğidir. Örneğin, parçacıkların hiçbiri gerçekten sizin konumunuza uymuyor olabilir (bunu lokalizasyon için kullandığınızı varsayarsak). Ağırlıklar size hangi partiküllerin en iyi eşleştiğini gösterir, eşleşmenin kalitesini değil. Bu nedenle, ek okumalar aldığınızda ve işlemi tekrarladığınızda, tüm parçacıklarınızın doğru konum olmayan tek bir yerde gruplandığını görebilirsiniz. Bunun nedeni genellikle başlayacak iyi parçacıkların olmamasıdır.


1
Anlayışlı cevap için teşekkürler! Önerdiğiniz seçim yöntemi tanıdık geliyor. Doğru hatırlıyorsam, örnek yoksulluğu sorununu tedavi etmenin yaygın bir yoluydu. Bunu daha önce görmüştüm ancak bu işlemin nedenini gerçekten anlamadım. Şimdi daha iyisini biliyorum!
Daniel Eberts,

2
Örnekleme yoksulluğu hakkındaki yorumunuzun biraz yanıltıcı olabileceğini düşünüyorum. Posterin parçacıkları gevşetmesi, yeniden örnekleme için uygun olmayan bir yöntemden kaynaklanmaktadır. Parçacık yoksunluğu, arka dağılımınızın artık parçacıklar tarafından yeterince temsil edilmediği durumdur.
Jakob

9

Tahmin ettiğin gibi, kendini keşfettiğin gibi, önerdiğin yeniden örnekleme yöntemi parçacıkların sayısını değiştirmemesi gerektiği için biraz hatalı. İlke, ağırlığın diğer parçacıklara göre göreceli olasılığı temsil etmesidir. Yeniden örnekleme adımında, her bir parçacık için, parçacıkların sayısının normalleştirilmiş ağırlık katları, parçacıkların ortalama olarak çekilme sayısını temsil edecek şekilde parçacık kümesinden çekiyorsunuz. Bu konuda senin fikrin doğru. Yalnızca örnekleme yerine yuvarlama kullanarak, beklenen değerin yarısından daha az olduğu parçacıkları her zaman ortadan kaldıracaksınız.

Yeniden örneklemeyi doğru şekilde gerçekleştirmenin birkaç yolu vardır. Partikül filtreleri için yeniden örnekleme algoritmaları olarak adlandırılan ve farklı yöntemleri karşılaştıran hoş bir makale var . Sadece hızlı bir genel bakış için:

  • Çok terimli yeniden örnekleme: her parçacığın uzunluğunun ağırlığına orantılı olduğu bir bölüme sahip olduğu bir kağıt şeridi hayal edin. Şeritte N kere rastgele bir yer seçin ve bölümle ilişkili parçacığı seçin.

  • Kalıntı yeniden örnekleme: bu yaklaşım, her bir parçacığı beklenen değer tamsayı katına tahsis ederek, geri kalanını multinom örneklemesine bırakarak, örneklemenin varyansını azaltmaya çalışır. Örneğin, beklenen değeri 2,5 olan bir parçacık yeniden düzenlenmiş sette 2 kopyaya ve bir tane de beklenen değeri 0,5 olacak.

  • Sistematik yeniden örnekleme: Düzenli aralıklı işaretlere sahip bir cetvel alın; N işaretlerinin kağıt şeridinizle aynı uzunlukta olmasını sağlayın. Cetvelinizi rastgele şeridin yanına yerleştirin. Parçacıklar işaretlerine alın.

  • Tabakalı yeniden örnekleme: Sistematik yeniden örnekleme ile aynıdır, ancak cetvel üzerindeki işaretlerin eşit şekilde yerleştirilmemesi, ancak 0..1 / N aralığından örnekleme yapan N rasgele süreç olarak eklenmesi gerekir.

Dolayısıyla sorunuzu cevaplamak için: Uyguladığınız şey artık bir örnekleme biçimine genişletilebilir. Eksik yuvaları, hatırlatıcıların çok uluslu dağılımına göre örnekleyerek doldurursunuz.


Takip sorumu zaten cevapladığım için +1 :)
Daniel Eberts

5

Yeniden örneklemeyi doğru şekilde uygulayan bir python kodu örneği için, bu github projesini yararlı bulabilirsiniz: https://github.com/mjl/particle_filter_demo

Ayrıca, kendi uygulamanızda hata ayıklamanıza yardımcı olması için yeniden örnekleme sürecinin kendi görsel sunumuyla birlikte gelir. Parçacık filtresi işlemi

Bu görselleştirmede yeşil kaplumbağa gerçek pozisyonu, büyük gri nokta tahmini pozisyonu gösterir ve birleştiğinde yeşile döner. Ağırlık muhtemel (kırmızı) ila muhtemel olmayan (mavi) arasındadır.


Bağlantı için teşekkürler. Diğer insanların bir algoritmayı nasıl uyguladıklarını görmek her zaman anlayışlı olur.
Daniel Eberts,

Bu, bir partikül filtresinin yakınsamasının görselleştirilmesidir. Soruyla ilgili olarak ne içgörü sağladığından emin değilim.
Jakob

Görselleştirmeyi dahil ettim çünkü yayınladığım kod tarafından üretildi - yeniden örneklemenin nasıl düzgün şekilde uygulanacağına bir örnek.
Ian

1

Bunu yapmanın basit bir yolu numpy.random.choice (N, N, p = w, replace = True), burada N no. parçacıkların ve w = normalize ağırlıklar.


Hoşgeldiniz Robotik Narayan. Lütfen bu cevabı biraz genişletebilir misiniz? Örneğin, neden rastgele bir seçim kullanmalısınız? İşlevinde ne var p? Cevabınızı ne kadar ayrıntılı hale getirirseniz, aynı sorunu yaşayan gelecek ziyaretçiler için o kadar faydalı olacaktır.
Chuck

1

@ Narayan'ın parçacık filtremi uygulamak için yaklaşımını kullanıyorum:

new_sample = numpy.random.choice(a=particles, size=number_of_particles, replace=True, p=importance_weights)

a, örneklenecek parçacıkların vektörüdür, boyut parçacıkların sayısıdır ve p onların normalleştirilmiş ağırlıklarının vektörüdür. replace = True, önyükleme ile örnekleme işlemini gerçekleştirir. Dönüş değeri, yeni parçacık nesnelerinin bir vektörüdür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.