k-近鄰算法
-
優點:精度高、對異常值不敏感、無數據輸入假定
-
缺點:計算複雜性高、空間複雜度高
-
適用數據範圍:數值型和標稱型
(標稱型:目標變量的結果只在有限目標集中取值 ,如 真與假;
數值型:目標變量可以從無限的數值中取值,主要用於迴歸分析。) -
K-近鄰算法(KNN)工作原理:存在一個樣本數據集合,也稱訓練樣本集,並且樣本集中每個數據都存在標籤,即我們知道樣本數據集每一數據與所屬分類的對應關係。輸入沒有標籤的新數據後,將新數據的每個特徵樣本集數據對應的特徵進行比較,然後算出提取樣本集中特徵最相似的分類標籤。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大於20的整數。最後,選擇k個最相似數據中出現次數最多的分類,作爲新數據的分類。
-
k-近鄰算法的一般流程:
(1)收集數據:可以使用任何方法。
(2)準備數據:距離計算所需要的數值,最好是結構化的數據格式。
(3)分析數據:可以使用任何方法
(4)訓練算法(此步驟不適用於k-近鄰算法)
(5)測試算法:計算錯誤率
(6)使用算法:首先需要輸入樣本數據和結構化的輸出結果,然後運行k-近鄰算法判定輸入數據分別屬於哪個分類,最後應用對計算出的分類執行後續的處理。
k-近鄰算法
歐式距離公式
'''
numpy.tile的用法參考
https://blog.csdn.net/xiahei_d/article/details/52749395
'''
def classify0(inX , dataSet ,labels ,k):
# 獲取數據集的大小 取的一維數組的大小
dataSetSize =dataSet.shape[0]
#計算距離 歐式距離格式
diffMat = tile( inX ,(dataSetSize,1))-dataSet
sqDiffMat =diffMat **2
sqDistances = sqDiffMat.sum( axis =1 )
distances =sqDistances**0.5
#根據diatances排序
#argsort是numpy裏的排序方法
sortedDistances = distances.argsort()
classCount ={ }
#選擇距離最小的k個點
for i in range(k):
#標記當前i個的標籤 進行分類
voteIlabel = labels[sortedDistances[i]]
classCount[voteIlabel] = classCount.get( voteIlabel,0)+ 1
#根據標籤進行分類
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]