https://www.bilibili.com/video/av36993857?from=search&seid=9140941500805535513
https://blog.youkuaiyun.com/c406495762/article/details/75172850
https://cuijiahua.com/blog/2017/11/ml_1_knn.html
knnm没有训练的过程,直接进行分类。
F7,F8,F9,用来debug的。
选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
返回前k个点所出现频率最高的类别作为当前点的预测分类。
用欧氏距离(也称欧几里德度量)
我们可以使用多种方法检测分类器的正确率。此外分类器的性能也会受到多种因素的影响,如分类器设置和数据集等。
F7是进入到函数执行语句中;F8逐行语句跑程序;F9是下一个断点,用来跳过多次的for循环语句;
# 2020.01.28
import numpy as np
import operator
def creatDataSet():
trainData = np.array([[1,101],[5,89],[108,5],[115,8]])# 4行2列
trainlabel = ['爱情片','爱情片','动作片','动作片']
return trainData, trainlabel
def classifyKNN(testData, trainData, trainLabel, k):
dataSetSize = trainData.shape[0] #行数
# tile tile函数的作用是让某个数组以某种方式重复
diffMat = np.tile(testData, (dataSetSize, 1)) - trainData # 差值
sqDiffMat = diffMat**2 #差值的平方
sqDistances = sqDiffMat.sum(axis = 1)#差值的平方和
distances = sqDistances ** 0.5#差值的平方和开根号
sortedDistIndices = distances.argsort()# 从0开始,从小到大排序
classCount = {}#
for i in range(k): # k为0,1,2;
voteIlabel = trainLabel[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
if __name__ == '__main__':
trainData, trainLabel = creatDataSet()
testData = [101, 20]
testLabel = classifyKNN(testData, trainData, trainLabel, 3)
print(testLabel)