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

正則化與收縮:馴服高維共變異數

為何樣本共變異數是每個 BCI 解碼器的最弱環節,以及收縮——尤其是解析式的 Ledoit–Wolf 估計量——如何把壞掉的 LDA 變成領域中最可靠的基準。

共變異數的難題

無論你的特徵是頻帶功率向量、ERP 時間歷程,或本身就是共變異數矩陣,解碼器都需要一個特徵的共變異數來加權與白化它們。在 p 個特徵、n 個試次下,樣本估計 \hat\Sigma=\tfrac1n\sum_i (x_i-\bar x)(x_i-\bar x)^\top 的秩至多為 n-1。若 p\ge n 它就奇異;即使 p<n,其最大特徵值也被膨脹、最小特徵值被壓向零。

由於 LDA 需要 \Sigma^{-1},那些被壓扁的特徵值在反轉後會爆炸。解碼器最終最信任的,竟是噪聲方向——最小特徵值所估出的特徵向量。單憑這個事實,就能解釋教科書版 LDA 與能上線運作版之間的絕大多數落差。

正則化:把估計拉向簡單

正則化的意思是刻意讓估計產生偏差以降低其變異數——也就是在第 1 篇的偏差–變異數曲線上向左移動。對共變異數而言,最簡單的正則化是在反轉前加上一個脊項 \lambda I,把每個特徵值抬離零。這正是套用於白化步驟的 Tikhonov 正則化,以少許偏差換取變異數的大幅削減。

朝結構化目標收縮

收縮共變異數估計把含噪的樣本共變異數與一個低變異、高偏差的目標混合——通常是一個縮放後的單位矩陣,它保留平均變異數卻丟棄所有不可靠的非對角結構。

\hat\Sigma_{\gamma}=(1-\gamma)\,\hat\Sigma+\gamma\,\nu\,I,\qquad \nu=\tfrac{1}{p}\operatorname{tr}(\hat\Sigma),\quad \gamma\in[0,1]

收縮估計量。\gamma=0 為原始樣本共變異數;\gamma=1 為一個球面。目標 \nu I 保留總變異數(跡)並抹除相關性中的取樣噪聲。

試次太少時,原始共變異數不可靠,其反元素會爆掉。把它與一個簡單、乖巧的球面混合,往球面靠攏;\gamma 就是在調你要多信任資料、還是多信任那個安全的預設。

\hat\Sigma
來自有限資料、含噪的樣本共變異數。
\gamma
收縮強度,從 0(全用資料)到 1(全用球面)。
\nu I
目標:半徑等於平均變異數的球面。
\nu=\tfrac{1}{p}\operatorname{tr}(\hat\Sigma)
平均變異數,這樣選是為了保留總分散度(跡)。

這就是收縮共變異數估計,一種讓 LDA 在極小資料集上保持穩定的正則化

從幾何上看,收縮把過大的特徵值往下拉、過小的往上抬,趨向共同均值 \nu——恰好逆轉取樣的失真。與 LDA 結合即為「收縮 LDA」,在小型運動想像資料集上,它通常以可觀且可重現的幅度勝過裸 LDA。

Ledoit–Wolf:無需交叉驗證即可選定 γ

優雅之處在於你完全不必調 \gamma。Ledoit 與 Wolf 推導出使「與真實共變異數的期望 Frobenius 距離」最小化的 \gamma,其閉式解僅由資料本身決定。直覺是估計量之間的訊噪比:當樣本共變異數含噪時就多收縮,當它可信時就少收縮。

\gamma^{\star}=\frac{\sum_{i,j}\widehat{\operatorname{Var}}\big[\hat\Sigma_{ij}\big]}{\sum_{i,j}\big(\hat\Sigma_{ij}-T_{ij}\big)^2}

最佳收縮強度(示意)。分子=樣本共變異數各元素有多含噪;分母=它們離目標 T 有多遠。兩者皆由同一份資料估得,故 \gamma^\star 是免費的。

你不必用猜的來決定 \gamma——Ledoit–Wolf 法則直接從資料算出最佳值:當共變異數各元素很含噪時就收縮得多,當它們早已遠離目標、明顯是真訊號時就收縮得少。

\sum_{i,j}\widehat{\operatorname{Var}}[\hat\Sigma_{ij}]
分子:共變異數各元素中的總取樣噪聲。
\sum_{i,j}(\hat\Sigma_{ij}-T_{ij})^2
分母:各元素離目標 T 有多遠。
\gamma^{\star}
由此得出的最佳收縮強度,用同一份資料免費算得。
T_{ij}
結構化收縮目標的一個元素。

非常含噪的元素把 \gamma^{\star} 推向 1;乾淨、估得好的元素把它拉向 0——完全不需交叉驗證。

# Shrinkage LDA for a C-class BCI
from sklearn.covariance import ledoit_wolf
S, gamma = ledoit_wolf(X_train)      # regularized p x p covariance + auto gamma
Sinv = np.linalg.inv(S)              # now safe to invert
for c in classes:                    # per-class linear discriminant
    w[c] = Sinv @ mu[c]
    b[c] = -0.5 * mu[c] @ Sinv @ mu[c] + np.log(prior[c])
y_hat = argmax_c(x @ w[c] + b[c])    # assign to top score
Ledoit–Wolf 收縮讓 \Sigma^{-1} 良態且無需手動調參——這個兩行的升級,在小型 BCI 資料上常勝過複雜得多的模型。

選擇特徵,而不只是正則化它們

收縮保留所有特徵但加以馴服;特徵選擇則是移除特徵。兩者互補,但選擇很危險:任何偷看標籤的特徵排序都必須嚴格發生在訓練摺內,否則會悄悄洩漏測試資訊(第 3 篇)。在交叉驗證前對整個資料集跑單變量篩選,正是已發表的 BCI 準確率最終被證明是虛構的最常見途徑之一。