#coding:utf-8 from numpy import * import operator def file2matrix(filename): fr=open(filename) arrline=fr.readlines() lenth=len(arrline) matrix=zeros((lenth,3))#3表示特征个数 label=[] index=0 for line in arrline: line=line.strip() linearr=line.split(" ") matrix[index,:]=linearr[0:3] label.append(linearr[-1]) index=index+1 return matrix,label def Norm(data):#特征取值差异较大时,容易出现向取值大特征偏向,故一般情况都需要正则化训练集 minval=data.min(0) maxval=data.max(0) m=len(data) maxjmin=maxval-minval fenmu=data-tile(minval,(m,1)) norm=fenmu/tile(maxjmin,(m,1)) return norm def classifier(testdata,data,label,k):#采用欧式距离作为量度 lenth=data.shape[0] jian=data-tile(testdata,(lenth,1)) sqr=jian**2 add=sqr.sum(1) ksqr=add**0.5 sortindex=ksqr.argsort()#为了统计标签频次,将索引作为列表值 dict={} for i in range(k): lab=label[sortindex[i]] dict[lab]=dict.get(lab,0)+1 resort=sorted(dict.iteritems(),key=operator.itemgetter(1),reverse=True) return resort[0][0] def testclassifier(): rat=0.05#将训练集的%5作为测试集 data,label=file2matrix("dat.txt") norm=Norm(data) m=norm.shape[0] testdata=int(rat*m) error=0.0 for i in range(testdata): result=classifier(norm[i,:],norm[testdata:m,:],label[testdata:m],3) if result!=label[i]: error+=1.0 print error/float(testdata) testclassifier()