机器学习实战python版归一化数值和测试kNN算法以及构建完整可用系统

原创 2015年11月20日 11:23:10

经过前面的学习,我们已经能够较为熟练的应用python而且能够比较轻松的阅读书中的代码。
第一博机器学习实战python环境搭建以及numpy和matplotlib安装遇到的各种问题(一)
第二博机器学习实战python版本matplotlib安装遇到的各种问题和代码演示

学习了几天的机器学习实战,现在已经完全不可收拾了,昨天加班搞完手头的事,今天就迫不及待的打开课本继续欣赏书中算法和代码了。

归一化数值:

通过学习我们发现,数据中数值大的属性对结果的影响最大,而实际中每一个属性是同等重要的,我们我们要进行归一化,确保每个属性所占的比重相同,我们用的方法就是:
找到最大值,最小值,然后用现在的数据值减去最小值,再除以幅度值。

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))#减去最小值
    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide
    #再除以幅度值,实现归一化,tile功能是创建一定规模的指定数组
    return normDataSet, ranges, minVals

如上面所示我已经做了自己的注释,也方便自己以后看
的时候好理解。运行下面的代码就可以看到归一化的数据了:

import matplotlib
import matplotlib.pyplot as plt
import kNN


datingDataMat,datingLabels = kNN.file2matrix('datingTestSet2.txt')
normMat,ranges,minVals = kN.autoNorm(datingDataMat)

>>> normMat
array([[ 0.44832535,  0.39805139,  0.56233353],
       [ 0.15873259,  0.34195467,  0.98724416],
       [ 0.28542943,  0.06892523,  0.47449629],
       ..., 
       [ 0.29115949,  0.50910294,  0.51079493],
       [ 0.52711097,  0.43665451,  0.4290048 ],
       [ 0.47940793,  0.3768091 ,  0.78571804]])
>>> ranges
array([  9.12730000e+04,   2.09193490e+01,   1.69436100e+00])
>>> minVals
array([ 0.     .001156])

s
array([ 0.     .001156])

测试算法:

在给的数据中,我们用90%的数据去训练分类器,用10%的数据去测试分类器,检测分类器的正确率。

def datingClassTest():
    hoRatio = 0.50      #hold out 10%
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')       #load data setfrom file
    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,:]即为前numTestVecs行的数据,后面为比对数据
        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
        if (classifierResult != datingLabels[i]): errorCount += 1.0
        #如果测试数据的结果和数据资料中应有的结果不一致则错误标记加一。
    print "the total error rate is: %f" % (errorCount/float(numTestVecs))
    print errorCount`
`the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 3, the real answer is: 3
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 2, the real answer is: 1
the classifier came back with: 2, the real answer is: 2
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 2, the real answer is: 2
the total error rate is: 0.064000
32.0`

使用算法:

经过前面测试,我们得到这个分类器是可以使用的,现在我们需要使用这个分类器,来处理外部输入的数据,实现人机交互

def classifyPerson():
    resultList = ['not at all','in small doses', 'in larfe doses']
    percentTats = float(raw_input("percentage of time playing video games?"))
    ffMiles = float(raw_input("frequent flier miles earned per years?"))
    iceCream = float(raw_input("liters of ice cream consumed per years?"))
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals = autoNorm(datingDataMat)
    inArr = array([ffMiles,percentTats,iceCream])
    classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
    print "you will probably like this person: ",resultList[classifierResult -1]

这段代码比较简单,raw_input()函数就是用来接收外部输入的数据的,然后再见分类结果输出出来:
>>>
percentage of time playing video games?10
frequent flier miles earned per years?10000
liters of ice cream consumed per years?0.5
you will probably like this person: in small doses

到目前为止,我们已经看到如何在数据上构建分类器了,但是这里的数据比较简单,我们自己看起来都比较容易分开
接下来,我们就要在不太容易看出来的数据上构建分类器!

接下来要学习手写识别系统!请大家多多指教!

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

机器学习-数据归一化

定义 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之...

机器学习--python归一化特征值

特征值中有些属性的数字过大,从而对计算结果的影响太大,但是实际情况是每个属性都同等重要,这时候就要处理这种不同取值范围的特征值,通常采用数值归一化,将取值范围处理为0-1或者-1-1之间。 将任意取...

几种归一化方法(Normalization Method)python实现

数据归一化问题是数据挖掘中特征向量表达时
  • kryolith
  • kryolith
  • 2014年10月04日 02:07
  • 27842

数据归一化以及Python实现方式

数据归一化简介以及Python实现方式

python3 一组数值的归一化处理

1.什么是归一化: 归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数组按百分比计算的方法。如:1,2,3.,那归一化后就是:0,0.5,1 2.归一化步骤: 如:2,4,6 (1)...

scikit-learn 逻辑回归类库使用小结

原文出处:http://www.cnblogs.com/pinard/p/6035872.html 1. 概述     在scikit-learn中,与逻辑回归有关的主要是这3个类。Log...

Linux网卡中断使单个CPU过载

Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核。然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题。我们已经 在拥有一个或多个饱和1Gbps网卡的高性能...

Python机器学习实战kNN分类算法

自学《机器学习实战》一书,书中的代码亲自敲一遍,努力搞懂每句代码的含义: 今天将第一章kNN分类算法的笔记总结一下。 # -*- coding: utf-8 -*- """ k-近邻算法小结: k...
  • huludan
  • huludan
  • 2016年03月23日 21:29
  • 1095

机器学习实战2:k近邻算法KNN(python)

原理:简单来说,就是采用测量不同特征值之间的距离将其分类,将某点划分到离得最近的那k个点所体现的那一类上。具体来说,将这样实现:首先,导入numpy模块,创建数据集:from numpy import...
  • yf11112
  • yf11112
  • 2015年09月10日 19:23
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:机器学习实战python版归一化数值和测试kNN算法以及构建完整可用系统
举报原因:
原因补充:

(最多只允许输入30个字)