演算法概述
通過測量不同特徵值之間的距離進行 [分類]
- 優點:精度高、對異常值不敏感、無資料輸入假定。
- 缺點:計算複雜度高、空間複雜度高。
- 適用資料範圍: 數值型 和 標稱型 。
演算法流程
- 資料
- 樣本資料(多維多行資料 + 標籤)
- 預測資料(多維一行資料)
-
比較預測資料與樣本資料的距離
- 歐氏距離
- 歐氏距離
-
將樣本資料按照距離從小到大排序
-
選取前 k 個樣本資料,取出現次數最多的樣本標籤作為預測資料的分類標籤
程式碼示例
import collections
import numpy as np
def culEuDistance(x1, x2):
"""
計算歐氏距離
"""
return ((x1 - x2)**2).sum()**0.5
def knn(X, dataSet, labels, k):
"""
比較預測資料與歷史資料集的歐氏距離,選距離最小的k個歷史資料中最多的分類。
:param X: 需要預測的資料特徵
:param dataSet: 歷史資料的資料特徵
:param labels: 與dataSet對應的標籤
:param k: 前k個
:return: label標籤
"""
if isinstance(dataSet, list):
dataSet = np.array(dataSet)
rowNum = dataSet.shape[0]
X = np.tile(X,(rowNum,1))
distances = np.empty(rowNum)
for row in range(rowNum):
distances[row] = culEuDistance(X[row], dataSet[row])
sortedIdx = distances.argsort()
candidates = []
for i in range(k):
candidates.append(labels[sortedIdx[i]])
return collections.Counter(candidates).most_common(1)[0][0]
if __name__ == "__main__":
# print(culEuDistance(np.array([3,4]), np.array([2,1])))
X = [101,20]
dataSet = [[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]
labels = ['愛情片','愛情片','愛情片','動作片','動作片','動作片']
print(knn(X,dataSet,labels,k=3))
# 動作片