K-近鄰算法,又名最近鄰居算法,其英文縮寫是KNN(k-nearest neighbors)。是一種用於分類和迴歸的非參數統計方法。其多是標準數據挖掘算法中最爲直觀的一種。在這篇博客中,主要討論knn用於分類的狀況。html
在分類中,爲了肯定新的個體屬於哪個類,就尋找訓練集,查找與新個體最爲類似的個體,而後根據查找到的大多數個體屬於哪個類別,就將這個個體分類到這個類別中。算法
一下面這張圖爲例子,咱們如何判斷綠色的個體屬於哪個類別?首先咱們尋找與綠色點距離(歐式距離)最近的三個($K = 3$)個體——2個三角形,1個正方形。三角形多於正方形,此時咱們就認爲該個體屬於三角形。svg
近鄰算法幾乎能夠對任何數據集進行分類。原理也很簡單,實現也簡單,可是計算量卻比較大,由於他須要對全部的點計算距離。spa
在上面的舉例中,有兩個關鍵點須要咱們注意:3d
K的取值很簡單理解,由於他決定着咱們須要考慮多少個」鄰居「,而這個就會影響咱們的模型的準確度!rest
那麼距離的計算是什麼呢?在前面的例子中,咱們的距離指的是兩個點連成直線的距離(亦稱歐氏距離),距離越短則表明二者之間越親密,可是歐式距離越短必定就越近嗎?想想重慶的山城。orm
OK,接下來讓咱們來說一講距離度量。htm
距離是數據挖掘的核心概念之一。由於咱們能夠經過距離來判斷一對個體相對另外一對個體是否更加的相近。距離的計算有不少種方式,接下來,將介紹幾種常見的計算方式。blog
歐式距離是咱們接觸過最多的一種度量方式,即真實距離。教程
如下圖爲例,咱們如何計算A,B之間的歐式距離?
emm,這個很簡單,初中的時候就學過了。
$$
d_{AB} = \sqrt{(x_2-x_1)^2+(y_2 - y_1)^2}
$$
上面的公式是二維座標系狀況下的計算的公式,若是是$n$維座標系呢?
$$
d(x,y)=\sqrt{\Sigma_{k=1}^n (A_k-B_k)^2}\
A_k 表明A點在k軸的位置
$$
咱們能夠將歐式距離進行標準化:
$$
d(x,y)=\sqrt{\Sigma_{k=1}^n (\dfrac{A_k-B_k}{s_k})^2}\
A_k 表明A點在k軸的位置
$$
其中,$s_k$爲數據每一維的標準差,之因此這樣作,是由於考慮到了座標軸中維度的不一樣。好比說$x$軸的範圍是0~1,可是$y$軸的範圍是0~100,這樣就會形成$x$,$y$軸的權重不一樣,而是用標準化就能夠解決這個問題。
曼哈頓距離也稱爲街區距離,若是形象的來講,A到B的距離就是A做爲車,A到B須要走多少距離。
以下圖所示,白色的圈圈到黑色的圈圈須要的距離用紅色的線進行表示。
計算距離的公式以下所示。
$$
d(x,y)=\Sigma_{k=1}^n \left|A_k-B_k\right| \
k表明的是k維座標系,A_k 表明A點在k軸的位置
$$
餘弦距離指的是特徵向量之間的夾角的餘弦值,以下圖紅色部分所示:
至於怎麼計算,感受又回到了高中~.~
$$
\because \overrightarrow {a} \cdot \overrightarrow{b} = |a|\times|b|\times cos\theta \
\therefore cos\theta = \frac{\overrightarrow {a} \cdot \overrightarrow{b}}{|a|\times |b|}= \dfrac{\Sigma_{k=1}^n a_k b_k}{\sqrt{\Sigma_{k=1}^n a_k^2} \sqrt{\Sigma_{k=1}^n b_k^2}}
$$
這篇博客主要是講一下近鄰算法以及距離的計算方式。在下一篇博客中,將使用scikit-learn,以KNN爲例進行數據挖掘。
距離的度量暫時先說到這裏,之後會繼續進行添加修正。
建立時間:2020.3.09 version 1.0