K-近鄰演算法入門:用鄰居投票理解機器學習分類

面向初學者講解 K-近鄰演算法的基本想法:什麼是 K、為什麼要找最近鄰、如何用投票完成分類,以及它的優點、限制和常見使用場景。

K-近鄰演算法,也常寫作 KNNk-NN,是機器學習裡非常適合入門的一類演算法。它的想法很樸素:要判斷一個新樣本屬於哪一類,就看看它周圍最像它的幾個樣本大多屬於哪一類。

如果一句話解釋 KNN,可以這樣說:

近朱者赤,近墨者黑。

比如你剛搬到一個社區,不知道附近哪家早餐店更適合學生。你問了離你最近的 5 個鄰居,裡面 4 個人都推薦同一家店,那你大概率也會先相信這家店。KNN 做分類時,也是在做類似的事情:找鄰居,看多數。

1. 先從一個小例子理解

假設我們要判斷一個水果是蘋果還是橘子。已知一些水果的特徵,比如:

  • 重量
  • 顏色
  • 甜度
  • 表皮是否粗糙

現在來了一個新水果,我們還不知道它是什麼。KNN 不會先總結一套複雜規則,而是直接去已知水果裡找「最像它」的幾個。

如果最像它的 5 個水果中,有 4 個是蘋果,1 個是橘子,那麼 KNN 就會判斷:這個新水果更可能是蘋果。

這裡的 K,就是「要看幾個鄰居」。如果 K=5,就是看最近的 5 個樣本。

2. 一個簡單示意圖

下面用一個二維小圖來直觀理解。假設 A 表示蘋果,O 表示橘子,? 是我們想判斷的新水果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
甜度 ↑

  高 |        A       A
     |
     |           ?
     |       A       O
     |
  低 |   O       O
     +--------------------→ 重量
        輕              重

如果我們設 K=3,就看離 ? 最近的 3 個點。假設最近的 3 個鄰居裡有 2 個 A、1 個 O,那 KNN 就會把 ? 判斷為 A,也就是蘋果。

這就是 KNN 最核心的過程:找最近的 K 個鄰居,然後投票。

3. KNN 的基本步驟

用不帶公式的方式看,KNN 的分類流程大概是這樣:

  1. 準備一批已經標好類別的資料
  2. 新來一個未知類別的樣本
  3. 計算它和所有已知樣本的相似程度
  4. 找出最相似的 K 個樣本
  5. 看這 K 個樣本裡哪個類別最多
  6. 把新樣本歸到這個類別

這也是為什麼 KNN 很容易理解。它不像一些模型那樣需要先訓練出一堆參數,KNN 更像是把訓練資料先存起來,真正需要判斷時再去查鄰居。

這種特點也讓 KNN 常被稱為一種「惰性學習」方法。這裡的「惰性」不是貶義,而是說它不會在訓練階段做太多計算,主要工作被推遲到了預測階段。

4. 什麼叫「最近」

KNN 裡的「最近」,不一定只是地圖上的距離。它通常表示「特徵上更相似」。

比如判斷水果時,兩個水果如果重量接近、顏色接近、甜度接近,就可以認為距離更近。判斷使用者興趣時,如果兩個人看過的內容、點擊習慣、購買記錄很像,也可以認為他們更接近。

所以 KNN 的關鍵不是「空間位置」,而是你怎麼描述一個樣本。

常見特徵可以是:

  • 商品價格、重量、銷量
  • 使用者年齡、瀏覽次數、購買頻率
  • 圖片的顏色、紋理、形狀
  • 文字中某些詞出現的情況

特徵選得好不好,會直接影響 KNN 的效果。

5. K 值怎麼選

K 不是固定答案,而是需要根據資料來選。

如果 K 太小,比如 K=1,模型會非常相信最近的那個樣本。這有時很敏感:如果最近的樣本剛好是噪聲資料,判斷就容易錯。

如果 K 太大,模型又會看太多鄰居,結果可能被遠處不太相關的樣本影響,分類邊界會變得模糊。

可以把它理解成問人意見:

  • 只問 1 個人:容易被個別意見帶偏
  • 問太多人:可能把不熟悉情況的人也算進來了
  • 問附近幾位最相關的人:通常更穩

在二分類問題裡,很多時候會選奇數 K,比如 357,這樣可以減少投票平局的情況。

6. KNN 不只可以做分類

KNN 最常見的用途是分類,比如判斷:

  • 郵件是不是垃圾郵件
  • 圖片裡是貓還是狗
  • 使用者是否可能流失
  • 一條評論是正面還是負面

但它也可以做迴歸。迴歸可以理解為預測一個數值。

比如我們想估計一套房子的價格,可以找出和它最相似的幾套房子,然後參考這些房子的價格。不是投票選類別,而是把鄰居的數值做一個綜合估計。

簡單說:

  • 分類:鄰居投票,選類別
  • 迴歸:參考鄰居數值,估結果

7. 加權 KNN:近一點的鄰居更重要

普通 KNN 會讓每個鄰居的投票權差不多。但現實中,離得更近的鄰居通常更可信。

比如有 5 個鄰居,其中 1 個和新樣本幾乎一模一樣,另外 4 個只是稍微有點像。完全平均投票可能不太合理。

所以有一種改進思路叫「加權 KNN」:越近的鄰居,影響越大;越遠的鄰居,影響越小。

這很好理解。你買手機時,和你預算、用途、品牌偏好都很接近的人,他的建議往往比泛泛而談的建議更有參考價值。

8. KNN 的優點

KNN 的優點非常適合初學者理解:

  • 思路直觀,容易解釋
  • 不需要複雜訓練過程
  • 可以用於分類,也可以用於迴歸
  • 對一些邊界不規則的問題比較靈活
  • 新增資料時通常比較方便

如果你剛開始學機器學習,KNN 是一個很好的起點。它能幫助你理解「樣本」「特徵」「距離」「分類」「訓練資料」這些基本概念。

9. KNN 的限制

KNN 也有明顯短板。

第一,預測時可能比較慢。因為每來一個新樣本,都要和很多已有樣本比較。如果資料量很大,計算成本會升高。

第二,它很依賴特徵尺度。比如一個特徵是「收入」,動不動幾千幾萬;另一個特徵是「年齡」,通常幾十。如果不做處理,收入這個特徵可能會過度影響距離判斷。

所以在使用 KNN 前,經常需要做資料標準化,讓不同特徵在比較時更公平。

第三,它容易受無關特徵影響。如果你判斷水果類別,卻把「購買日期」這種無關資訊也放進去,模型可能會被干擾。

第四,它對局部資料分布敏感。如果某一類樣本特別多,投票時可能更容易壓過其他類別。

10. 容易和 K-平均演算法混淆

KNNK-平均演算法 名字裡都有 K,但它們不是一回事。

KNN 是監督學習,通常使用已經標好類別的資料來判斷新樣本。

K-平均演算法更常用於聚類,也就是在沒有明確標籤時,把資料自動分成幾組。

可以簡單記:

  • KNN:看鄰居,做分類或迴歸
  • K-平均:找中心,把資料分組

11. 什麼時候適合用 KNN

KNN 適合這些場景:

  • 資料量不太大
  • 特徵比較容易表示成數值
  • 樣本之間的「相似程度」比較有意義
  • 需要一個容易解釋的基線方法
  • 想快速驗證一個分類思路是否可行

如果資料量巨大、特徵非常多、預測速度要求很高,KNN 可能就不是最合適的選擇,或者需要配合更高效的近鄰搜尋方法。

12. 初學者應該記住什麼

學 KNN 時,不需要一開始就鑽進複雜公式。先記住這幾個直覺就夠了:

  1. KNN 用「鄰居」來判斷新樣本
  2. K 表示看幾個最近鄰居
  3. 分類時靠投票,迴歸時參考鄰居數值
  4. 特徵選擇和資料標準化很重要
  5. K 太小容易受噪聲影響,太大又可能變得遲鈍

KNN 的價值不只是它本身能解決一些問題,更在於它把機器學習裡幾個基礎觀念講得很清楚:資料如何表示、相似度如何衡量、預測如何從已有樣本中產生。

只要理解了「找相似樣本,再根據鄰居做判斷」這件事,就已經抓住了 KNN 的核心。

相關連結

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計