JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

卡爾曼濾波器:推導與調校

運動 BCI 的線性高斯主力——增益、創新項、速度技巧,以及如何設定決定平順與遲滯的雜訊共變異數。

線性高斯的世界

假設動力學為線性、觀測為線性、且兩種雜訊皆為高斯。此時會發生一件美妙的事:後驗永遠是高斯的,因此只需其均值 \hat{x}_k 與共變異數 P_k 即可完整描述。第一份指南中難解的貝葉斯積分,便簡化為對這兩個物件的封閉形式矩陣運算。這套運算就是卡爾曼濾波器——那個遞迴、最佳(最小均方誤差)的線性估計器。

預測步驟

預測就是把前一刻的估計推過動力學,並讓不確定性因過程雜訊 W 而增長:

\hat{x}_k^{-} = A\,\hat{x}_{k-1}, \qquad P_k^{-} = A\,P_{k-1}\,A^{\top} + W

上標減號代表先驗(量測前)的估計。

把上一步的最佳估計沿動力學向前推,猜出新狀態,並讓不確定性變大——因為單靠預測總會多添一分懷疑。

\hat{x}_k^{-}
預測(先驗)狀態,在本步量測之前。
P_k^{-}
該估計的預測不確定性(共變異數)。
A
把狀態往前帶的動力學矩陣。
W
每步加入的過程雜訊,使 P 膨脹。

這是卡爾曼濾波循環的預測那一半。

更新步驟:增益、創新項、修正

現在把量測納入。創新項 r_k 是驚訝程度——實際神經讀值與預測所期望值之間的差距。卡爾曼增益 K_k 決定要相信這份驚訝多少,狀態便據此被推移。

\begin{aligned} \text{innovation:}\quad & r_k = y_k - C\,\hat{x}_k^{-} \\ \text{gain:}\quad & K_k = P_k^{-} C^{\top}\big(C\,P_k^{-} C^{\top} + Q\big)^{-1} \\ \text{update:}\quad & \hat{x}_k = \hat{x}_k^{-} + K_k\,r_k, \qquad P_k = (I - K_k C)\,P_k^{-} \end{aligned}

增益在預測不確定性 P 與量測雜訊 Q 之間取得最佳平衡。

看看預測錯了多少(創新量),再依增益決定把估計往量測推多少——感測器可靠時就多信它,不可靠時就多信預測。

r_k
創新量:量測減去預測的量測。
K_k
卡爾曼增益——要往資料移動多少。
Q
量測雜訊共變異數;Q 大則增益縮小。
P_k
修正後更新、縮小的不確定性。

卡爾曼增益在預測不確定性 P 與量測雜訊 Q 之間取得平衡;參見創新序列

# one Kalman step (linear-Gaussian)
def kalman_step(x, P, y, A, W, C, Q):
    # predict
    x = A @ x
    P = A @ P @ A.T + W
    # update
    r = y - C @ x                    # innovation (surprise)
    S = C @ P @ C.T + Q              # innovation covariance
    K = P @ C.T @ np.linalg.inv(S)   # Kalman gain
    x = x + K @ r
    P = (np.eye(len(x)) - K @ C) @ P
    return x, P
整個即時解碼器就是這約八行程式碼、每個時間格運行一次。

速度卡爾曼濾波器

真正驅動植入式游標的版本,是速度卡爾曼濾波器。它的狀態同時包含位置與速度,但關鍵的設計抉擇——在 BrainGate 時代吃了苦頭才學到——是讓神經元編碼速度,並以速度積分求得位置,而非直接解碼位置。

用速度卡爾曼濾波器把游標帶往目標;過程雜訊與量測雜訊滑桿正是上方方程式中的 W 與 Q——親自感受平順與遲滯的取捨。

批次表親:維納濾波器與 OLE

若你完全忽略動力學,只把動作學對一段滑動的神經歷史視窗做回歸,便得到維納濾波器最佳線性估計器——那種批次、非遞迴的解碼器,至今仍被許多實驗室當作基準線。

L^{\star} = \arg\min_{L}\; \mathbb{E}\big\lVert x_k - L\,\mathbf{y}_k \big\rVert^{2} = \Sigma_{xy}\,\Sigma_{yy}^{-1}, \qquad \hat{x}_k = L^{\star}\mathbf{y}_k

y_k 堆疊一段延遲視窗的神經特徵;維納解是一個正則化的共變異數比值。

卡爾曼濾波的批次表親:不做遞迴,而是直接擬合一個矩陣,把一段神經特徵視窗映射到狀態,做法是以這些特徵回歸狀態。答案是一個共變異數比值。

\mathbf{y}_k
堆疊起來的一段延遲神經特徵視窗。
L^{\star}
從特徵到狀態的最佳線性映射。
\Sigma_{xy}
狀態與特徵之間的交叉共變異數。
\Sigma_{yy}^{-1}
特徵共變異數的反元素,用來白化輸入。

這就是維納濾波最佳線性估計器——當特徵數多於樣本時,要對 \Sigma_{yy}^{-1} 正則化。

卡爾曼濾波器本質上是這個想法的遞迴、感知動力學的升級版:它不是固定回歸,而是維持一個信心度隨時調整的持續估計。實務上兩者在離線解碼時常表現相近——卡爾曼濾波器的優勢展現在閉迴路,那裡它的平順性與積分器行為才真正重要(見第四份指南)。

實務中的濾波器調校

擬合即是系統辨識:由訓練動作學的自相關估計 A, W,並以神經特徵對動作學回歸來估計 C, Q(見下一份指南)。但 WQ 實際上是超參數——許多團隊會刻意把 Q 放大或把 W 縮小到擬合值之外,以換取額外的平順,因為在開迴路資料上統計最佳的濾波器,往往不是使用者閉迴路時感覺最好的那一個。