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

特徵:解碼器真正看到的東西

在任何[[bci-classifier|分類器]]猜測你的意圖之前,原始腦訊號必須被濃縮成少量有意義的數字。本指南展示節律式 BCI 與[[event-related-potential|事件相關]]式 BCI 中這些數字是什麼,以及為什麼往往越少越好。

為什麼不直接餵原始訊號?

想像你遞給朋友一段一小時的會議錄音,然後問「他們到底決定了什麼?」朋友得把整段都聽完才能回答。一段原始腦電圖窗口就像那段錄音:每個通道有成千上萬個取樣點,大多是冗餘的,還摻雜著偽訊,真正和你意圖相關的只有極小一部分。

特徵提取就是寫摘要的過程。你不再保留每個取樣點,而是計算出幾個能抓住關鍵資訊的數字:某種節律有多強,或者某個時刻出現了多大的波峰。分類器隨後只處理這份簡短的摘要——這更快、更穩定,也更容易從中學習。

頻帶功率特徵

對於運動想像穩態視覺誘發電位(SSVEP)這類基於節律的 BCI,有用的資訊藏在某個通道、某個頻帶裡集中了多少能量。這個量就是頻帶功率。當你想像移動左手時,對側頭部的μ 節律(約 8 至 13 赫茲)會下降;頻帶功率把這種下降變成解碼器能讀取的一個數字。

一個簡單的做法:先用帶通濾波器只保留你關心的頻率,再測量訊號擺動得有多厲害。帶通後訊號的變異數就是其功率的一個乾淨替代,因為功率本質上就是平均的振幅平方。

import numpy as np
from scipy.signal import butter, filtfilt

# x: one channel of a short EEG window; fs: sampling rate (Hz)
def band_power(x, fs, lo=8, hi=13):
    # design an 8-13 Hz bandpass (the mu band)
    b, a = butter(4, [lo, hi], btype="band", fs=fs)
    # filtfilt filters forward + backward (no phase shift)
    xf = filtfilt(b, a, x)
    # variance of the band = its power -> one number per window
    return np.var(xf)
把頻帶功率算作帶通窗口的變異數:每個通道、每個頻帶得到一個特徵。

事件相關電位特徵

P300 以及其他事件相關電位(ERP)式 BCI 的工作方式不同。這裡訊號不是靠持續的節律功率講故事,而是靠在刺激之後固定延遲處出現的一種波形來表達。比如 P300,就是在某個出乎意料或相關的目標閃過之後約 300 毫秒達到頂點的一個正向電壓波峰。

因此 ERP 特徵不是某個頻帶裡的功率,而是在選定時刻測得的振幅,以刺激為時間起點。常見做法是把窗口對齊到每個刺激,然後在若干時間點(比如從 0 到 600 毫秒每隔 50 毫秒取一次)跨通道採集電壓值。把這些值堆疊起來,就得到了你的特徵向量。這種特徵的「形狀」是時間,而不是頻率。

保持精簡

把每個通道、每個頻帶、每個時間點的東西全塞進去,聽起來很誘人。請克制。當特徵很多、而校準資料只有幾分鐘時,分類器會開始記住那些碰巧和你的標籤對上的雜訊:它在訓練時看起來很出色,一到即時使用就崩潰。這個陷阱叫過擬合,下一篇指南將專門講它。

有兩種應對方法。特徵選擇只保留真正承載意圖的通道和頻帶,丟掉其餘的。降維則把許多原始通道組合成少數幾個有資訊量的混合。對於運動想像,這與共空間模式(CSP)天然契合——它能在你計算頻帶功率之前,先學出最能區分兩種心理狀態的通道混合方式。