from numpy import *
import operator
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
sortedDistIndicies=distances.argsort()#排序确定邻近类,每个数据位置不变,返回矩阵为其在排序中的位置
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]#获得每个类标签
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#排序给每个类加一
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#将字典按权排序,取权值大的类
return sortedClassCount[0][0]
def file2matrix(filename):
fr = open(filename)#打开训练集文本
arrayOLines = fr.readlines()#读取训练集并按特征向量分类,列表字符串
numberOfLines =len(arrayOLines)#特征向量(类)个数
returnMat = zeros((numberOfLines,3))#list属性描述用tuple 行三列三(3,3)
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()#去掉数据两端非数据字符 截取掉所有的回车字符
listFromLine = line.split('\t')#切割字符串为列表 使用tab字符将上一步得到的整行数据分割成一个元素列表 我们选取前3个元素,将它们存储到特征矩阵中
returnMat[index,:] = listFromLine[0:3]#index的整行复制属性
classLabelVector.append(int(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))#创建dataset同规模的矩阵
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m, 1) )#矩阵元素减法
normDataSet = normDataSet/tile(ranges, (m,1))#矩阵元素除法得到0-1的减小规模的数据
return normDataSet, ranges, minVals#返回小规模数据,归一化数据
def datingClassTest():#测试分类器性能,数据百分之十用作测试,其他训练
hoRatio = 0.10
filename='datingTestSet2.txt'
datingDataMat,datingLabels = file2matrix(filename)#整理数据
normMat, ranges, minVals = autoNorm(datingDataMat)#归一化数据
m = normMat.shape[0]#特征向量,类数
numTestVecs = int(m*hoRatio)
errorCount = 0.0
for i in range(numTestVecs):#取前百分之十测试
classifierResult =classify0(normMat[i, :],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)#normMat[i,:] i行的所有元素的特征向量 normMat[numTestVecs;m,:] 后百分之九十的所有特征向量
print('the classifier came back, with: %d, the real answer is: %d' % (classifierResult, datingLabels[i]))
if (classifierResult != datingLabels[i]):
errorCount += 1#错误数
print ("the total error rate is: %f" % (errorCount/float(numTestVecs)) )#错误率
监督学习-k近邻算法模板
最新推荐文章于 2022-10-29 20:49:30 发布