k 最近鄰影像分類器
k 最近鄰(k-nearest-neighbors, kNN)分類器是整個辨識領域中最直白的想法:要為一張新影像貼標籤,就找出與它最相似的 k 張訓練影像,讓它們投票。沒有一般意義上的訓練——你只是把每個有標籤的樣本存起來。測試時,你計算新影像的特徵向量與每個已儲存向量之間的距離,挑出最小的 k 個距離,把這 k 個鄰居中的多數類別指派給它。當 k = 1 時,新影像就直接複製它唯一最接近的匹配;k 越大則藉由對更多鄰居取平均使決策更平滑,對雜訊離群點也更穩健。
精確地說,你需要兩個選擇:一種特徵表示與一種距離。在原始像素上,像 L2(歐氏距離,逐像素平方差總和的平方根)或 L1(絕對差總和)這類距離以差勁著稱,因為它們把一個像素的位移或一次亮度變化都當成巨大差異——同一物件的兩張照片在像素空間中的距離,可能比不同物件的兩張照片還遠。kNN 唯有在好的特徵上才變得有用:配上適當距離的 HOG 或色彩直方圖(直方圖用卡方或直方圖交集),以及今日來自 CNN 或 CLIP 的深度嵌入,在其中普通的餘弦距離突然就能把語意相似的影像聚在一起。參數 k 與距離度量都是用驗證集挑選的超參數。
kNN 的魅力在於它極其簡單、對類別邊界的形狀不做任何假設(它能切出任意複雜的區域),並能輕易處理新類別——只要把它們的樣本加進去即可。它的弱點同樣有名,也說明了為何它通常只當基準。測試時又慢又耗記憶體:每次預測都要掃過整個訓練集,正好與 SVM 或 CNN 這類做快速固定成本推論的模型相反。它深受維度詛咒(curse of dimensionality)之苦,在高維特徵空間中所有點變得大致等距,最近鄰的概念隨之失效。而它的好壞完全取決於其特徵空間與距離度量——這正是為何在現代系統中,kNN 是以「在學習得來的嵌入之上做檢索」的角色發光(人臉辨識、影像搜尋、檢索增強流程),而非當作直接在原始影像上的分類器。
經典教學陷阱:在原始像素上用 L2 距離做最近鄰,常常是按整體亮度與背景顏色分類,而非按物件——雪地上的黑貓會落在雪地上的黑狗旁邊。這個教訓可推廣:kNN 不學表示,所以它的準確度完全繼承自你餵給它的特徵。