カルマンフィルター

🔥 Vibe プロンプト

「ノイズの多いGPS(σ=30m)とIMU(σ=20m)から車両の位置と速度を追跡。生データとフィルター後を比較。」

カルマンフィルターとは?

カルマンフィルターは、ノイズの多いセンサー測定値からシステムの状態を推定する最適アルゴリズムです。予測と測定をカルマンゲインKで最適にブレンドします。

| ステップ | 式 | 目的 | |---------|-----|------| | 予測 | x̂ = F·x | 運動モデルで次の状態を予測 | | 予測 | P̂ = F·P·Fᵀ + Q | 誤差共分散を予測(不確かさ増大) | | 更新 | y = z − H·x̂ | 残差を計算(測定との差) | | 更新 | K = P̂·Hᵀ·S⁻¹ | カルマンゲイン計算(最適ブレンド比) | | 更新 | x = x̂ + K·y | 測定値で状態推定を更新 | | 更新 | P = (I − K·H)·P̂ | 誤差共分散を更新(不確かさ減少) |

実装

import numpy as np

class KalmanFilter:
    def __init__(self):
        self.x = np.array([[0],[0],[0],[0]])
        self.P = np.eye(4) * 100
        self.F = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]])
        self.H = np.array([[1,0,0,0],[0,1,0,0]])
        self.R = np.eye(2) * 30
        self.Q = np.eye(4) * 0.1
    
    def predict(self):
        self.x = self.F @ self.x
        self.P = self.F @ self.P @ self.F.T + self.Q
    
    def update(self, z):
        y = z - self.H @ self.x
        S = self.H @ self.P @ self.H.T + self.R
        K = self.P @ self.H.T @ np.linalg.inv(S)
        self.x += K @ y
        self.P = (np.eye(4) - K @ self.H) @ self.P

# シミュレーション
kf = KalmanFilter()
true_pos = np.array([100, 100])
true_vel = np.array([5, 3])

error_raws = []
error_filts = []

for t in range(20):
    true_pos = true_pos + true_vel
    gps = true_pos + np.random.normal(0, 30, 2)
    
    kf.predict(); kf.update(gps)
    
    err_raw = np.linalg.norm(gps - true_pos)
    err_filt = np.linalg.norm(kf.x[:2].flatten() - true_pos)
    error_raws.append(err_raw)
    error_filts.append(err_filt)
    
    print(f"t={t}: 生誤差={err_raw:.1f}, フィルター誤差={err_filt:.1f}")

print(f"\n平均: 生誤差={np.mean(error_raws):.1f}, フィルター誤差={np.mean(error_filts):.1f}")
print(f"改善率: {(1-np.sum(error_filts)/np.sum(error_raws))*100:.1f}%")

拡張カルマンフィルター(EKF)

非線形システムの場合、EKFは現在の推定値の周りで線形化します:

運動モデルのヤコビアンを使用:
  F_actual = ∂f/∂x(x̂で評価)

例:旋回車両の追跡:
  x' = x + v·cos(θ)·dt ← 非線形
  ヤコビアン F = [[1,0,dt·cos(θ),-v·dt·sin(θ)],
                  [0,1,dt·sin(θ), v·dt·cos(θ)],
                  [0,0,1,0],
                  [0,0,0,1]]

応用

| 分野 | 用途 | |------|------| | 🛰️ GPS/IMU | ドローン、自動運転車、スマホ位置推定 | | 🚀 航空宇宙 | ロケット誘導、衛星軌道決定 | | 🤖 ロボティクス | SLAM(自己位置推定と地図構築) | | 📈 金融 | 隠れマルコフモデル、レジーム検出 | | 🫀 医療 | ECGノイズ除去、血糖値モニタリング |

まとめ

| 項目 | 詳細 | |------|------| | 状態 | 追跡対象(位置、速度など) | | 予測 | 運動モデル(F) + プロセスノイズ(Q) | | 更新 | 測定(z) + 測定ノイズ(R) | | カルマンゲイン(K) | 予測と測定の信頼度を最適調整 | | 収束 | Kは十分なステップ後に一定値に収束 | | 拡張 | EKF(非線形), UKF, パーティクルフィルター |

勾配降下法コース完了!🎉

  • ✅ 勾配降下法の基礎
  • ✅ Momentum & Adam
  • ✅ FFT / DFT
  • ✅ PID制御
  • ✅ カルマンフィルター
  • ✅ EKF拡張

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!