工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
# -*- coding: utf-8 -*- # 导入了两个模块,第一个是科学计算包Numpy,第二个是运算符模块,K近邻算法执行排序操作时将使用这个模块提供的函数 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 """ 四个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,标签向量labels, 最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵 dataSet的行数相同 """ def classify0(inX, dataSet, labels, k): #计算距离 dataSetSize = dataSet.shape[0] diffMat = tile(inX, (dataSetSize, 1)) - dataSet sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis = 1) distances = sqDistances ** 0.5 sortedDistIndicies = distances.argsort() classCount = {} #选择距离最小的K个点 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #使用程序operator模块的itemgetter方法,按照第二个元素的次序对元组进行排序,此处的排序为逆序,即按照从大到小的次序,最后返回发生频率最高的元素标签 sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True) return sortedClassCount[0][0] dataSet, labels = createDataSet() testPoint = [0, 0] print classify0(testPoint, dataSet, labels, 3)
分类器并不会得到百分百正确的结果,我们可以使用多种方法检测分类器的正确率。此外分类器的性能也会受到很多因素的影响,例如分类器设置和数据集等。用测试集去测试分类器的错误率,错误率即是分类器给出错误结果的次数除以测试执行的总数。完美的分类器的错误率为0,最差分类器的错误率为1.0。