數據挖掘算法05 - KNN

KNN

KNN 的英文叫 K-Nearest Neighbor,應該算是數據挖掘算法中最簡單的一種。

KNN 的工作原理

近朱者赤,近墨者黑可以說是 KNN 的工作原理。整個計算過程分爲三步:

  • 計算待分類物體與其他物體之間的距離;
  • 統計距離最近的 K 個鄰居;
  • 對於 K 個最近的鄰居,它們屬於哪個分類最多,待分類物體就屬於哪一類。

K 值如何選擇

如果 K 值比較小,就相當於未分類物體與它的鄰居非常接近纔行。這樣產生的一個問題就是,如果鄰居點是個噪聲點,那麼未分類物體的分類也會產生誤差,這樣 KNN 分類就會產生過擬合。

如果 K 值比較大,相當於距離過遠的點也會對未知物體的分類產生影響,雖然這種情況的好處是魯棒性強,但是不足也很明顯,會產生欠擬合情況,也就是沒有把未分類物體真正分類出來。

所以 K 值應該是個實踐出來的結果,並不是我們事先而定的。在工程上,我們一般採用交叉驗證的方式選取 K 值。

交叉驗證的思路就是,把樣本集中的大部分樣本作爲訓練集,剩餘的小部分樣本用於預測,來驗證分類模型的準確性。所以在 KNN 算法中,我們一般會把 K 值選取在較小的範圍內,同時在驗證集上準確率最高的那一個最終確定作爲 K 值。

距離如何計算

在 KNN 算法中,還有一個重要的計算就是關於距離的度量。兩個樣本點之間的距離代表了這兩個樣本之間的相似度。距離越大,差異性越大;距離越小,相似度越大。

關於距離的計算方式有下面五種方式:

  • 歐氏距離;
  • 曼哈頓距離;
  • 閔可夫斯基距離;
  • 切比雪夫距離;
  • 餘弦距離。

歐氏距離是我們最常用的距離公式,也叫做歐幾里得距離。在二維空間中,兩點的歐式距離就是:

同理,我們也可以求得兩點在 n 維空間中的距離:

曼哈頓距離等於兩個點在座標系上絕對軸距總和。用公式表示就是:

閔可夫斯基距離不是一個距離,而是一組距離的定義。對於 n 維空間中的兩個點 x(x1,x2,…,xn) 和 y(y1,y2,…,yn) , x 和 y 兩點之間的閔可夫斯基距離爲:

其中 p 代表空間的維數,當 p=1 時,就是曼哈頓距離;當 p=2 時,就是歐氏距離;當 p→∞時,就是切比雪夫距離。

二個點之間的切比雪夫距離就是這兩個點座標數值差的絕對值的最大值,用數學表示就是:max(|x1-y1|,|x2-y2|)。

餘弦距離實際上計算的是兩個向量的夾角,是在方向上計算兩者之間的差異,對絕對數值不敏感。在興趣相關性比較上,角度關係比距離的絕對值更重要,因此餘弦距離可以用於衡量用戶對內容興趣的區分度。比如我們用搜索引擎搜索某個關鍵詞,它還會給你推薦其他的相關搜索,這些推薦的關鍵詞就是採用餘弦距離計算得出的。

KD 樹

其實從上文你也能看出來,KNN 的計算過程是大量計算樣本點之間的距離。爲了減少計算距離次數,提升 KNN 的搜索效率,人們提出了 KD 樹(K-Dimensional 的縮寫)。KD 樹是對數據點在 K 維空間中劃分的一種數據結構。在 KD 樹的構造中,每個節點都是 k 維數值點的二叉樹。既然是二叉樹,就可以採用二叉樹的增刪改查操作,這樣就大大提升了搜索效率。

在這裏,我們不需要對 KD 樹的數學原理了解太多,你只需要知道它是一個二叉樹的數據結構方便存儲 K 維空間的數據就可以了。而且在 sklearn 中,我們直接可以調用 KD 樹,很方便。

用 KNN 做迴歸

KNN 不僅可以做分類,還可以做迴歸。

首先講下什麼是迴歸。在開頭電影這個案例中,如果想要對未知電影進行類型劃分,這是一個分類問題。首先看一下要分類的未知電影,離它最近的 K 部電影大多數屬於哪個分類,這部電影就屬於哪個分類。

如果是一部新電影,已知它是愛情片,想要知道它的打鬥次數、接吻次數可能是多少,這就是一個迴歸問題。

那麼 KNN 如何做迴歸呢?

對於一個新點,我們需要找出這個點的 K 個最近鄰居,然後將這些鄰居的屬性的平均值賦給該點,就可以得到該點的屬性。當然不同鄰居的影響力權重可以設置成不同的。舉個例子,比如一部電影 A,已知它是動作片,當 K=3 時,最近的 3 部電影是《戰狼》,《紅海行動》和《碟中諜 6》,那麼它的打鬥次數和接吻次數的預估值分別爲 (100+95+105)/3=100 次、(5+3+31)/3=13 次。

如何用 KNN 對手寫數字進行識別分類

手寫數字數據集是個非常有名的用於圖像識別的數據集。數字識別的過程就是將這些圖片與分類結果 0-9 一一對應起來。完整的手寫數字數據集 MNIST 裏面包括了 60000 個訓練樣本,以及 10000 個測試樣本。如果你學習深度學習的話,MNIST 基本上是你接觸的第一個數據集。

今天我們用 sklearn 自帶的手寫數字數據集做 KNN 分類,你可以把這個數據集理解成一個簡版的 MNIST 數據集,它只包括了 1797 幅數字圖像,每幅圖像大小是 8*8 像素。

KNN 分類的流程

  • 數據加載:我們可以直接從 sklearn 中加載自帶的手寫數字數據集;
  • 準備階段:在這個階段中,我們需要對數據集有個初步的瞭解,比如樣本的個數、圖像長什麼樣、識別結果是怎樣的。你可以通過可視化的方式來查看圖像的呈現。通過數據規範化可以讓數據都在同一個數量級的維度。另外,因爲訓練集是圖像,每幅圖像是個 8*8 的矩陣,我們不需要對它進行特徵選擇,將全部的圖像數據作爲特徵值矩陣即可;
  • 分類階段:通過訓練可以得到分類器,然後用測試集進行準確率的計算。

總結

在數據量不大的情況下,使用 sklearn 還是方便的。

如果數據量很大,比如 MNIST 數據集中的 6 萬個訓練數據和 1 萬個測試數據,那麼採用深度學習 +GPU 運算的方式會更適合。因爲深度學習的特點就是需要大量並行的重複計算,GPU 最擅長的就是做大量的並行計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章