海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有 1000 行。海伦的样本主要包含以下 3 种特征:
1. 每年获得的飞行常客里程数
2. 玩视频游戏所耗时间百分比
3. 每周消费的冰淇淋公升数
在将上述特征数据输人到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。在 kNN.py 中创建名为 file2matrix的函数,以此来处理输人格式问题。该函数的输人为文件名字符串输出为训练样本矩阵和类标签向量,整体程序如下:
1. 读取测试数据文件
1 # 读取测试数据文件 2 def read_file(filename): 3 datafile = open(filename) 4 lines = datafile.readlines(); 5 length = len(lines) 6 marix = zeros((length,3)) 7 classLabelVector = [] 8 index = 0 9 for line in lines: 10 line = line.rstrip() 11 words = line.split(" ") 12 marix[index,:]=words[0:3] 13 classLabelVector.append(float(words[-1])) 14 index = index + 1 15 return marix,classLabelVector
2. 测试数据归一化
在处理不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间,下面的公式可以将任意取值范围的特征值转化为0到1区间内的值 :newValue = (oldValue-min)/(max-min),具体程序如下:
1 def autoNorm(dataSet): 2 minVals = dataSet.min(0) 3 maxVals = dataSet.max(0) 4 range = maxVals - minVals 5 normDataSet = zeros(shape(dataSet)) 6 m = dataSet.shape[0] 7 normDataSet = dataSet - tile(minVals,(m,1)) 8 normDataSet = normDataSet/tile(range,(m,1)) 9 return normDataSet,range,minVals
3. 分类器
主要是利用测试数据对前面创建的分类器进行验证,测试分类器的效果
1 def classify(inX,dataSet,labels,k): 2 dataSetSize = dataSet.shape[0] 3 diffMat = tile(inX,(dataSetSize,1))-dataSet 4 sqDiffMat = diffMat**2 5 sqDistances = sqDiffMat.sum(axis=1) 6 distances = sqDistances**0.5 7 sortedDistIndices = distances.argsort() 8 classCount={} 9 for i in range(k): 10 voteIlabel = labels[sortedDistIndices[i]] 11 classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 12 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) 13 return sortedClassCount[0][0]
4. 测试
1 def datingClassTest(): 2 resultList = ['一点也不喜欢','有一点好感','特别喜欢'] 3 hoRatio = 0.1 4 filename = 'E:\datingTestSet2.txt'; 5 (marix,classLabel)=read_file(filename) 6 normdataSet,ranges,minVals=autoNorm(marix) 7 m = normdataSet.shape[0] 8 numTestVecs = int(m*hoRatio) 9 errorCount = 0.0 10 for i in range(numTestVecs): 11 classResult = classify(normdataSet[i,:],normdataSet[numTestVecs:m,:],classLabel[numTestVecs:m],3) 12 print "你对这个人的感觉是:%s ,现实情况是:%s" %(resultList[int(classResult-1)],resultList[int(classLabel[i]-1)]) 13 if classResult != classLabel[i]: 14 errorCount += 1.0 15 print "错误率是: %f " %(errorCount/float(numTestVecs))
5. 测试结果
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
...
所有程序均来自《机器学习实战》,非常好的书籍,推荐大家学习一下......