Wie zu verwenden Kalman-filter in Python für Standort-Daten?

[BEARBEITEN]
Die Antwort von @Claudio gibt mir einen wirklich guten Tipp, wie man herausfiltern, die Ausreißer. Ich möchte beginnen mit einem Kalman-filter auf meine Daten obwohl. Also änderte ich die Beispiel Daten unten, so dass es subtile variation Geräusche, die sind nicht so extrem (was ich sehr gut). Wenn sonst jemand könnte mir einige Richtung für die Verwendung PyKalman auf meine Daten, das wäre toll.
[/EDIT]

Für ein Robotik-Projekt, das ich bin versucht zu verfolgen, einen kite in der Luft mit einer Kamera. Ich bin Programmierung in Python und ich klebte einige laute Lage nachstehenden Ergebnisse (jeder Artikel hat auch ein datetime-Objekt enthalten, aber ich ließ Sie für Klarheit).

[           # X     Y 
    {'loc': (399, 293)},
    {'loc': (403, 299)},
    {'loc': (409, 308)},
    {'loc': (416, 315)},
    {'loc': (418, 318)},
    {'loc': (420, 323)},
    {'loc': (429, 326)},  # <== Noise in X
    {'loc': (423, 328)},
    {'loc': (429, 334)},
    {'loc': (431, 337)},
    {'loc': (433, 342)},
    {'loc': (434, 352)},  # <== Noise in Y
    {'loc': (434, 349)},
    {'loc': (433, 350)},
    {'loc': (431, 350)},
    {'loc': (430, 349)},
    {'loc': (428, 347)},
    {'loc': (427, 345)},
    {'loc': (425, 341)},
    {'loc': (429, 338)},  # <== Noise in X
    {'loc': (431, 328)},  # <== Noise in X
    {'loc': (410, 313)},
    {'loc': (406, 306)},
    {'loc': (402, 299)},
    {'loc': (397, 291)},
    {'loc': (391, 294)},  # <== Noise in Y
    {'loc': (376, 270)},
    {'loc': (372, 272)},
    {'loc': (351, 248)},
    {'loc': (336, 244)},
    {'loc': (327, 236)},
    {'loc': (307, 220)}
]

Ich zuerst dachte, die manuelle Berechnung Ausreißer und dann einfach entfernen Sie Sie aus den Daten in Echtzeit. Dann habe ich gelesen, Kalman-Filter und wie Sie speziell gemeint zu glätten verrauschter Daten.
So nach einigem suchen fand ich die PyKalman Bibliothek, die scheint perfekt für diese. Da war ich ein bisschen verloren in der ganzen Kalman-filter-Terminologie, die ich durch Lesen der wiki und einigen anderen Seiten, die auf Kalman-Filter. Ich bekomme die Allgemeine Vorstellung von einem Kalman-filter, aber ich bin wirklich verloren, wie sollte ich es anwenden, meinen code.

In der PyKalman docs fand ich Folgendes Beispiel:

>>> from pykalman import KalmanFilter
>>> import numpy as np
>>> kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
>>> measurements = np.asarray([[1,0], [0,0], [0,1]])  # 3 observations
>>> kf = kf.em(measurements, n_iter=5)
>>> (filtered_state_means, filtered_state_covariances) = kf.filter(measurements)
>>> (smoothed_state_means, smoothed_state_covariances) = kf.smooth(measurements)

Habe ich einfach ersetzt die Beobachtungen für meine eigenen Beobachtungen wie folgt:

from pykalman import KalmanFilter
import numpy as np
kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
measurements = np.asarray([(399,293),(403,299),(409,308),(416,315),(418,318),(420,323),(429,326),(423,328),(429,334),(431,337),(433,342),(434,352),(434,349),(433,350),(431,350),(430,349),(428,347),(427,345),(425,341),(429,338),(431,328),(410,313),(406,306),(402,299),(397,291),(391,294),(376,270),(372,272),(351,248),(336,244),(327,236),(307,220)])
kf = kf.em(measurements, n_iter=5)
(filtered_state_means, filtered_state_covariances) = kf.filter(measurements)
(smoothed_state_means, smoothed_state_covariances) = kf.smooth(measurements)

aber nicht, dass mir irgendwelche sinnvollen Daten. Zum Beispiel, die smoothed_state_means wird die folgenden:

>>> smoothed_state_means
array([[-235.47463353,   36.95271449],
       [-354.8712597 ,   27.70011485],
       [-402.19985301,   21.75847069],
       [-423.24073418,   17.54604304],
       [-433.96622233,   14.36072376],
       [-443.05275258,   11.94368163],
       [-446.89521434,    9.97960296],
       [-456.19359012,    8.54765215],
       [-465.79317394,    7.6133633 ],
       [-474.84869079,    7.10419182],
       [-487.66174033,    7.1211321 ],
       [-504.6528746 ,    7.81715451],
       [-506.76051587,    8.68135952],
       [-510.13247696,    9.7280697 ],
       [-512.39637431,   10.9610031 ],
       [-511.94189431,   12.32378146],
       [-509.32990832,   13.77980587],
       [-504.39389762,   15.29418648],
       [-495.15439769,   16.762472  ],
       [-480.31085928,   18.02633612],
       [-456.80082586,   18.80355017],
       [-437.35977492,   19.24869224],
       [-420.7706184 ,   19.52147918],
       [-405.59500937,   19.70357845],
       [-392.62770281,   19.8936389 ],
       [-388.8656724 ,   20.44525168],
       [-361.95411607,   20.57651509],
       [-352.32671579,   20.84174084],
       [-327.46028214,   20.77224385],
       [-319.75994982,   20.9443245 ],
       [-306.69948771,   21.24618955],
       [-287.03222693,   21.43135098]])

Könnte ein heller Seele, als Sie mir geben Sie mir einige Hinweise oder Beispiele in die richtige Richtung? Alle Tipps sind willkommen!

  • Sie können auch brauchen einen filter, aber ich bin nicht sicher, benötigen Sie einen Kalman-filter. Es sei denn, Sie sind sicher, Sie benötigen ein Kalman-filter würde ich vorschlagen, Fragen über, welche Art der Filterung hier benutzen: dsp.stackexchange.com
  • Nicht eine Antwort auf deine Frage; aber das entfernen Werte außerhalb der 3-sigma-wird loszuwerden, alle Ihre geposteten Werte lauten und nichts anderes.
  • In meinen (schwachen) Verständnis ein Kalman-filter stellt die Diskrepanzen zwischen den Vorhersagen einer (unvollkommenen) physikalisch/mathematischen Modell und der tatsächlichen (verrauschte) Messungen. — In Ihrer Problembeschreibung kann ich nicht erkennen, ein prädiktives Modell aus der position, so Frage ich mich, wenn ein Kalman-filter konnte dir helfen.
  • Von dem, was ich verstehe, ein Kalman-filter, ist, dass es dauert eine Reihe von Messungen glätten Sie es heraus, so dass es verwendet werden kann, um A) die Ergebnisse, die näher an der Realität, denn Lärm ist mehr oder weniger abgebrochen, out B) erweitern Sie die gemessenen Punkte, so dass eine Vorhersage gemacht werden kann für die Punkte vor. Oder bin ich Total falsch hier?
  • Können Sie nach dem code, den Sie verwendet für die Generierung von Ergebnisse auf IHRER eigenen Daten?
  • Meinst du den code, mit dem ich erzeugt, die smoothed_state_means ich geschrieben?
  • Ich habe den code, den ich verwendet, um die smoothed_state_means zu der ersten Frage oben. Hilft das dir?
  • möchten Sie vielleicht check out my open-source-book "Kalman-und Bayes-Filter in Python". Es enthält sehr ähnliche Projekte. Ich glaube nicht, verwenden PyKalman, aber meine eigene Bibliothek, FilterPy, die Sie installieren können, mit pip oder mit conda. Sorry, wenn dies scheint wie eine Werbung, aber das Buch hat so ziemlich genau die Antwort auf Ihre Frage. github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python
  • Ich würde schätzen, wenn Sie konnten haben Sie einen Blick auf diese und danke: stackoverflow.com/questions/44944512/...

InformationsquelleAutor kramer65 | 2017-04-12
Schreibe einen Kommentar