K近邻算法(K Nearest Neighbor算法,即KNN算法),是一个经典的机器学习算法,主要根据新数据与样本数据间的距离来判断所属类别。关于距离的测量通常采用以下几种方法:欧氏距离、曼哈顿距离、切比雪夫距离、余弦等。KNN算法的详细思想概念可以参看文章1和文章
优点:精度高、对异常值不敏感、无数据输入假定;
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型
1.收集数据:可以使用任何方法;
2.准备数据:距离计算所需数值,最好是结构化的数据格式;
3.分析数据:可以使用任何方法;
4.训练算法:此步骤不适用K近邻算法;
5.测试算法:计算错误率;
6.使用算法:首次需要输入样本数据和机构化的输出结果,然后运行K近邻算法判断输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
#KNN.py #coding = utf-8 from numpy import * #导入科学计算包 import operator #导入运算符模块 def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group, labels def classify0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] #读取dataSet的第一维长度 #距离计算 newMat= tile(inX, (dataSetSize,1)) #将inX重复成dataSetSize行 print('newMat= ',newMat) diffMat = newMat-dataSet print('diffMat= ',diffMat) sqDiffMat = diffMat**2 print('sqDiffMat = ',sqDiffMat) sqDistances = sqDiffMat.sum(axis=1) #矩阵行向量相加 print('sqDistances=',sqDistances) distances = sqDistances**0.5 print('distance = ',distances) sortedDistIndicies = distances.argsort() #返回排序后的索引值 print('sortedDistI = ',sortedDistIndicies) #选择距离最小的K个点 classCount={} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #排序 print(classCount.items()) print(operator.itemgetter(1)) #operator模块提供的itemgetter函数用于获取对象的哪些维的数据,这里operator.itemgetter(1)是根据第二个域的数据来排序 #reverse表示升序还是降序排列,默认是false升序,而降序则是true sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]
#test.py import KNN group,labels = KNN.createDataSet() result = KNN.classify0([0,0], group, labels, 3) print(result) # B