KNN 算法的全稱是K-Nearest Neighbor,中文為K 近鄰算法棺牧,它是基于距離的一種算法巫糙,簡單有效。
KNN 算法即可用于分類問題颊乘,也可用于回歸問題参淹。
1,準備電影數據
假如我們統(tǒng)計了一些電影數據乏悄,包括電影名稱浙值,打斗次數,接吻次數檩小,電影類型开呐,如下:
電影名稱 | 打斗次數 | 接吻次數 | 電影類型 |
---|---|---|---|
黑客帝國 | 115 | 6 | 動作片 |
功夫 | 109 | 8 | 動作片 |
戰(zhàn)狼 | 120 | 9 | 動作片 |
戀戀筆記本 | 5 | 78 | 愛情片 |
泰坦尼克號 | 6 | 60 | 愛情片 |
花樣年華 | 8 | 69 | 愛情片 |
可以看到,電影分成了兩類规求,分別是動作片和愛情片筐付。
2,用KNN 算法處理分類問題
如果現在有一部新的電影A阻肿,它的打斗和接吻次數分別是80 和7瓦戚,那如何用KNN 算法對齊進行分類呢?
我們可以將打斗次數作為X 軸丛塌,接吻次數作為Y 軸较解,將上述電影數據畫在一個坐標系中,如下:
關于如何用Python 畫圖赴邻,可以參考文章《如何使用Python 進行數據可視化》
通過上圖可以直觀的看出印衔,動作電影與愛情電影的分布范圍是不同的。
KNN 算法基于距離乍楚,它的原理是:選擇與待分類數據最近的K 個點当编,這K 個點屬于哪個分類最多,那么待分類數據就屬于哪個分類徒溪。
所以忿偷,要判斷電影A 屬于哪一類電影,就要從已知的電影樣本中臊泌,選出距離電影A 最近的K 個點:
- 如果這K 個點中鲤桥,屬于動作電影較多,那么電影A 就屬于動作電影渠概。
- 如果這K 個點中茶凳,屬于愛情電影較多嫂拴,那么電影A 就屬于愛情電影。
比如贮喧,我們從樣本中選出三個點(即 K 為 3)筒狠,那么距離電影A 最近的三個點是《功夫》,《黑客帝國》和《戰(zhàn)狼》箱沦,而這三部電影都是動作電影辩恼。因此,可以判斷電影A 也是動作電影谓形。
另外灶伊,我們還要處理兩個問題:
- 如何判斷點之間的距離。
- 如何確定K 的值寒跳。
關于點之間的距離判斷聘萨,可以參考文章《計算機如何理解事物的相關性》。
至于K 值的選擇童太,K 值較大或者較小都會對模型的訓練造成負面影響米辐,K 值較小會造成過擬合,K 值較大欠擬合康愤。
因此儡循,K 值的選擇,一般采用交叉驗證的方式征冷。
交叉驗證的思路是,把樣本集中的大部分樣本作為訓練集誓琼,剩余部分用于預測检激,來驗證分類模型的準確度。一般會把 K 值選取在較小范圍內腹侣,逐一嘗試K 的值叔收,當模型準確度最高時,就是最合適的K 值傲隶。
可以總結出饺律,KNN 算法用于分類問題時畏浆,一般的步驟是:
- 計算待分類物體與其他物體之間的距離眉撵;
- 按照距離進行排序,統(tǒng)計出距離最近的 K 個鄰居蒲肋;
- K 個最近的鄰居乒省,屬于哪個分類最多巧颈,待分類物體就屬于哪一類。
3袖扛,用KNN 算法處理回歸問題
如果砸泛,我們現在有一部電影B十籍,知道該電影屬于動作電影,并且知道該電影的接吻次數是7唇礁,現在想預測該電影的打斗次數是多少勾栗?
這個問題就屬于回歸問題。
分類問題的預測結果是離散值盏筐,
回歸問題的預測結果是連續(xù)值械姻。
首先看下,根據已知數據机断,如何判斷出距離電影B 最近的K 個點楷拳。
我們依然設置K 為3,已知數據為:
- 電影B 屬于動作電影吏奸。
- 電影B 的接吻次數是 7欢揖。
根據已知數據可以畫出下圖:
圖中我畫出了一條水平線,這條線代表所有接吻次數是7 的電影奋蔚,接下來就是要找到距離這條線最近的三部(K 為 3)動作電影她混。
可以看到,距離這條水平線最近的三部動作電影是《功夫》泊碑,《黑客帝國》和《戰(zhàn)狼》坤按,那么這三部電影的打斗次數的平均值,就是我們預測的電影B 的打斗次數馒过。
所以臭脓,電影B 的打斗次數是:
(115 + 109 +120) / 3 ≈ 115
4,總結
本篇文章主要介紹了KNN 算法的基本原理腹忽,它簡單易懂来累,即可處理分類問題,又可處理回歸問題窘奏。
KNN 算法是基于距離的一種機器學習算法嘹锁,需要計算測試點與樣本點之間的距離。因此着裹,當數據量大的時候领猾,計算量就會非常龐大,需要大量的存儲空間和計算時間骇扇。
另外摔竿,如果樣本數據分類不均衡,比如有些分類的樣本非常少匠题,那么該類別的分類準確率就會很低拯坟。因此,在實際應用中韭山,要特別注意這一點郁季。
(本節(jié)完冷溃。)
推薦閱讀: