1 #coding:utf-8 2 3 import numpy as np 4 import operator 5 6 7 def classify(intX,dataSet,labels,k): 8 ''' 9 KNN算法 10 ''' 11 dataSetSize =dataSet.shape[0] 12 ##numpy 中shape[0]返回数组的行数,shape[1]返回列数 13 ##构建计算矩阵 14 ##intX横向重复dataSetSize次,纵向重复1次 15 ##例如intX=([1,2])--->([[1,2],[1,2],[1,2],[1,2]])便于后面计算 16 diffMat=np.tile(intX,(dataSetSize,1))-dataSet 17 ##将待分类样品复制dataSetSize份并与dataSet每个测试样一一对应 18 ##计算待分类样品与已知样品的对应特征差值的平方 19 sqdiffMat=diffMat**2 20 ##计算待分类样品与每个已知样品的欧式距离 21 seqDistance=sqdiffMat.sum(axis=1) ##axis=1代表横轴(第1轴),0代表竖轴(第0轴) 22 distance=seqDistance**0.5 23 print "distance:",distance 24 ##返回distance中元素从小到达排序后的索引 25 sortDistance=distance.argsort() 26 print "SortDistance:",sortDistance 27 classCount={} 28 for i in range(k): 29 voteLabel=labels[sortDistance[i]] 30 #print "第 %d 个 voteLabel = %s" %(i,voteLabel) 31 classCount[voteLabel]=classCount.get(voteLabel,0)+1 32 ##dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值 33 ##计算类别次数 34 ##key = operator.itemgetter(1)根据字典的值进行排序 35 ##key = operator.itemgetter(0)根据字典的键进行排序 36 ##reverse 降序排序字典 37 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) 38 ##sortClassCount={[“动作片”,2],("爱情片",1]) 39 print "sortedClassCount:",sortedClassCount 40 return sortedClassCount[0][0] 41 42 def File2Matrix(filename): 43 fr=open(filename,'r') 44 FileLines=fr.readlines() 45 ##获取数据的行数 46 NumOfFLines=len(FileLines) 47 ##建立数据返回矩阵 48 returnMat=np.zeros([NumOfFLines,3]) 49 ##返回分类标签 50 classLabelVector=[] 51 ##行索引 52 index=0 53 for line in FileLines[1:]: 54 line=line.strip()##删除收尾空白字符 55 listFromLine =line.split("\t") 56 ##每行数据是\t划分的,将每行数据按照\t进行切片划分 57 returnMat[index,:]=listFromLine[1:4] 58 ##根据文本划分为1,2,3类 59 if listFromLine[-1]=="I. setosa": 60 classLabelVector.append(1) 61 elif listFromLine[-1]=="I. versicolor": 62 classLabelVector.append(2) 63 else: 64 classLabelVector.append(3) 65 index+=1 66 fr.close() 67 return returnMat,classLabelVector 68 69 if __name__ =="__main__": 70 datas,labels=File2Matrix("iris_data.txt") 71 print datas[0:4] 72 print labels[0:4] 73 test = [5.9,3.0,5.1] 74 test_class = myKNN.classify(test,datas,labels,5) 75 if test_class=="1": 76 print "I. setosa" 77 elif test_class=="3": 78 print "I. virginica" 79 else: 80 print "I. versicolor" 81 82 83 84 85
'''本文件实现KNN
KNN算法的本质上使用模板匹配的思想。
要确定一个样本的类别,可以计算它与所有训练样本的距离,
然后找出和该样品最接近的k个样本,统计这些样本的类别进行投票,票数最多的那个类就是分类结果。
'''
'''
KNN算法是一种判别算法,即可支持分类,也可支持回归,是一种非线性模型。
它天然的支持多分类问题。KNN算法没有训练过程,是一种基于实例的算法。
KNN实现对Iris数据的分类。
'''
'''
KNN算法步骤
(1)计算距离
(2)选择距离最小的k个点
(3)排序
'''