一、原理
K最近鄰算法(K-Nearest Neighbor, KNN)是最基本的分類算法,其基本原理是:從最近的K個鄰居(樣本)中,選擇出現次數最多的類別作為判定類別。K最近鄰算法可以理解為是一個分類算法,常用於標簽的預測,如性別。
實現KNN算法核心的一般思路:
- 相似度計算——計算未知樣本和每個訓練樣本的距離;
- 排序——按照距離的遞增關系排序;
- 統計標簽——得到距離最小的前K個樣本,統計K最近鄰樣本中每個樣本出現的次數;
- 預測標簽——選擇出現頻率最高的類標號作為未知樣本的類標號;
K值的選擇是選擇統計的樣本數量,K值得選擇會對KNN算法產生較大得影響。
- 如果K值較小,則意味着:只有當需要進行預測的樣本和訓練的樣本較接近時,才能有較好的效果;
- 如果K值較大,則意味着:算法分類的近似誤差增大。這時,與輸入樣本距離較遠的樣本也會對結果產生作用。
在實際上,K值一般選擇較小的數,也可以選擇交叉驗證的方法尋找最優K值。
二、實例Python實現
利用KNN算法實現性別判定:很多時候,用戶在注冊的時候,沒有填寫性別,這個時候,可以通過KNN預測。
import numpy as np class KNN: def __init__(self, k): self.k = k def createData(self): features = np.array([[180,76],[158,43],[176,78],[161,49]]) labels = ["男","女","男","女"] return features, labels def Normalization(self, data): # print("data:\n",data)
maxs = np.max(data, axis=0) # print("maxs:\n",maxs)
mins = np.min(data, axis=0) # print("mins\n",mins)
new_data = (data - mins) / (maxs - mins) # print("new_data:\n",new_data)
return new_data, maxs, mins def classify(self, one, data, labels): # 計算新樣本與數據集每個樣本之間的距離,這里采用歐式距離
differenceData = data - one squareData = (differenceData ** 2).sum(axis=1) distance = squareData ** 0.5
# 從小到大排序
sortDistanceIndex = distance.argsort() labelCount = dict() for i in range(self.k): label = labels[sortDistanceIndex[i]] labelCount.setdefault(label,0) labelCount[label] += 1
print("labelCount:\n",labelCount) sortLabelCount = sorted(labelCount.items(),key=lambda x:x[1], reverse=True) print(sortLabelCount) return sortLabelCount[0][0] if __name__ == '__main__': # 初始化類對象,前k個里面,哪個標簽最多,就預計是那個
knn = KNN(3) # 創建數據集
features, labels = knn.createData() # 數據集標准化
new_data, maxs, mins = knn.Normalization(features) # 新數據的標准化
one = np.array([176,76]) new_one = (one - mins) / (maxs - mins) result = knn.classify(new_one, new_data, labels) print("數據{}的預測性別為:{}".format(one, result))
運行結果: