zoukankan      html  css  js  c++  java
  • 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("	")
    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. 测试结果

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

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

  • 相关阅读:
    day02【Collection、泛型】
    day11 【final、权限、内部类、引用类型】
    day10 【接口、多态】
    day09 【继承、super、this、抽象类】
    day08 【String类、static关键字、Arrays类、Math类】
    Java基本运算符
    Java非访问修饰符
    2020学习Java开发有前途吗?看看资深程序员怎么说
    两年Java后端开发,面试了几十家公司的面试分享
    五种方法创建java对象,你知道几种呢?
  • 原文地址:https://www.cnblogs.com/sunfie/p/6741919.html
Copyright © 2011-2022 走看看