KNN算法全稱是:K-NearestNeighbor,中文翻譯就是:K最鄰近。它屬於機器學習中最簡單、最基本的分類和回歸算法。那麼什麼叫K最鄰近呢?說白了就是你有一個需要預測的實例,在訓練集中尋找K個與這個被預測實例最相似的訓練實例,那麼預測實例就與K個訓練實例中出現次數最多的那個元素屬於同一類。
下面通過圖一進行簡單說明:綠色的圓點就是預測實例,藍色和紅色元素就是訓練集中不同的類。
當K = 3時(即圖中黑色實線的圓),紅色三角形出現2次,藍色矩形出現1次,所以綠色圓實例與紅色三角形屬於同一類。
而當K = 5時(即圖中黑色虛線的圓),紅色出現2次,而藍色出現3次,所以綠色實例應該與藍色矩形屬於同一類。
說到這,我們就會拋出下面兩個問題:
因為你要知道每個實例之間的距離,所以實例與實例之間的距離是怎麼計算的?由上面的例子可以知道,當我們選取K不同的時候,相同的實例會有不同的分類結果,所以這個距離K是怎麼選取的?對於問題一,我們有兩種計算距離的方法:歐氏距離(歐幾裡得距離)和曼哈頓距離。相應的公式:
歐氏距離就是我們生活中所說的兩點之間的最短距離,而曼哈頓距離就是兩點之間每個維度的距離之和,我們用一張圖來解釋更明白:
如圖,在二維坐標中,兩個黑點之間綠色的線就是歐氏距離;而紅色、藍色、黃色的折線都是等長的,就是曼哈頓距離。用到多維坐標中也是如此。
而對於問題二就更簡單了,尋找K值的方法叫做交叉驗證法。一般K從3開始,然後取每個K都遍歷訓練集,尋找K為何值時,預測的準確度最高。那麼有人會說,K是不是越小越好?
當然不是,把圖一改造以下,如圖五所示:
現在我們假定綠色和紅色屬於一類,那麼如果當K = 1(綠色圈)或6(黑色虛線圈)時,這個算法會把綠色和藍色歸為一類,而當K = 3時,才是正確的結果。我們把K = 1時選取的那個藍色矩形稱為訓練集中的噪聲,我們應當避免這種幹擾項。而K = 6時,距離較遠的實例也會算進來,幹擾了預測。所以選取適當的K的值是十分必要的。
總結KNN算法:
計算預測實例和訓練集實例的歐式距離或者曼哈頓距離。用交叉驗證法確定K的取值。計算K個最鄰距離中出現次數最多的實例,既是結果。最後,我會寫一篇關於用KNN算法來預測手寫數字的文章,來了解KNN算法的實際用處。
圖一 :https://upload.wikimedia.org/wikipedia/commons/e/e7/KnnClassification.svg
圖二: 百度百科 歐幾裡得距離
圖三:百度百科 曼哈頓距離
圖四https://upload.wikimedia.org/wikipedia/commons/0/08/Manhattan_distance.svg