機器學習:KNN-近鄰算法

1、理論知識

一、K近鄰(k-Nearest Neighbor,簡稱KNN)學習是一種經常使用的監督學習算法

     工做機制:給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,而後基於這k個的信息來進行預測。且一般使用「投票法」。機器學習

 

二、以電影類型舉例,如今已知部分電影的屬性和分類,想要預測未知電影的分類。ide

      

  咱們能夠計算未知電影和其它電影的屬性距離,這裏直接採用幾何距離(Euclidean Distance),即把每一個屬性化爲不一樣維度的座標,再利用距離公式學習

             

  計算結束後,遞增排序,能夠找到k個最近的樣本。由於要採用「投票法」,即知足少數服從多數原則,因此K的取值通常爲奇數。這裏假設k=3,則最靠近的3個都爲愛情電影,因此判斷未知電影爲愛情電影。測試

       

 

三、KNN算法僞碼描述:優化

  (1) 計算已知類別數據集中的點與當前點之間的距離;idea

  (2) 按照距離遞增次序排序;spa

  (3) 選取與當前點距離最小的k個點;
rest

  (4) 肯定前k個點所在類別的出現頻率;
code

  (5) 返回前k個點出現頻率最高的類別做爲當前點的預測分類

 

四、優勢:簡單易於理解;經過對K的選擇可具有丟噪音數據的健壯性

   缺點:(1)須要大量空間儲存全部已知實例

      (2)算法執行效率低(須要比較全部已知實例與要分類的實例

           (3)當其樣本分佈不平衡時,好比其中一類樣本過大(實例數量過多)佔主導的時候,新的未知實例容易被歸類爲這個主導樣本,由於這類樣本實例的數量過大,但這個新的未知實例並未接近目標樣本。

     

    缺點(3)的意思是,如圖中的Y點,黑圈表明其k的取值,即黑圈內的點都是要進行投票的數據點。經過觀察會發現Y顯然與紅點更近,然而由於紫色點在這個圈裏數目更多,Y點就會被認爲是紫色。對於這個缺點,一般咱們用權重的方法改善,根據距離d改變權重,例如1/d,這樣就能讓離目標點近的數據點的權重更大一點,優化算法。

  

 

2、代碼實現

  調用sklearn庫中KNN算法分析著名的iris數據

 1 from sklearn import neighbors
 2 from sklearn import datasets
 3 
 4 knn = neighbors.KNeighborsClassifier()
 5 iris = datasets.load_iris()
 6 
 7 knn.fit(iris.data, iris.target)                          # 創建KNN模型,輸入特徵值和分類結果
 8 predictedLabel = knn.predict([[6.3, 1.2, 5.2, 1.6]])
 9 
10 print("predictedLabel is :"+ str(predictedLabel))
predictedLabel is :[1]

  有現成的庫調用起來很方便,固然也能夠本身寫對應的算法,下面是KNN的算法。

 1 def classify0(inX, dataSet, labels, k):                  # KNN算法
 2     dataSetSize = dataSet.shape[0]
 3     diffMat = tile(inX, (dataSetSize,1)) - dataSet       #計算兩個點的空間距離
 4     sqDiffMat = diffMat**2
 5     sqDistances = sqDiffMat.sum(axis=1)
 6     distances = sqDistances**0.5
 7     sortedDistIndicies = distances.argsort()
 8     classCount={}
 9     for i in range(k):                                   #選擇距離最小的k個點
10         voteIlabel = labels[sortedDistIndicies[i]]
11         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
12     sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # 按照第二個元素進行從小到大排序,最後返回發生頻率最高的標籤
13     return sortedClassCount[0][0]

 

3、參考資料

  《機器學習》—— 周志華

  《機器學習實戰》—— Peter Harrington

 

ps:本人初學者,有錯誤歡迎指出。感謝。

相關文章
相關標籤/搜索