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:
- Normalisieren Sie die Gewichte
- Multiplizieren Sie jedes Gewicht mit der Gesamtzahl der Partikel
- 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?
quelle
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.
quelle
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.
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).
quelle
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.
quelle
p
in Ihrer Funktion? Je detaillierter Sie antworten können, desto nützlicher wird es für zukünftige Besucher, die das gleiche Problem haben.Ich verwende @ narayans Ansatz, um meinen Partikelfilter zu implementieren:
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.
quelle