KNN(K-Nearest Neighbor)介紹
Wikipedia上的 KNN詞條 中有一個比較經典的圖如下:
KNN的算法過程是是這樣的:
從上圖中我們可以看到,圖中的數據集是良好的數據,即都打好了label,一類是藍色的正方形,一類是紅色的三角形,那個綠色的圓形是我們待分類的數據。
如果K=3,那么離綠色點最近的有2個紅色三角形和1個藍色的正方形,這3個點投票,於是綠色的這個待分類點屬於紅色的三角形。
如果K=5,那么離綠色點最近的有2個紅色三角形和3個藍色的正方形,這5個點投票,於是綠色的這個待分類點屬於藍色的正方形。
(參考 酷殼的 K Nearest Neighbor 算法 )https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
我們可以看到,KNN本質是基於一種數據統計的方法!其實很多機器學習算法也是基於數據統計的。
KNN是一種memory-based learning,也叫instance-based learning,屬於lazy learning。即它沒有明顯的前期訓練過程,而是程序開始運行時,把數據集加載到內存后,不需要進行訓練,就可以開始分類了。
具體是每次來一個未知的樣本點,就在附近找K個最近的點進行投票。
再舉一個例子,Locally weighted regression (LWR)也是一種 memory-based 方法,如下圖所示的數據集。
用任何一條直線來模擬這個數據集都是不行的,因為這個數據集看起來不像是一條直線。但是每個局部范圍內的數據點,可以認為在一條直線上。每次來了一個位置樣本x,我們在X軸上以該數據樣本為中心,左右各找幾個點,把這幾個樣本點進行線性回歸,算出一條局部的直線,然后把位置樣本x代入這條直線,就算出了對應的y,完成了一次線性回歸。
也就是每次來一個數據點,都要訓練一條局部直線,也即訓練一次,就用一次。
LWR和KNN是不是很像?都是為位置數據量身定制,在局部進行訓練。
K-Means介紹
如圖所示,數據樣本用圓點表示,每個簇的中心點用叉叉表示。(a)剛開始時是原始數據,雜亂無章,沒有label,看起來都一樣,都是綠色的。(b)假設數據集可以分為兩類,令K=2,隨機在坐標上選兩個點,作為兩個類的中心點。(c-f)演示了聚類的兩種迭代。先划分,把每個數據樣本划分到最近的中心點那一簇;划分完后,更新每個簇的中心,即把該簇的所有數據點的坐標加起來去平均值。這樣不斷進行”划分—更新—划分—更新”,直到每個簇的中心不在移動為止。(圖文來自Andrew ng的機器學習公開課)。
推薦關於K-Means的兩篇博文, K-Means 算法 _ 酷殼 , 漫談 Clustering (1)_ k-means pluskid 。
KNN和K-Means的區別
KNN |
K-Means |
1.KNN是分類算法
2.監督學習 3.喂給它的數據集是帶label的數據,已經是完全正確的數據 |
1.K-Means是聚類算法
2.非監督學習 3.喂給它的數據集是無label的數據,是雜亂無章的,經過聚類后才變得有點順序,先無序,后有序 |
沒有明顯的前期訓練過程,屬於memory-based learning | 有明顯的前期訓練過程 |
K的含義:來了一個樣本x,要給它分類,即求出它的y,就從數據集中,在x附近找離它最近的K個數據點,這K個數據點,類別c占的個數最多,就把x的label設為c | K的含義:K是人工固定好的數字,假設數據集合可以分為K個簇,由於是依靠人工定好,需要一點先驗知識 |
相似點:都包含這樣的過程,給定一個點,在數據集中找離它最近的點。即二者都用到了NN(Nears Neighbor)算法,一般用KD樹來實現NN。 |