K Nearest Neighbor 算法

本文原創作者陳皓(@左耳朵耗子),文章來源酷殼(www.coolshell.cn),原文鏈接:http://coolshell.cn/articles/7779.html 

本文版權歸作者所有。

K Nearest Neighbor算法又叫KNN算法,這個算法是機器學習裏面一個比較經典的算法, 總體來說KNN算法是相對比較容易理解的算法。其中的K表示最接近自己的K個數據樣本。KNN算法和K-Means算法不同的是,K-Means算法用來聚類,用來判斷哪些東西是一個比較相近的類型,而KNN算法是用來做歸類的,也就是說,有一個樣本空間裏的樣本分成很幾個類型,然後,給定一個待分類的數據,通過計算接近自己最近的K個樣本來判斷這個待分類數據屬於哪個分類。你可以簡單的理解爲由那離自己最近的K個點來投票決定待分類數據歸爲哪一類

Wikipedia上的KNN詞條中有一個比較經典的圖如下:

從上圖中我們可以看到,圖中的有兩個類型的樣本數據,一類是藍色的正方形,另一類是紅色的三角形。而那個綠色的圓形是我們待分類的數據。

  • 如果K=3,那麼離綠色點最近的有2個紅色三角形和1個藍色的正方形,這3個點投票,於是綠色的這個待分類點屬於紅色的三角形。
  • 如果K=5,那麼離綠色點最近的有2個紅色三角形和3個藍色的正方形,這5個點投票,於是綠色的這個待分類點屬於藍色的正方形。

我們可以看到,機器學習的本質——是基於一種數據統計的方法!那麼,這個算法有什麼用呢?我們來看幾個示例。

產品質量判斷

假設我們需要判斷毛巾的品質好壞,毛巾的品質好壞可以抽像出兩個向量,一個是“酸腐蝕的時間”,一個是“能承受的壓強”。如果我們的樣本空間如下:(所謂樣本空間,又叫Training Data,也就是用於機器學習的數據)

向量X1

耐酸時間(秒)

向量X2

圧強(公斤/平方米)

品質Y

7

7

7

4

3

4

1

4

那麼,如果 X1 = 3 和 X2 = 7, 這個毛巾的品質是什麼呢?這裏就可以用到KNN算法來判斷了。

假設K=3,K應該是一個奇數,這樣可以保證不會有平票,下面是我們計算(3,7)到所有點的距離。(關於那些距離公式,可以參看K-Means算法中的距離公式

向量X1

耐酸時間(秒)

向量X2

圧強(公斤/平方米)

計算到 (3, 7)的距離

向量Y

7

7

 壞

7

4

 N/A

3

4

 好

1

4

 好

所以,最後的投票,好的有2票,壞的有1票,最終需要測試的(3,7)是合格品。(當然,你還可以使用權重——可以把距離值做爲權重,越近的權重越大,這樣可能會更準確一些)

注:示例來自這裏K-NearestNeighbors Excel表格下載

預測

假設我們有下面一組數據,假設X是流逝的秒數,Y值是隨時間變換的一個數值(你可以想像是股票值)

那麼,當時間是6.5秒的時候,Y值會是多少呢?我們可以用KNN算法來預測之。

這裏,讓我們假設K=2,於是我們可以計算所有X點到6.5的距離,如:X=5.1,距離是 | 6.5 – 5.1 | = 1.4, X = 1.2 那麼距離是 | 6.5 – 1.2 | = 5.3 。於是我們得到下面的表:

注意,上圖中因爲K=2,所以得到X=4 和 X =5.1的點最近,得到的Y的值分別爲27和8,在這種情況下,我們可以簡單的使用平均值來計算:

於是,最終預測的數值爲:17.5

注:示例來自這裏KNN_TimeSeries Excel表格下載

插值,平滑曲線

KNN算法還可以用來做平滑曲線用,這個用法比較另類。假如我們的樣本數據如下(和上面的一樣):

要平滑這些點,我們需要在其中插入一些值,比如我們用步長爲0.1開始插值,從0到6開始,計算到所有X點的距離(絕對值),下圖給出了從0到0.5 的數據:

下圖給出了從2.5到3.5插入的11個值,然後計算他們到各個X的距離,假值K=4,那麼我們就用最近4個X的Y值,然後求平均值,得到下面的表:

於是可以從0.0, 0.1, 0.2, 0.3 …. 1.1, 1.2, 1.3…..3.1, 3.2…..5.8, 5.9, 6.0 一個大表,跟據K的取值不同,得到下面的圖:

注:示例來自這裏KNN_Smoothing Excel表格下載

後記

最後,我想再多說兩個事,

1) 一個是機器學習,算法基本上都比較簡單,最難的是數學建模,把那些業務中的特性抽象成向量的過程,另一個是選取適合模型的數據樣本。這兩個事都不是簡單的事。算法反而是比較簡單的事。

2)對於KNN算法中找到離自己最近的K個點,是一個很經典的算法面試題,需要使用到的數據結構是“最大堆——Max Heap”,一種二叉樹。你可以看看相關的算法。

(本文完)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------華麗的分割線-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以下爲本人原創:

       耗哥目前爲止出了兩篇數據挖掘相關文章,都是有關聚類。讀了很多學院派的論文,能夠明顯感覺出二者的不同。耗哥的兩篇的文章雖然對於熟悉數據挖掘技術的開發人員來說難度不大(這兩篇文章是我讀的最輕鬆的兩篇),但是明顯更易於理解,保證即使沒有任何數據挖掘基礎的程序員看起來也能輕易入門。

       數據挖掘目前是大熱門,很多研究方向的基礎都是數據挖掘,最近也深感基礎的重要性,於是開始重新惡補相關知識,之前一些相關的沒有寫完的博客也會陸續補上。此外,耗哥最後提到了數學建模,這也確實是一個很重要的問題,尤其對於這兩年要寫論文,建立數學模型是必備的技能,而概率與統計、線性代數更是基礎中的基礎,最近也在惡補中。塌下心來,希望能打下紮實的基礎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章