1. 程式人生 > >grokking algorithms K-nearest neighbors第十章 K-鄰近演算法 中文翻譯

grokking algorithms K-nearest neighbors第十章 K-鄰近演算法 中文翻譯

說明:《grokking algorithms》演算法講解的非常深入淺出,用好多幅圖以及日常常用的例子講演算法講解的非常好,若是英文還可以的話,建議看英文原版,非常喜歡作者的寫作風格,將複雜的演算法用簡單的方式描述出來,真的好厲害!!

第十章. K-鄰近演算法

················································································ ···············································

在本章中:
你會學到怎麼利用鄰近演算法來構建一個分類系統
學習到特質提取
學到迴歸,預測數值,預測明日股市或者電影票房
學習K-鄰近演算法的適用場景和不適用場景
···································································································································

區分桔子和葡萄柚

比如這個水果,這是桔子還是葡萄柚?我們知道,葡萄柚更大更紅。
這裡寫圖片描述

圖10-1
我的思路大概是這樣的:在我的頭腦中有一張圖。
這裡寫圖片描述

圖10-2
通常來說,更大更紅的水果是葡萄柚。這個水果很大而且很紅,所以極有可能是葡萄柚。但是若是一個水果既不算大也不算小,即非很紅也非不紅呢?
這裡寫圖片描述
圖10-3

你可以區分出它是什麼水果嗎?有一種方法是看它的鄰居,看離它最近的3個鄰居是什麼水果。
這裡寫圖片描述
圖10-4

若多數鄰居是桔子,那麼它極有可能是桔子。恭喜你,你剛才利用的就是K-鄰近演算法,這個演算法非常簡單。
這裡寫圖片描述
圖10-5
1.你需要區分一種新的水果
2.檢視離它最近的鄰居是什麼水果
3.大多數鄰居是桔子,那麼它極有可能是桔子。

KNN(鄰近)演算法簡單但是非常有效,你若是需要區分什麼,可以先試試KNN演算法,讓我們來看個現實的例子。

建一個評價推薦系統

假設你是Netflix的員工,你需要為你的使用者做一個評價系統,在一定程度上,它和葡萄柚問題非常像。
你可以給使用者畫像
這裡寫圖片描述
圖10-6
對使用者根據相似度畫點。若是使用者的口味很接近,那麼代表它們的點也是很接近的。假設你要為Priyanka推薦電影,你可以找離她最近的五個使用者。
這裡寫圖片描述
圖10-7

Justin、JC、Lance和Chris看電影的口味很相似,因此他們喜歡的電影,Priyanka多半也喜歡。
當你有一幅圖時,你建立一個推薦系統就會很簡單,如果Justin喜歡一部電影,就可以將這部電影推薦給Priyanka。
這裡寫圖片描述


圖10-8
但是還有一個問題沒有考慮,這張圖是根據使用者的相似度來畫的,你怎樣來標示使用者的相似度呢?

特徵提取

在葡萄柚這個例子中,你比較的是它們有多大和它們有多紅,那麼你其實比較的是大小和顏色,現在,假設你有3種水果,你怎麼提取它們的特徵呢?
這裡寫圖片描述
圖10-9
你可以用圖中的點來標示它們。
這裡寫圖片描述
圖10-10
從圖中可以直觀的看出,A和B相似。我們可以計算它們的相似程度及計算它們兩點間的距離。可以利用平方根公式。
這裡寫圖片描述
圖10-11
例如,這是A點和B點的距離。
這裡寫圖片描述
圖10-12
A和B間的距離為1,可以計算A、C和BC間的相互距離。
這裡寫圖片描述
圖10-13
距離計算論證了我們看到的:水果A和水果B相似。
假設你在比較Netflix網站的使用者,你需要為他們畫像,你需要將他們標示成一系列的座標,像對水果做的那樣。
這裡寫圖片描述
圖10-14
當你可以用圖示示使用者時,你就可以計算他們的距離了,怎樣將使用者描述成數字集合呢?當用戶註冊Netflix賬號時,他們會為一類電影打分(根據他們的喜愛程度),對於每一個使用者,你現在有了他們的評價資料。
這裡寫圖片描述
圖10-15
Priyanka和Justin喜歡愛情片,討厭恐怖片,Morpheus喜歡動作片,討厭愛情片(他因為一部影片中有浪漫情節而討厭這部電影),還記得怎麼區分葡萄柚和桔子的嗎?我們用了2個數字來區分,現在,一個使用者用5個數字組成的集合來區分。
這裡寫圖片描述
圖10-16
數學家可能會說,現在不是二維空間計算距離了,我們要在五維空間計算距離,不過公式是一樣的。只是將2個數字的集合換成了5個數字的集合。
這裡寫圖片描述
圖10-17
這個距離是靈活的,你可以有數百萬個數字組成的集合,但是依然可以用這個距離公式來求解距離,你可能會好奇:“當計算5個數字時,距離是什麼意思呢?”,這裡的距離告訴我們這些數的相似程度。
這裡寫圖片描述
圖10-18
這是Priyanka和Justin的相似程度。Priyanka和Justin的相似程度很高。Priyanka和Morpheus相似嗎?讓我們來計算一下
你算對了嗎?Priyanka和Morpheus的相似程度為24.距離告訴我們Priyanka和Justin的口味比Morpheus和Justin的口味更相似。
太棒了,現在向Priyanka推薦電影變得容易了。若是Justin喜歡某部電影,那麼推薦給Priyanka,反之亦然。你現在做了一個電影推薦系統。
若你是Netflix的使用者,它會一直告訴你“要評價更多的電影,你評價的越多,那麼你獲得的推薦越準確”。現在,你知道原因了,越多的電影評分,那麼Netflix計算你和其他使用者的相似度就會越準確。

練習
重點內容
10.1 在Netflix例子中,我們用距離公式計算了兩個使用者的不同,但是並不是所有的使用者評分標準都是一樣的。比如有兩個使用者,Yogi和Pinky,他們喜歡的電影型別是一樣的,但是Yoyi對喜歡的電影打5分,但是Pinky只對非常非常喜歡的電影打5粉。他們實際上喜歡的電影是一樣的,但是根據距離公式的計算結果,他們只是相近。你在做推薦時怎麼處理這種不同標準的打分方式?

10.2 假設Netflix有一個“相互影響者組”,例如Quentin和Tarantino是相互影響的人。所以他們的評價計數比一般的使用者高,你怎麼調整推薦系統讓它更偏向於這類“相互影響者”的組?

迴歸

假設你不止要評價一部影片。你需要猜測Priyanka是否喜歡某部電影,找出離她最近的5個人。
順便說一句,我們選擇離她最近的5個人,數字5沒有什麼特殊的,你可以選擇數字2,10或者10000.這也是為什麼演算法叫K-鄰近演算法而不是叫5-鄰近演算法的原因。
這裡寫圖片描述
圖10-19
假設你需要對電影《Pitch Perfect》的評分做猜測,Justin、JC、Joey、Lance和Chris會對它打幾分呢?
這裡寫圖片描述
圖10-20
你可以求出他們給的資料的平均分,即4.2星,這就叫做迴歸。這是K-鄰近演算法的非常基礎的2個事情—-分類和迴歸。
分類=歸為一組
迴歸=預測反應(比如數值)

迴歸非常有用,假設你在伯克利經營一家蛋糕房。你每天做新鮮的麵包,你每天需要預測做多少個麵包,你有以下特徵項集合
天氣好壞(1=是, 0=否)
週末或假日?(1=週末或假日,0是其他)
有比賽嗎?(1=是,0=否)
你知道過去的日子裡每天出售了多少麵包以及上面的各項資料。
這裡寫圖片描述
這裡寫圖片描述
圖10-21

今天是週末而且天氣不錯,根據以前的資料,我們要做多少個麵包呢?我們利用K-鄰近演算法。K=4
第一,找出離這個點最近的4個點
(4, 1,0)=?
這裡寫圖片描述
圖10-22
A、B、D和E離(4, 1, 0)點更近。
對這四個點賣出的麵包求平均值,得到了218.75,我們得到了今天要做的麵包數目。

餘弦相似度

至今為止,我們利用距離公式計算兩個使用者的口味偏差,這是最適合的嗎?在現實中經常使用的是餘弦相似度。假設兩個使用者很相似,但其中一個打分很保守,他們都很喜歡Manmoham Desai的《Amar Akbar Anthony》這首歌,但Rowan只給了4個星,Paul給了5個星。若是利用距離公式,他們的喜好(口味)不相似。儘管他們是喜好相似的使用者。
餘弦相似度不是通過距離來計算,它比較兩項的角度。處理這類問題,餘弦相似度更適合。本書中不講述餘弦相似度,但若是你使用K-鄰近演算法,可以試著學習並使用它。

選好特徵項
這裡寫圖片描述
圖10-23
為了獲得推薦,你要求使用者對不同的電影打分。若是你要求他們對小貓的照片打分呢?你會看到所有的使用者都是相似的,那麼這是一個差的推薦系統,因為這與電影的喜好(口味)沒有半毛錢的關係。
或者你要求使用者評價電影,這樣你可以給他們做推薦,但你只要去他們對《託尼故事》、《託尼故事2》和《託尼故事3》打分,這些也不會告訴你使用者的喜好的。
當你使用K-鄰近演算法時,選擇好的特徵項是非常重要的。好的特徵項意味著:
與你要評價的電影直接相關的項
沒有傾向的特徵(比如,你若是隻要求使用者對喜劇打分,則他們無法告訴你他們是否喜歡動作片)

你認為對電影打分是好的評價方式嗎?可能我對《The wire》的打分高於《House Hunters》,但是我卻花更多的時間來觀看《House Hunters》,你怎樣來升級你的推薦系統呢?

回到麵包店:你能想出2種提升或降低麵包銷量的特徵嗎?比如你在報紙上做廣告會增加銷量,或者你需要在週一多做麵包。

練習
重點內容
10.3 Netflix有數百萬個使用者,我們利用離使用者最近的5個使用者來構建評價推薦系統,這個是不是很low?或者很High?

機器學習簡介

K-鄰近演算法是非常有用的演算法,而且為你打開了機器學習的大門,你已經看到了機器學習的一個例子:建立推薦系統,讓我們來看其他例子。
這裡寫圖片描述
圖10-24

OCR
OCR是光學字元識別的簡稱。也就是說,你對一個頁面拍一張照片,計算機會自動把它轉變成文字。Google利用OCR來識別圖書:OCR是怎麼工作的,例如,識別數字7
這裡寫圖片描述
圖10-25
它是怎麼自動識別出的呢?你可以利用K-鄰近演算法
1.瀏覽多個數字的圖片,將能區分數字的特徵點找出來。
2.當你獲得一個新圖片時,提取這個圖片的特徵,然後找離這個圖片最近的鄰居們。

這個問題和區分桔子 VS 葡萄柚的例子很像。一般來說,OCR演算法利用點、直線和曲線作為特徵項。
這裡寫圖片描述
圖10-26
這樣,當你拿到一個新的字元時,你就可以從中找到這些特徵量了。

在光學識別(OCR)中,特徵提取比水果的例子難多了,但是複雜的技術是以簡單想法為基礎的。比如K-鄰近演算法,你可以利用同樣的想法來做語音識別或人臉識別,當你向facebook上傳一張圖片時,自動為這些照片打標籤就是機器學習的一種實際應用。

光學字元識別(OCR)的第一步,當你瀏覽多個數字的照片並提取特徵時,叫做訓練。大多數的機器學習演算法都有訓練的環節:在你的電腦開始工作前,你需要先訓練它,下一個例子包含垃圾郵件過濾,依然包含訓練環節。

建立垃圾郵件過濾系統
垃圾郵件過濾使用了另一個簡單的演算法叫做樸素貝葉斯分類器。首先,你利用樸素的貝葉斯分類器訓練一些資料。
這裡寫圖片描述
圖10-27

假設你收到一封郵件,標題為“現在給我1000,000美元”,你可以把它按詞斷句。這樣,對於每個單詞,判斷它出現在垃圾郵件中的可能性。比如,在這個簡單的模型中,百萬出現在了垃圾郵件中。樸素貝葉斯分類器將可能的垃圾郵件找出來。這個和K-鄰近演算法很像。

例如,你利用樸素貝葉斯分類器來區分水果。你又一種水果既大且紅,那麼它很有可能是葡萄柚?這裡有一個非常有效且簡單的演算法。我們喜歡這些演算法。
這裡寫圖片描述
圖10-28

預測股市

這裡有個對機器學習來說很難的事情:預測股市上漲或下跌。你怎麼在股票市場找到好的特徵點?假設你說股價昨天下跌了,今天要上漲,這是一個好的特徵項嗎?或者你說五月份股價會一直跌,這些會有效嗎?沒有一條絕對正確的方式可以用過去的資料來預測未來的走向。預測未來很難,尤其是當有很多變數存在時,預測未來幾乎是不可能的。

回顧

我希望學完本章後,你有個印象,利用K-鄰近演算法可以處理很多不同的事情。機器學習是非常有趣的一個領域。你可以深挖,若是你喜歡的話。
K-鄰近演算法需要歸類和迴歸,需要尋找K個最鄰近的點;
分類=將不同型別分組
迴歸-預測反應(比如數字)
特徵提取的意思是將事物(如水果或使用者)抽象成數字標示的集合
在K-鄰近演算法中,選擇好的特徵項是非常重要的。