1:KNN分类算法介绍
算法实现原理:存在一个样本数据集,将需要分类的输入值与样本数据集计算欧式距离,将欧式距离由小到大进行排序,取前k次最小距离对应的样本数据集,对该样本数据集的类别进行统计,其中出现次数最多的类别为输入值的预判类别。
欧式距离计算公式:
假设A点坐标为(x1,y1),B点坐标为(x2,y2)
则A点与B点的欧式距离为:
2:python实现KNN算法程序
def classify0(inX,dataSet,labels,k): #inX为输入数据,dataSet为样本数据集,labels为样本数据集标签,k为取前k个欧式距离最近样本
dataSetSize = dataSet.shape[0] #输出矩阵行数,括号中为1,则输出列数
diffMat = tile(inX, (dataSetSize,1)) - dataSet #tile命令将inX复制dataSetSize行,1列
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) #矩阵内部元素求和
distances = sqDistances**0.5 #求取根号值
sortedDistIndicies = distances.argsort() #将元素由小到大进行排序,输出排序后数值所在原始矩阵中的位置
classCount = {}
for i in range(3):
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]
3:案例推算
inX = [0,0]
dataSet = [[1,1.1],[1,1],[0,0],[0,0.1]]
labels = ['A','A','B','B']
k = 3
则:
dataSetSize = 4
diffMat = [[0,0],[0,0],[0,0],[0,0]]-[[1,1.1],[1,1],[0,0],[0,0.1]]
=[[-1,-1.1],[-1,-1],[0,0],[0,-1]]
sqDiffMat =[[1,1.21],[1,1],[0,0],[0,0.01]]
sqDistances = [2.21,2,0,0.01]
distances = [1.49,1.41,0,0.1]
sortedDistIndicies = [2,3,1,0]
sortedClassCount[0][0] = B
初次写博客,欢迎各位大佬提意见