- KNN工作原理:存在這麼一個樣本資料集合,也稱訓練集,在這個資料集合中,我們具體知道每一個資料所屬的類别,也就是标簽。那麼輸入一組沒有标簽的資料後,将新資料的特征與訓練集對應的特征進行比較,然後算法提取訓練集中樣本特征最接近的标簽。一般隻選擇訓練集中最接近的前k個資料,一般k不大于20.
- KNN算法的一般流程:
- 計算已知類别資料集中的點與目前點的距離;
- 按照距離遞增次序排序;
- 選取與目前點距離最小的k個點;
- 确定前k個點所在類别的出現頻率;
- 傳回前k個點出現頻率最高的類别作為目前點的預測分類。
- 代碼實作:win10+python3.7
import numpy as np
import operator
# K-鄰近算法
def classify0(inX, dataSet, labels, k):
# 距離計算
dataSetSize = dataSet.shape[0] # 檢視輸入數組的維數
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet # 計算輸入與訓練集的差分
sqDiffMat = diffMat**2 # 計算平方
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5 # 計算根方
sortedDistIndicies = distances.argsort() # 按行從小到大傳回下标
# 選擇距離最小的k個點
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
# 排序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
# 建立訓練資料
def createDataSet():
group = np.array([[1.0, 1.1],[1.0, 1.0],[0, 0],[0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
# 運作
if __name__ == '__main__':
group, labels = createDataSet()
result = classify0([1,1],group,labels,3)
print(result)
補充:
(1)由于《機器學習實戰》這本書上的代碼是基于py2的,現在的環境基本都是py3,是以需要略作修改;
(2)shape函數:傳回輸入的矩陣數組的維數,切記一定是矩陣數組,如果是list類型的就不行,如果是list類型的輸入,要用np.array()轉換為矩陣數組後再用shape函數。
(3)tile函數:将輸入的數按照一定的形式輸出。如上面代碼中,輸入的是inX,輸出的形式是(dataSetSize,1)型的矩陣,裡面的元素全為inX。
(4)argsort函數:按行從到大傳回數的下标,如果axis=1,則是按列。