線性高斯的世界
假設動力學為線性、觀測為線性、且兩種雜訊皆為高斯。此時會發生一件美妙的事:後驗永遠是高斯的,因此只需其均值 \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 之間取得最佳平衡。
# 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 時代吃了苦頭才學到——是讓神經元編碼速度,並以速度積分求得位置,而非直接解碼位置。
批次表親:維納濾波器與 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}_ky_k 堆疊一段延遲視窗的神經特徵;維納解是一個正則化的共變異數比值。
卡爾曼濾波器本質上是這個想法的遞迴、感知動力學的升級版:它不是固定回歸,而是維持一個信心度隨時調整的持續估計。實務上兩者在離線解碼時常表現相近——卡爾曼濾波器的優勢展現在閉迴路,那裡它的平順性與積分器行為才真正重要(見第四份指南)。
實務中的濾波器調校
擬合即是系統辨識:由訓練動作學的自相關估計 A, W,並以神經特徵對動作學回歸來估計 C, Q(見下一份指南)。但 W 與 Q 實際上是超參數——許多團隊會刻意把 Q 放大或把 W 縮小到擬合值之外,以換取額外的平順,因為在開迴路資料上統計最佳的濾波器,往往不是使用者閉迴路時感覺最好的那一個。