K-近鄰演算法,也常寫作 KNN 或 k-NN,是機器學習裡非常適合入門的一類演算法。它的想法很樸素:要判斷一個新樣本屬於哪一類,就看看它周圍最像它的幾個樣本大多屬於哪一類。
如果一句話解釋 KNN,可以這樣說:
近朱者赤,近墨者黑。
比如你剛搬到一個社區,不知道附近哪家早餐店更適合學生。你問了離你最近的 5 個鄰居,裡面 4 個人都推薦同一家店,那你大概率也會先相信這家店。KNN 做分類時,也是在做類似的事情:找鄰居,看多數。
1. 先從一個小例子理解
假設我們要判斷一個水果是蘋果還是橘子。已知一些水果的特徵,比如:
- 重量
- 顏色
- 甜度
- 表皮是否粗糙
現在來了一個新水果,我們還不知道它是什麼。KNN 不會先總結一套複雜規則,而是直接去已知水果裡找「最像它」的幾個。
如果最像它的 5 個水果中,有 4 個是蘋果,1 個是橘子,那麼 KNN 就會判斷:這個新水果更可能是蘋果。
這裡的 K,就是「要看幾個鄰居」。如果 K=5,就是看最近的 5 個樣本。
2. 一個簡單示意圖
下面用一個二維小圖來直觀理解。假設 A 表示蘋果,O 表示橘子,? 是我們想判斷的新水果。
|
|
如果我們設 K=3,就看離 ? 最近的 3 個點。假設最近的 3 個鄰居裡有 2 個 A、1 個 O,那 KNN 就會把 ? 判斷為 A,也就是蘋果。
這就是 KNN 最核心的過程:找最近的 K 個鄰居,然後投票。
3. KNN 的基本步驟
用不帶公式的方式看,KNN 的分類流程大概是這樣:
- 準備一批已經標好類別的資料
- 新來一個未知類別的樣本
- 計算它和所有已知樣本的相似程度
- 找出最相似的 K 個樣本
- 看這 K 個樣本裡哪個類別最多
- 把新樣本歸到這個類別
這也是為什麼 KNN 很容易理解。它不像一些模型那樣需要先訓練出一堆參數,KNN 更像是把訓練資料先存起來,真正需要判斷時再去查鄰居。
這種特點也讓 KNN 常被稱為一種「惰性學習」方法。這裡的「惰性」不是貶義,而是說它不會在訓練階段做太多計算,主要工作被推遲到了預測階段。
4. 什麼叫「最近」
KNN 裡的「最近」,不一定只是地圖上的距離。它通常表示「特徵上更相似」。
比如判斷水果時,兩個水果如果重量接近、顏色接近、甜度接近,就可以認為距離更近。判斷使用者興趣時,如果兩個人看過的內容、點擊習慣、購買記錄很像,也可以認為他們更接近。
所以 KNN 的關鍵不是「空間位置」,而是你怎麼描述一個樣本。
常見特徵可以是:
- 商品價格、重量、銷量
- 使用者年齡、瀏覽次數、購買頻率
- 圖片的顏色、紋理、形狀
- 文字中某些詞出現的情況
特徵選得好不好,會直接影響 KNN 的效果。
5. K 值怎麼選
K 不是固定答案,而是需要根據資料來選。
如果 K 太小,比如 K=1,模型會非常相信最近的那個樣本。這有時很敏感:如果最近的樣本剛好是噪聲資料,判斷就容易錯。
如果 K 太大,模型又會看太多鄰居,結果可能被遠處不太相關的樣本影響,分類邊界會變得模糊。
可以把它理解成問人意見:
- 只問 1 個人:容易被個別意見帶偏
- 問太多人:可能把不熟悉情況的人也算進來了
- 問附近幾位最相關的人:通常更穩
在二分類問題裡,很多時候會選奇數 K,比如 3、5、7,這樣可以減少投票平局的情況。
6. KNN 不只可以做分類
KNN 最常見的用途是分類,比如判斷:
- 郵件是不是垃圾郵件
- 圖片裡是貓還是狗
- 使用者是否可能流失
- 一條評論是正面還是負面
但它也可以做迴歸。迴歸可以理解為預測一個數值。
比如我們想估計一套房子的價格,可以找出和它最相似的幾套房子,然後參考這些房子的價格。不是投票選類別,而是把鄰居的數值做一個綜合估計。
簡單說:
- 分類:鄰居投票,選類別
- 迴歸:參考鄰居數值,估結果
7. 加權 KNN:近一點的鄰居更重要
普通 KNN 會讓每個鄰居的投票權差不多。但現實中,離得更近的鄰居通常更可信。
比如有 5 個鄰居,其中 1 個和新樣本幾乎一模一樣,另外 4 個只是稍微有點像。完全平均投票可能不太合理。
所以有一種改進思路叫「加權 KNN」:越近的鄰居,影響越大;越遠的鄰居,影響越小。
這很好理解。你買手機時,和你預算、用途、品牌偏好都很接近的人,他的建議往往比泛泛而談的建議更有參考價值。
8. KNN 的優點
KNN 的優點非常適合初學者理解:
- 思路直觀,容易解釋
- 不需要複雜訓練過程
- 可以用於分類,也可以用於迴歸
- 對一些邊界不規則的問題比較靈活
- 新增資料時通常比較方便
如果你剛開始學機器學習,KNN 是一個很好的起點。它能幫助你理解「樣本」「特徵」「距離」「分類」「訓練資料」這些基本概念。
9. KNN 的限制
KNN 也有明顯短板。
第一,預測時可能比較慢。因為每來一個新樣本,都要和很多已有樣本比較。如果資料量很大,計算成本會升高。
第二,它很依賴特徵尺度。比如一個特徵是「收入」,動不動幾千幾萬;另一個特徵是「年齡」,通常幾十。如果不做處理,收入這個特徵可能會過度影響距離判斷。
所以在使用 KNN 前,經常需要做資料標準化,讓不同特徵在比較時更公平。
第三,它容易受無關特徵影響。如果你判斷水果類別,卻把「購買日期」這種無關資訊也放進去,模型可能會被干擾。
第四,它對局部資料分布敏感。如果某一類樣本特別多,投票時可能更容易壓過其他類別。
10. 容易和 K-平均演算法混淆
KNN 和 K-平均演算法 名字裡都有 K,但它們不是一回事。
KNN 是監督學習,通常使用已經標好類別的資料來判斷新樣本。
K-平均演算法更常用於聚類,也就是在沒有明確標籤時,把資料自動分成幾組。
可以簡單記:
- KNN:看鄰居,做分類或迴歸
- K-平均:找中心,把資料分組
11. 什麼時候適合用 KNN
KNN 適合這些場景:
- 資料量不太大
- 特徵比較容易表示成數值
- 樣本之間的「相似程度」比較有意義
- 需要一個容易解釋的基線方法
- 想快速驗證一個分類思路是否可行
如果資料量巨大、特徵非常多、預測速度要求很高,KNN 可能就不是最合適的選擇,或者需要配合更高效的近鄰搜尋方法。
12. 初學者應該記住什麼
學 KNN 時,不需要一開始就鑽進複雜公式。先記住這幾個直覺就夠了:
- KNN 用「鄰居」來判斷新樣本
K表示看幾個最近鄰居- 分類時靠投票,迴歸時參考鄰居數值
- 特徵選擇和資料標準化很重要
K太小容易受噪聲影響,太大又可能變得遲鈍
KNN 的價值不只是它本身能解決一些問題,更在於它把機器學習裡幾個基礎觀念講得很清楚:資料如何表示、相似度如何衡量、預測如何從已有樣本中產生。
只要理解了「找相似樣本,再根據鄰居做判斷」這件事,就已經抓住了 KNN 的核心。