1. 程式人生 > >我與機器學習 - [Today is Knn] - [K-近鄰演算法]

我與機器學習 - [Today is Knn] - [K-近鄰演算法]

優點:精度高,對異常值不敏感,無資料輸入假定

缺點:計算複雜度高,空間複雜度高

適用資料範圍:數值型和標稱型

k近鄰,也就是KNN演算法,他的工作原理是:一個有監督的學習,有一個帶有標籤的訓練集,訓練,當我們輸入沒有標籤的的新資料後,將新資料的每個特徵與訓練集中的每個特徵比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤,一般來說只選擇樣本資料集中,最相似的前K個數據,這就是K的由來,通常不大於20,最後選擇k個最相似資料中出現次數最多的分類,作為新資料的分類

虛擬碼:

對未知類別屬性的資料集中的每個點依次之行以下操作:

1. 計算已知類別資料集中的點與當前點的距離

2. 按照距離遞增次序排序

3. 選取與當前點距離最小的K個點

4. 確定前K個點所在類別的出現頻率

5. 返回前K個點中出現頻率最高的的類別作為當前點的預測分類

核心演算法思路:

1. 首先確定樣本資料的數量,shape(0)

2. 測試資料要確保特徵數量和樣本資料一致,使用np.tile(array, (a,b))(將array 複製b次後 再複製a行)  將測試資料複製到和樣本資料數量相同,行數相同。

3. 將測試資料與樣本資料做差,計算測試資料與每個樣本之間的差值,獲得一個差值矩陣

4. 對差值矩陣運用距離計算公式 對axis = 1 上的元素計算平方和並開方,獲得一個距離的列向量

5.對這個列向量進行排序

6.執行for迴圈,迴圈K次,記錄每個類別出現的次數,並使用字典記錄類別對應的出現次數{A:5}

7.for迴圈結束後,對上一步得到的字典進行排序得到次數出現最多的那個類別返回

用的一些技術:

1. 歸一化數值,當某些特徵數值較大而某些特徵數值較小時,計算距離的時候較大的數值將會產生較大的影響,這是我們不願意看到的,所以引入了歸一化數值,這裡用到了將數值取值範圍固定在[0, 1]或者[-1, -1],下面的公式可以將值轉化為0到1區間:newvalue = (oldvalue - min) / (max - min)

k-近鄰演算法必須儲存全部資料,每次預測需要載入全部資料,這中情況下,如果訓練集非常大,必須使用大量的儲存空間,此外由於必須對資料集中的每個資料計算距離的值,因此實際使用是可能非常耗時。

k-近鄰演算法 的另一個缺陷是他無法給出任何資料的基礎結構資訊,因此我們也無法知曉平均例項樣本和典型例項樣本具有什麼特徵。

程式碼:

https://github.com/HanGaaaaa/MLAProject/tree/master/Knn