F = 1 dt 0 1 H = [1, 0] ( 観測は位置のみ ) # Kalman Filter 実装(Python/NumPy ) import numpy as np # 初期化 x_est = np.array([0, 0]) # 初期状態 [ 位置, 速度] P_est = np.eye(2) # 初期共分散行列 # システムモデル定義 F = np.array([[1, 1], [0, 1]]) # 状態遷移行列 H = np.array([[1, 0]]) # 観測行列 Q = np.eye(2) * 0.01 # システムノイズ共分散 R = np.array([[0.1]]) # 観測ノイズ共分散 # カルマンフィルタアルゴリズム for t in range(len(z)): # z は観測値系列 # 予測ステップ x_pred = F.dot(x_est) P_pred = F.dot(P_est).dot(F.T) + Q # 更新ステップ y = z[t] - H.dot(x_pred) # 残差 S = H.dot(P_pred).dot(H.T) + R # 残差共分散 K = P_pred.dot(H.T).dot(np.linalg.inv(S)) # カルマンゲイン x_est = x_pred + K.dot(y) # 状態更新 P_est = (np.eye(2) - K.dot(H)).dot(P_pred) # 共分散更新 カルマンゲイン K の役割:予測値とノイズある観測値の最適バ ランスを取る • K↓: モデル信頼 ↑ / 観測信頼 ↓ • K↑: モデル信頼 ↓ / 観測信頼 ↑ 時間ステップ 位置 真の位置 ノイズのある観測値 カルマンフィルタ推定値 図 : カルマンフィルタによる位置推定。観測ノイズ(オレンジ点)にもかかわらず、 カルマンフィルタ(赤線)は真の位置(黄線)を精度よく追跡できている。 機械学習分野におけるデータ同化入門 9 / 10