Partikelfilter: Wie wird ein Resampling durchgeführt?


24

Ich verstehe das Grundprinzip eines Partikelfilters und habe versucht, einen zu implementieren. Ich habe mich jedoch auf den Resampling-Teil festgelegt.

Theoretisch ist es ganz einfach: Zeichnen Sie aus der alten (und gewichteten) Menge von Partikeln eine neue Menge von Partikeln mit Ersetzung. Bevorzugen Sie dabei Partikel mit hohem Gewicht. Partikel mit hohen Gewichten werden häufiger und Partikel mit niedrigen Gewichten seltener gezeichnet. Vielleicht nur einmal oder gar nicht. Nach dem Resampling erhalten alle Gewichte das gleiche Gewicht.

Meine erste Idee, wie man das umsetzt, war im Wesentlichen:

  1. Normalisieren Sie die Gewichte
  2. Multiplizieren Sie jedes Gewicht mit der Gesamtzahl der Partikel
  3. Runden Sie diese skalierten Gewichte auf die nächste Ganzzahl (z. B. mit int()in Python)

Jetzt sollte ich wissen, wie oft jedes Partikel gezeichnet werden muss , aber aufgrund der Rundungsfehler habe ich weniger Partikel als vor dem Resampling-Schritt.

Die Frage: Wie "fülle" ich die fehlenden Partikel auf, um die gleiche Anzahl an Partikeln wie vor dem Resampling-Schritt zu erhalten? Oder, falls ich hier völlig aus dem Ruder gelaufen bin, wie kann ich richtig resampeln?

Antworten:


18

Das Problem, auf das Sie stoßen, wird häufig als Stichprobenverarmung bezeichnet. Wir können an einem relativ einfachen Beispiel sehen, warum Ihr Ansatz darunter leidet. Angenommen, Sie haben 3 Partikel und ihre normalisierten Gewichte sind 0,1, 0,1, 0,8. Dann multipliziert man jedes Gewicht mit den 3 ergibt 0,3, 0,3 und 2,4. Dann ergibt das Runden 0, 0, 2. Dies bedeutet, dass Sie die ersten beiden Partikel nicht auswählen und das letzte zweimal auswählen würden. Jetzt hast du nur noch zwei Teilchen. Ich vermute, das ist es, was Sie gesehen haben, wenn Sie sagen: "Aufgrund der Rundungsfehler habe ich weniger Partikel."

Eine alternative Auswahlmethode wäre wie folgt.

  1. Gewichte normalisieren.
  2. Berechnen Sie ein Array der kumulativen Summe der Gewichte.
  3. Erzeuge zufällig eine Zahl und bestimme, in welchem ​​Bereich des kumulativen Gewichtsfeldes die Zahl liegt.
  4. Der Index dieses Bereichs würde dem zu erstellenden Partikel entsprechen.
  5. Wiederholen, bis Sie die gewünschte Anzahl von Proben haben.

Im obigen Beispiel würden wir also mit den normalisierten Gewichten beginnen. Wir würden dann das Array [0.1, 0.2, 1] berechnen. Von dort aus berechnen wir 3 Zufallszahlen, z. B. 0,15, 0,38 und 0,54. Dadurch müssten wir das zweite Teilchen einmal und das dritte Teilchen zweimal auswählen. Der Punkt ist, dass es den kleineren Teilchen eine Chance gibt, sich auszubreiten.

Eine Sache, die zu beachten ist, ist, dass, während diese Methode mit Verarmung fertig wird, sie zu suboptimalen Lösungen führen kann. Zum Beispiel kann es sein, dass keines der Partikel wirklich gut zu Ihrem Standort passt (vorausgesetzt, Sie verwenden dies zur Lokalisierung). Die Gewichte geben nur Auskunft darüber, welche Partikel am besten passen, nicht über die Qualität der Übereinstimmung. Wenn Sie also zusätzliche Messungen vornehmen und den Vorgang wiederholen, stellen Sie möglicherweise fest, dass sich alle Partikel an einem einzelnen Ort befinden, der nicht der richtige Ort ist. Dies liegt normalerweise daran, dass keine guten Partikel vorhanden waren.


1
Vielen Dank für die aufschlussreiche Antwort! Die von Ihnen vorgeschlagene Auswahlmethode kommt Ihnen bekannt vor. Wenn ich mich recht entsinne, war das eine übliche Methode, um das Problem der Probenverarmung zu lösen. Ich habe es schon einmal gesehen, aber den Grund für dieses Verfahren nie wirklich verstanden. Jetzt weiß ich es besser!
Daniel Eberts

2
Ich denke, Ihre Interpretation der Stichprobenverarmung kann etwas irreführend sein. Die Tatsache, dass das Poster Partikel verliert, ist auf eine ungeeignete Methode zum erneuten Abtasten zurückzuführen. Eine Verarmung der Partikel tritt auf, wenn Ihre hintere Verteilung nicht mehr ausreichend durch die Partikel repräsentiert wird.
Jakob

9

Wie Sie selbst herausgefunden haben, ist die von Ihnen vorgeschlagene Resampling-Methode leicht fehlerhaft, da sie die Anzahl der Partikel nicht verändern sollte (es sei denn, Sie möchten). Das Prinzip ist, dass das Gewicht die relative Wahrscheinlichkeit in Bezug auf die anderen Partikel darstellt. Im Resampling-Schritt zeichnen Sie aus dem Partikelsatz so, dass für jedes Partikel das normalisierte Gewicht multipliziert mit der Anzahl der Partikel die Anzahl der Partikel darstellt, die durchschnittlich gezeichnet werden. Insofern ist deine Idee richtig. Nur wenn Sie anstelle einer Stichprobe eine Rundung verwenden, werden Sie immer Partikel entfernen, für die der erwartete Wert weniger als die Hälfte beträgt.

Es gibt eine Reihe von Möglichkeiten, um das Resampling ordnungsgemäß durchzuführen. Es gibt eine gute Arbeit mit dem Titel " Über Resampling-Algorithmen für Partikelfilter" , in der die verschiedenen Methoden verglichen werden. Nur um einen kurzen Überblick zu geben:

  • Multinomiales Resampling: Stellen Sie sich einen Papierstreifen vor, in dem jedes Partikel einen Abschnitt hat, dessen Länge proportional zu seinem Gewicht ist. Wählen Sie N-mal nach dem Zufallsprinzip eine Position auf dem Streifen aus und wählen Sie das Partikel aus, das dem Abschnitt zugeordnet ist.

  • Residual Resampling: Bei diesem Ansatz wird versucht, die Varianz der Abtastung zu verringern, indem zuerst jedem Partikel der ganzzahlige Grundwert des erwarteten Werts zugewiesen wird, und der Rest der multinomialen Neuabtastung überlassen wird. Zum Beispiel hat ein Partikel mit einem erwarteten Wert von 2,5 2 Kopien im neu abgetasteten Satz und eine weitere mit einem erwarteten Wert von 0,5.

  • Systematisches Resampling: Nehmen Sie ein Lineal mit regelmäßigen Abständen, so dass N-Zeichen die gleiche Länge haben wie Ihr Papierstreifen. Platziere das Lineal zufällig neben deinem Streifen. Nehmen Sie die Partikel an den Markierungen.

  • Stratified Resampling: Wie systematisches Resampling, nur dass die Markierungen auf dem Lineal nicht gleichmäßig verteilt sind, sondern als N zufällige Stichproben aus dem Intervall 0..1 / N hinzugefügt werden.

Zur Beantwortung Ihrer Frage: Was Sie implementiert haben, könnte auf eine Form der Restprobenahme ausgeweitet werden. Sie füllen die fehlenden Slots aus, indem Sie anhand einer multinonmialen Verteilung der Erinnerungen eine Stichprobe erstellen.


+1, weil ich meine Folgefrage bereits beantwortet habe :)
Daniel Eberts

5

Ein Beispiel für Python-Code, der Resampling ordnungsgemäß implementiert, ist möglicherweise hilfreich für dieses Github-Projekt: https://github.com/mjl/particle_filter_demo

Darüber hinaus enthält es eine eigene visuelle Darstellung des Resampling-Prozesses, die Sie beim Debuggen Ihrer eigenen Implementierung unterstützen soll. Partikelfilterbetrieb

In dieser Visualisierung zeigt die grüne Schildkröte die aktuelle Position an, der große graue Punkt zeigt die geschätzte Position an und wird grün, wenn er konvergiert. Das Gewicht geht von wahrscheinlich (rot) bis unwahrscheinlich (blau).


Danke für den Link. Es ist immer aufschlussreich zu sehen, wie andere Leute einen Algorithmus implementiert haben.
Daniel Eberts

Dies ist eine Visualisierung eines konvergierenden Partikelfilters. Ich bin nicht sicher, welchen Einblick es in Bezug auf die Frage gibt.
Jakob

Ich habe die Visualisierung eingefügt, da sie durch den von mir veröffentlichten Code erstellt wird - ein Beispiel für die ordnungsgemäße Implementierung des Resamplings.
Ian

1

Eine einfache Möglichkeit hierfür ist numpy.random.choice (N, N, p = w, replace = True), wobei N die Nr. ist. von Partikeln und w = normalisierte Gewichte.


Willkommen bei Robotics , Narayan. Könnten Sie bitte diese Antwort etwas erweitern? Warum zum Beispiel eine zufällige Auswahl treffen? Was ist pin Ihrer Funktion? Je detaillierter Sie antworten können, desto nützlicher wird es für zukünftige Besucher, die das gleiche Problem haben.
Chuck

1

Ich verwende @ narayans Ansatz, um meinen Partikelfilter zu implementieren:

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

a ist der Vektor Ihrer zu untersuchenden Partikel, Größe ist die Anzahl der Partikel und p ist der Vektor ihrer normalisierten Gewichte. replace = True behandelt das Bootstrap-Sampling mit dem Ersetzen. Der Rückgabewert ist ein Vektor neuer Partikelobjekte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.