#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("\t")
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()