[編集] @Claudioの答えは、私に外れ値を除外する方法についての本当に良いヒントを与えます。私は自分のデータでカルマンフィルタを使い始めたいと思っています。そこで以下のサンプルデータを変更して極端ではない微妙なバリエーションノイズが発生するようにしました(私も同様です)。他の誰かが私のデータにPyKalmanをどのように使うべきかについての指示を私に与えることができれば、それは素晴らしいものになるでしょう。 場所データのPythonでカルマンフィルタを使用するには?
ロボットプロジェクトの場合、私はカメラで空気中の凧を追跡しようとしています。私はPythonでプログラミングしています。以下のようなノイズの多い場所の結果を貼り付けました(すべてのアイテムにはdatetimeオブジェクトが含まれていますが、わかりやすくするためにそれらを残しました)。
[ # 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)}
]
まず、異常値を手作業で計算してから、リアルタイムでそれらを単にデータから削除することを考えました。次に、私はカルマンフィルタと、それが具体的にどのようにノイズの多いデータを滑らかにすることになっているかについて読んでいます。 検索の結果、PyKalman libraryが見つかりました。私はカルマンフィルタの用語全体で少し失われていたので、私はwikiとカルマンフィルタのいくつかの他のページを読みました。私はカルマンフィルタの一般的な考え方を得ていますが、私は自分のコードにどのように適用すればいいか分かりません。 PyKalman docsで
私は、次の例を見つけました:
>>> 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)
次のように私は単に私自身の観察のための観測を置換:
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)
をそれは私にどんな意味のあるデータを与えるものではありません。
>>> 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]])
は私よりも明るく魂が正しい方向に私にいくつかのヒントや例を与えることができる:たとえば、smoothed_state_means
は、次のようになり?すべてのヒントは大歓迎です!
フィルタが必要な場合もありますが、カルマンフィルタが必要かどうかわかりません。あなたがカルマンフィルタを必要としていると確信していない限り、私はここで使用するフィルタリングの種類について尋ねることをお勧めします:http://dsp.stackexchange.com/ –
あなたの質問に答えません。 3シグマ以外の値を削除すると、投稿されたノイズのある値はすべて削除されます。 – Ben
私の(微妙な)理解では、カルマンフィルタは、(不完全な)物理的/数学的モデルと実際の(ノイズの多い)測定値との間の不一致を調整します。 - あなたの問題の声明では、ポジションの予測モデルを認識できないので、カルマンフィルタがあなたに役立つかどうか疑問に思います。 – gboffi