Python学习之k-近邻实例

  海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件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("\t")
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. 测试结果

你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
...

  所有程序均来自《机器学习实战》,非常好的书籍,推荐大家学习一下......

posted @ 2017-04-21 09:30  天~宇~翱~翔  阅读(399)  评论(0编辑  收藏  举报