《算法圖解》之K最近鄰算法

《算法圖解》之K最近鄰算法

前言

橙子還是柚子

請看下邊的水果,是橙子還是柚子呢?我知道,柚子通常比橙子更大、更紅。

《算法圖解》之K最近鄰算法

我的思維過程類似於這樣:我腦子裡有個圖表。

《算法圖解》之K最近鄰算法

一般而言,柚子更大、更紅。這個水果又大又紅,因此很可能是柚子。但下面這樣的水果呢?

《算法圖解》之K最近鄰算法

如果判斷這個水果是橙子還是柚子呢?一種辦法是看它的鄰居。來看看離它最近的三個鄰居。

《算法圖解》之K最近鄰算法

在這三個鄰居中,橙子比柚子多,因此這個水果很可能是橙子。祝賀你,你剛才就是使用K最近鄰(k-nearestneighbours,KNN)算法進行了分類!這個算法非常簡單。

《算法圖解》之K最近鄰算法

KNN算法雖然簡單卻很有用!要對東西進行分類時,可首先嚐試這種算法。下面來看一個更真實的例子。

創建推薦系統

假設你是Netflix,要為用戶創建一個電影推薦系統。從本質上說,這類似於前面的水果問題!

你可以將所有用戶都放入一個圖表中。

《算法圖解》之K最近鄰算法

這些用戶在圖表中的位置取決於其喜好,因此喜好相似的用戶距離較近。假設你要向Priyanka推薦電影,可以找出五位與他最接近的用戶。

《算法圖解》之K最近鄰算法

假設在對電影的喜好方面,Justin、JC、Joey、Lance和Chris都與Priyanka差不多,因此他們喜歡的電影很可能Priyanka也喜歡!

《算法圖解》之K最近鄰算法

有了這樣的圖表以後,創建推薦系統就將易如反掌:只要是Justin喜歡的電影,就將其推薦給Priyanka。

特徵抽取

在前面的水果示例中,你根據個頭和顏色來比較水果,換言之,你比較的特徵是個頭和顏色。現在假設有三個水果,你可抽取它們的特徵。

《算法圖解》之K最近鄰算法

再根據這些特徵繪圖。

《算法圖解》之K最近鄰算法

從上圖可知,水果A和B比較像。下面來度量它們有多像。要計算兩點的距離,可使用畢達哥拉斯公式。

《算法圖解》之K最近鄰算法

例如,A和B的距離如下。

《算法圖解》之K最近鄰算法

A和B的距離為1。你還可計算其他水果之間的距離。

《算法圖解》之K最近鄰算法

這個距離公式印證了你的直覺:A和B很像。

假設你要比較的是Netflix用戶,就需要以某種方式將他們放到圖表中。因此,你需要將每位用戶都轉換為一組座標,就像前面對水果所做的那樣。

《算法圖解》之K最近鄰算法

在能夠將用戶放入圖表後,你就可以計算他們之間的距離了。

下面是一種將用戶轉換為一組數字的方式。用戶註冊時,要求他們指出對各種電影的喜歡程度。這樣,對於每位用戶,都將獲得一組數字!

《算法圖解》之K最近鄰算法

Priyanka和Justin都喜歡愛情片且都討厭恐怖片。Morpheus喜歡動作片,但討厭愛情片(他討厭好好的動作電影毀於浪漫的橋段)。前面判斷水果是橙子還是柚子時,每種水果都用2個數字表示,你還記得嗎?在這裡,每位用戶都用5個數字表示。

《算法圖解》之K最近鄰算法

在數學家看來,這裡計算的是五維(而不是二維)空間中的距離,但計算公式不變。

《算法圖解》之K最近鄰算法

這個公式包含5個而不是2個數字。

這個距離公式很靈活,即便涉及很多個數字,依然可以使用它來計算距離。你可能會問,涉及5個數字時,距離意味著什麼呢?這種距離指出了兩組數字之間的相似程度。

《算法圖解》之K最近鄰算法

這是Priyanka和Justin的距離。

餘弦相似度

前面計算兩位用戶的距離時,使用的都是距離公式。還有更合適的公式嗎?在實際工作中,經常使用餘弦相似度(cosine similarity)。假設有兩位品味類似的用戶,但其中一位打分時更保守。他們都很喜歡Manmohan Desai的電影Amar Akbar Anthony,但Paul給了5星,而Rowan只給4星。如果你使用距離公式,這兩位用戶可能不是鄰居,雖然他們的品味非常接近。餘弦相似度不計算兩個矢量的距離,而比較它們的角度,因此更適合處理前面所說的情況。本書不討論餘弦相似度,但如果你要使用KNN,就一定要研究研究它!


分享到:


相關文章: