K Nearest Neighbor算法又叫KNN算法,這個算法是機器學習裏面一個比較經典的算法, 整體來講KNN算法是相對比較容易理解的算法。其中的K表示最接近本身的K個數據樣本。KNN算法和K-Means算法不一樣的是,K-Means算法用來聚類,用來判斷哪些東西是一個比較相近的類型,而KNN算法是用來作歸類的,也就是說,有一個樣本空間裏的樣本分紅很幾個類型,而後,給定一個待分類的數據,經過計算接近本身最近的K個樣原本判斷這個待分類數據屬於哪一個分類。你能夠簡單的理解爲由那離本身最近的K個點來投票決定待分類數據歸爲哪一類。html
Wikipedia上的KNN詞條中有一個比較經典的圖以下:面試
從上圖中咱們能夠看到,圖中的有兩個類型的樣本數據,一類是藍色的正方形,另外一類是紅色的三角形。而那個綠色的圓形是咱們待分類的數據。算法
咱們能夠看到,機器學習的本質——是基於一種數據統計的方法!那麼,這個算法有什麼用呢?咱們來看幾個示例。shell
假設咱們須要判斷毛巾的品質好壞,毛巾的品質好壞能夠抽像出兩個向量,一個是「酸腐蝕的時間」,一個是「能承受的壓強」。若是咱們的樣本空間以下:(所謂樣本空間,又叫Training Data,也就是用於機器學習的數據)數據結構
向量X1機器學習 耐酸時間(秒)學習 |
向量X2測試 圧強(公斤/平方米)spa |
品質Yrest |
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」,一種二叉樹。你能夠看看相關的算法。
(全文完)