优点:精度高,对异常值不敏感,无数据输入假定。
缺点:计算复杂度高,空间复杂度高。
适用数据范围:数值型,标称型。
算法:
def classify0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] #样本维度 diffMat = tile(inX,(dataSetSize,1))-dataSet #创建一个(dataSetSize维度) sqDiffMat = diffMat**2 sqDistances = sqDiffMat .sum(axis=1) distances = sqDistances**0.5 sortedDistIndicies = distances.argsort() #返回distances 从小到大的index classCount = {} #分类 for i in range(k): voteIlabel =labels[sortedDistIndicies[i]] #取出排K的分类 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #error dict[obj] ‘int‘ object has no attribute ‘get‘ sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse =True) #从大到小概率高的排序 # classCount.iteritems() #返回迭代器方法同items() #items()方法是将字典中的每个项分别做为元组,添加到一个列表中,形成了一个新的列表容器。如果有需要也可以将返回的结果赋值给新变量,这个新的变量就会是一个列表数据类型。 print sortedClassCount #[(‘B‘, 2), (‘A‘, 1)] return sortedClassCount[0][0] ‘‘‘ a = [1,2,3] >>> b=operator.itemgetter(1) //定义函数b,获取对象的第1个域的值 >>> b(a) 2 >>> b=operator.itemgetter(1,0) //定义函数b,获取对象的第1个域和第0个的值 >>> b(a) (2, 1) 要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。 sorted函数 Python内置的排序函数sorted可以对list或者iterator进行排序,官网文档见:http://docs.python.org/2/library/functions.html?highlight=sorted#sorted,该函数原型为: sorted(iterable[, cmp[, key[, reverse]]]) 参数解释: (1)iterable指定要排序的list或者iterable,不用多说; (2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如: students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,例如这里要通过比较第三个数据成员来排序,代码可以这样写: students = [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘, ‘B‘, 10)] sorted(students, key=lambda student : student[2]) (3)key为函数,指定取待排序元素的哪一项进行排序,函数用上面的例子来说明,代码如下: sorted(students, key=lambda student : student[2]) key指定的lambda函数功能是去元素student的第三个域(即:student[2]),因此sorted排序时,会以students所有元素的第三个域来进行排序。 有了上面的operator.itemgetter函数,也可以用该函数来实现,例如要通过student的第三个域排序,可以这么写: sorted(students, key=operator.itemgetter(2)) sorted函数也可以进行多级排序,例如要根据第二个域和第三个域进行排序,可以这么写: sorted(students, key=operator.itemgetter(1,2)) 即先跟句第二个域排序,再根据第三个域排序。 (4)reverse参数就不用多说了,是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为True时将按降序排列。 ‘‘‘
1,收集数据:可以使用任何方法。
2,准备数据:距离计算所需的数值,最好是结构化的数据格式。
def creatDataSet(): group = array([1.0,1.1],[1.0,1.0],[0,0],[0,0.1]) labels = [‘A‘,‘A‘,‘B‘,‘B‘] return group,labels
3,分析数据:可以使用任何方法。
4,训练算法:此步骤不适用k-近邻算法。
5,测试算法:测试错误率。
6,使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续处理。
原文:http://www.cnblogs.com/Zidon/p/5089972.html