'''k-近邻算法实现约会网站的配对效果'''
from numpy import *
import operator
'''读取文件'''
def file2matrix(filename):
f=open(filename)
numberOflines=len(f.readlines())#读取所有行
returnMat=zeros((numberOflines,3))
classLabelVector=[]
f=open(filename)
index=0
for line in f.readlines():
line=line.strip()#去空格
listFromline=line.split('\t')#通过指定分隔符切片
returnMat[index,:]=listFromline[0:3]
classLabelVector.append(listFromline[-1])
index+=1
return returnMat,classLabelVector
'''归一化'''
def autoNorm(dataSet):
minVals=dataSet.min(0)#每一列最小/最大值
maxVals=dataSet.max(0)
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))
m=dataSet.shape[0]
normDataSet=dataSet-tile(minVals,(m,1))#重复m次
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals
'''算距离'''
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
sortedDist=distances.argsort()#从小到大
classCount={}
for i in range(k):
votellabel=labels[sortedDist[i]]
classCount[votellabel]=classCount.get(votellabel,0)+1
sortclassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#从大到小
return sortclassCount[0][0]
'''测试准确率'''
'''90%训练,10%测试'''
def datingClassTest():
hoRatio=0.1
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')#读取数据
normMat,ranges,minVals=autoNorm(datingDataMat)#归一化
m=normMat.shape[0]
numTestVecs=int(m*hoRatio)
errorCount=0
for i in range(numTestVecs):
classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
#print("分类器返回的值:%s,正确的值:%s"%(classifierResult,datingLabels[i]))
if(classifierResult!=datingLabels[i]):
errorCount+=1
print("第%d个错了"%(int(i+1)))
print("分类器返回的值:%s,正确的值:%s"%(classifierResult,datingLabels[i]))
print("总错误率是:%f"%(errorCount/float(numTestVecs)))
print("错误个数:%f"%(errorCount))
datingClassTest()
输出结果:
第23个错了
分类器返回的值:3,正确的值:2
第75个错了
分类器返回的值:3,正确的值:1
第84个错了
分类器返回的值:3,正确的值:1
第92个错了
分类器返回的值:2,正确的值:3
第100个错了
分类器返回的值:3,正确的值:1
总错误率是:0.050000
错误个数:5.000000
'''预测'''
def classifyPerson():
resultList=['不喜欢','一般喜欢','特别喜欢']
f=float(input('每年坐飞机多少公里'))
p=float(input('玩游戏的时间占比'))
i=float(input('每年吃多少公升冰淇淋'))
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
normMat,ranges,minVals=autoNorm(datingDataMat)
inArr=array([f,p,i])
classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
print("你对这个人的感觉是:",resultList[int(classifierResult)-1])
classifyPerson()
输出结果:
每年坐飞机多少公里2222
玩游戏的时间占比0.6
每年吃多少公升冰淇淋1
你对这个人的感觉是: 一般喜欢