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

k-近鄰演算法與樸素貝氏

機器學習中最簡單的兩種分類器——一個詢問身邊的鄰居,一個做一點機率運算——以及為何這兩種樸實的方法擊敗花俏模型的頻率,遠比你想像的要高。

兩個幾乎稱不上演算法的演算法

你已經見過會*學習*的模型——線性迴歸擬合一條直線,決策樹生長出分裂,隨機森林在眾多樹之間投票。本指南要介紹的兩種方法幾乎像是在作弊,因為其中一個根本不做真正的訓練,另一個只做一點計數。它們就是k-近鄰樸素貝氏——儘管如此簡單,這兩者在真實系統中至今仍被天天使用。

兩者都屬於監督學習:你給它們帶標籤的樣本——每個樣本是一個帶有已知標籤特徵向量——它們便學會為新點打標籤。它們的特別之處在於*所需的機制極少*。它們非常適合用來建立基線:在任何人推出神經網路之前,你最先嘗試的東西。

k-NN:問問你的鄰居就好

k-近鄰背後的思想你早已在做。要猜一家新餐廳好不好,你會看看自己熟悉的、最相似的幾家餐廳,然後採納多數人的評價。k-NN正是如此:要給一個新點分類,它找出離它最近的*k*個訓練樣本,讓它們投票。想預測一個數值而非類別?那就對鄰居們的取值求平均。這就是整個演算法。

「最近」指的是特徵空間中的距離——通常就是普通的歐氏距離,即把每個特徵當作一根座標軸時,你用尺子量出的直線間隔。*k*的取值是一個你需要調的超參數:*k*小(比如取1)會緊貼資料的每一處起伏,容易把雜訊也學進去而過擬合;*k*大則把一切抹平,卻可能模糊真實的邊界——這正是你早先見過的偏差—方差權衡的清晰寫照。

predict(x, k):
    dists = [ distance(x, xi) for (xi, yi) in training_set ]
    nearest = the k examples with smallest dists
    return majority_vote(label of each in nearest)   # or average, for regression
四行寫完的k-NN。注意這裡沒有訓練迴圈——所有工作都發生在預測時刻。

k-NN悄悄失靈之處

在你信任k-NN之前,有兩個實實在在的弱點值得了解。第一,*尺度很重要*:如果一個特徵以美元(0–100,000)計量,另一個以年(0–80)計量,那麼美元那根軸會主宰距離,而年份特徵則被忽略。務必先做特徵縮放——這不是錦上添花的可選項,它會改變結果。

第二,更微妙的是,k-NN深受維度災難之苦。隨著你增加特徵,空間膨脹得如此之快,以至於*每個*點與其他每個點都變得大致等距——「最近」失去了意義。在成百上千個維度裡,「看看附近有誰」這個令人安心的直覺乾脆失效,這正是k-NN在低維、整潔的問題上大放異彩,卻在影像這類原始高維資料上黯然失色的原因之一。

這些都不會讓k-NN過時——恰恰相反。它的核心技巧(找出相似項,照搬它們的答案)正是現代檢索的運作方式:把事物轉成嵌入向量,再到向量資料庫中搜尋最近鄰。所以你在這裡學到的這個樸素思想,會換一身行頭,放大成今日最龐大系統的核心。

樸素貝氏:靠計數算出一個猜測

樸素貝氏從另一個角度切入:機率。它建立在貝氏定理之上,該定理告訴你如何翻轉一個條件機率。我們想要P(類別 | 特徵)——給定一封郵件所含的詞,它是垃圾郵件的機率。貝氏定理把它改寫成我們*能*從訓練資料中數出來的東西:垃圾郵件中每個詞出現的頻率,以及垃圾郵件整體上有多常見。

難點在於一次性計算整個特徵*組合*的機率——那需要多到不可能的資料量。於是樸素貝氏做出一個大膽而故意錯誤的假設:所有特徵在給定類別的條件下相互獨立。在垃圾郵件的例子裡,它假裝:一旦你已知這封郵件是垃圾郵件,「免費」這個詞就完全不能告訴你「錢」是否也會出現。這讓它可以把每個特徵的機率分別相乘——把一個無望的聯合估計變成寥寥幾個簡單的計數。

「樸素」二字正是演算法在承認這個假設是錯的——真實文本裡的詞顯然是相關的。真正令人驚訝的事實是,這往往*無關緊要*。即便獨立性假設被嚴重違反,得分最高的那個類別也常常仍是正確的,因為這些誤差傾向於抬高分數,卻不會翻轉哪個類別勝出。這正是樸素貝氏至今仍是著名而強勁的文本分類基線的原因。

何時簡單者勝出

人們很容易以為越大的模型總會贏,但沒有免費午餐定理指出:沒有任何單一方法能在所有問題上稱霸。決定勝負的,是一種方法內建的假設——它的歸納偏置——與你資料真實形態之間的契合程度。樸素貝氏假設特徵獨立;k-NN假設鄰近的點共享標籤。當這些假設大致成立時,這些微小的模型就能匹敵甚至擊敗重得多的模型。

簡單方法在具體情形中勝出:當你只有很少的帶標籤資料時(深度網路只會過擬合);當你需要在毫秒內、沒有GPU的情況下給出答案時;當有人必須向監管者或客戶*解釋*這個決定時;或者當你只是需要一個基線來證明更花俏的模型對得起它的成本時。一個樸素貝氏垃圾郵件過濾器,或一個k-NN推薦器,一個下午就能上線,並能在一部手機上執行。

誠實的說法不是「簡單對強大」,而是「契合對不契合」。從可能奏效的最廉價方案開始,妥善地度量它,再讓資料告訴你複雜性是否值得。結果是「不值得」的次數,比新手以為的要多得多——而這份克制本身,正是功力的標誌。