机械学习,机器学习之K

By admin in 4858.com on 2019年4月26日

那两日翻了一下机械学习实战那本书,算法是不错,只是代码不够自个儿,小编是个搞算法的,那一点从代码上就能看出来。但是有个别地点采用numpy搞数组,搞矩阵,总是认为古怪,一个是内需选拔3方包numpy,纵然那些包为主得以说必备了,不过对于有个别新手,连pip都用倒霉,装的numpy也是各样难题,所以说能不用还是尽量不用,首个就是究竟是数据,代码样例里面写的唯有多少个case,不过实际上利用起来,一定是要上数据库的,假如是array是不合乎从数据库中读写多少的。因而综合上述两点,笔者就把那段代码改成list情势了,当然,也大概有人会说自个儿对numpy很熟习啊,而且作为专门的职业的数学包,矩阵的运算方面也很便利,小编不否定,那作者那段代码可能对您不合乎,你能够参考书上的代码,直接照打并明白就好了。

宣称:本篇博文是学习《机器学习实战》1书的不②秘籍路程,系原创,若转发请标明来源。

k-近邻算法

K近日邻(k-Nearest
Neighbor,KNN)分类算法可以说是最简易的机器学习算法了。它应用衡量分裂特征值之间的距离方法开展归类。它的思量很轻易:就算二个样本在特色空间中的k个最相似(即特征空间中最贴近)的样书中的大大多属于某3个门类,则该样本也属于这几个体系。

knn,不多说了,互连网书上讲这么些的一大堆,轻便说正是使用新样本new_case的各维度的数值与已有old_case各维度数值的欧式距离总计

  1. K-近邻算法的一般流程:

k-近邻算法一般流程

  • 一征集数据:能够采纳任何方法。
  • 二希图数据:距离计算机技艺切磋所供给的数值,最棒是结构化的数码格式。
  • 3分析数据:能够行使此外措施。
  • 四磨练算法:此步骤不适用于k-近邻算法。
  • 5测试算法:计算错误率。
  • 陆选拔算法:首先要求输入样本数量和结构化的输入结果,然后运营k-近邻算法判别输入数据分别属于万分分类,最终采用对计量出的归类实践后续的拍卖。

4858.com 1

根据上图所示,有两类分化的样书数量,分别用中黄的小正方形和青莲的小三角形表示,而图正中间的老大墨玉绿的圆所标示的数码则是待分类的数码。相当于说,现在,
大家不晓得中间这些青莲的多少是从属于哪1类(深紫灰小纺锤形or乌紫小三角形),上边,大家就要消除那个标题:给那几个浅湖蓝的圆分类。

  • 如果K=叁,中蓝圆点的近来的一个街坊是三个青白小三角形和二个青色小正方形,少数从属于好些个,基于总计的格局,判断黑色的那个待分类点属于玉石白的三角一类。
  • 要是K=伍,苹果绿圆点的近年来的几个街坊是3个革命三角形和一个樱草黄的星型,还是个别从属于大多,基于总结的不二等秘书诀,判断水绿的这几个待分类点属于金红的圆柱形1类。
    于此大家看看,当不可能看清当前待分类点是从属于已知分类中的哪1类时,我们得以依附总计学的答辩看它所处的岗位特征,度量它相近邻居的权重,而把它归为(或分配)到权重越来越大的那一类。那就是K近邻算法的核心绪想。其根本还在于K值的挑3拣4,所以应该谨慎。

KNN算法中,所采取的邻里都以曾经不易分类的靶子。该措施在定类决策上只依照最靠近的一个只怕多少个样本的花色来决定待分样本所属的等级次序。

KNN 算法本人不难可行,它是壹种 lazy-learning
算法,分类器不必要使用训练集进行锻炼,练习时间复杂度为0。KNN
分类的乘除复杂度和练习聚集的文档数目成正比,也便是说,若是陶冶集普通话档总量为
n,那么 KNN 的分类时间复杂度为O(n)。

其算法描述如下:

欧式距离那里也不说了,风乐趣能够去翻作者那篇python_相差度量,里面写的很详细,并用符号突显表达,你也得以改成棋盘距离或街区距离试试,速度恐怕会比欧式距离快,但依旧安利欧式距离。

(一)收罗数据:可以运用其余格局(如爬虫)。

python代码完结认证

正确总计包:numpy
运算符模块:operator

一)总结已知类别数据汇总的点与当前点时期的离开;

有一点没搞掌握的正是,对坐标实行精度化总结那块,实地度量后鲜明使用间接总计无论是错误率照旧精度,管理前都要比拍卖后更标准,可能原代码使用小数点的可能率越来越高些吗,大概那么些总计对于小数总括精度更有帮助

(二)企图数据:距离计算机手艺研商所供给的数值,最棒是结构化的多少格式。

shape函数表达

shape函数是numpy.core.fromnumeric中的函数,它的效益是查看矩阵恐怕数组的维数

代码:

>>> a = array([[1,2,3],[5,6,9],[9,8,9]])
>>> a.shape
(3, 3)
>>> a.shape[0]
3

2)遵照距离递增次序排序;

闲话一些,不多也不少,下边上代码,代码中配有伪代码,方便阅读,若是还看不太清楚能够留言,作者把详细评释加上

(三)分析数据:能够运用别的方式。

numpy.tile函数表明

函数格局:tile(A,rep)
机械学习,机器学习之K。作用:重复A的一一维度
参数类型:
A: Array类的都足以
rep:A沿着种种维度重复的次数

>>> a =array([[1,2,3],[5,6,9],[9,8,9]])
>>> tile(a,3)
array([[1, 2, 3, 1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9, 9, 8, 9]])
>>> tile(a,[3,2])
array([[1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9],
       [1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9],
       [1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9]])
>>> tile(a,[2,2,3])
array([[[1, 2, 3, 1, 2, 3, 1, 2, 3],
        [5, 6, 9, 5, 6, 9, 5, 6, 9],
        [9, 8, 9, 9, 8, 9, 9, 8, 9],
        [1, 2, 3, 1, 2, 3, 1, 2, 3],
        [5, 6, 9, 5, 6, 9, 5, 6, 9],
        [9, 8, 9, 9, 8, 9, 9, 8, 9]],

       [[1, 2, 3, 1, 2, 3, 1, 2, 3],
        [5, 6, 9, 5, 6, 9, 5, 6, 9],
        [9, 8, 9, 9, 8, 9, 9, 8, 9],
        [1, 2, 3, 1, 2, 3, 1, 2, 3],
        [5, 6, 9, 5, 6, 9, 5, 6, 9],
        [9, 8, 9, 9, 8, 9, 9, 8, 9]]])

reps的数字从后往前分别对应A的第N个维度的重复次数。

如:

  • tile(A,三)表示A的首先个维度重复一遍。
  • tile(A,(三,二))表示A的第二维重复一回,然后第贰个维度重复二回。
  • tile(A,(二,贰,三))表示A的首先个维度重复一回,第三个维度重复贰遍,第三维重复二次。

3)接纳与近年来点距离最小的k个点;

 

(4)测试算法:总计模型误差率。

sum函数表达

函数形式:sum(axis = 0 or 一)
函数功能:未有axis参数表示全数相加,axis=0表示按列相加,axis=一表示根据行的矛头相加(取‘厉害’谐音)

>>> b = tile(a,[3,2])
>>> b
array([[1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9],
       [1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9],
       [1, 2, 3, 1, 2, 3],
       [5, 6, 9, 5, 6, 9],
       [9, 8, 9, 9, 8, 9]])
>>> c = b.sum(axis = 0)
>>> c
array([45, 48, 63, 45, 48, 63])
>>> d = b.sum(axis = 1)
>>> d
array([12, 40, 52, 12, 40, 52, 12, 40, 52])
>>> e = b.sum()
>>> e
312
>>>

四)鲜明前k个点所在类其他产出频率;

以下是代码中应用颜色,选用html的1陆进制PRADOGB颜色,在利用时将其更动为10进制数字总括,old_case选用深黄圈,new_case选拔中绿圈

(5)使用算法:首先要求输入样本数量和结构化的输出结果,然后运维K-近邻算法判别输入数据分别属于哪个分类,最终动用对计量出的归类实践后续的管理。

argsort函数表达

函数方式:argsort(x) or x.argsort()
参数成效:argsort函数重临的是数组值从小到大的索引值

>>> x = array([3,4,2,5,1,6])
#按升序排列
>>> x.argsort()
array([4, 2, 0, 1, 3, 5])
#按升序排列
>>> argsort(-x)
array([5, 3, 1, 0, 2, 4])
>>>

5)再次来到前k个点出现频率最高的品种作为当前点的前瞻分类。

米黄(矮瓜颜色)

  1. K-近邻算法的伪代码和Python代码

sort函数、sorted函数表达

函数格局:sorted(iterable,cmp,key,reverse)
函数作用:排序

  • sort对列表list实行排序,而sorted能够对list恐怕iterator举行排序

  • sort函数对列表list进行排序时会影响列表list自身,而sorted不会

参数类型:
iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定;
key:用列表成分的某部属性或函数进行作为根本字,有暗中同意值,迭代群集中的壹项;
reverse:排序规则. reverse = True 降序 大概 reverse = False
升序,有私下认可值。
再次回到值:是二个经过排序的可迭代类型,与iterable一样。

>>> a = [7,3,9,4,1]
>>> sorted(a)
[1, 3, 4, 7, 9]
>>> a
[7, 3, 9, 4, 1]
>>> a.sort()
>>> a
[1, 3, 4, 7, 9]

对此机械学习而已,Python必要额外安装三件宝,分别是Numpy,scipy和Matplotlib。前两者用于数值计算,后者用于画图。安装很简短,直接到各自的官方网址下载回来安装就能够。安装程序会自动找出大家的python版本和目录,然后安装到python支持的物色路线下。反正就python和那三个插件都私下认可安装就没难题了。

4858.com 2

对未知连串属性的数目汇总的各类点依次执行以下操作:

operator.itemgetter函数

>>> a = [1,2,3]
>>> b = operator.itemgetter(1)//定义函数b,获取对象的第1个域的值
>>> b(a)
2
>>> b = operator.itemgetter(0,1)//定义函数b,获取对象的第1个域和第0个的值
>>> b(a)
(1, 2)

源码

诚如达成三个算法后,大家供给先用二个非常小的数据库来测试它的不错,不然一下子给个大数目给它,它也很难消化吸收,而且还不方便人民群众大家分析代码的灵光。

铁青(黄瓜颜色)

(一)总计已知体周详据汇总的点与日前点时期的离开。

 

4858.com 3

(贰)根据距离递增次序排序。

填补用python落成的代码,要给python装numpy和matplotlib库,提出直接装anaconda,装好了anaconda暗许安装了spyder,里面集成了那七个库,相比较便于。

香艳(金蕉颜色)

(三)选用与近来点距离最小的k个点。

首先,大家新建三个kNN.py脚本文件,文件之中包罗八个函数,贰个用来生成小数据库,二个贯彻kNN分类算法。代码如下:

4858.com 4

(4)显明前k个点所在类别的面世频率。

# -*- coding: utf-8 -*-
from numpy import *
def createDataSet():#创建一个很小的数据库
    group=array([[1.0,0.9],[1.0,1.0],[0.1,0.2],[0.0,0.1]])
    labels=['A','A','B','B']
    return group,labels
#[1.2,1.0]
def kNNClassify(newInput,dataset,labels,k):#knn算法核心
    #先求数据库中每个点到所求点之间的距离
    numSamples=dataset.shape[0] #获取数据库的行数
    diff=tile(newInput,(numSamples,1))-dataset#使用tile函数迭代创建一个numSample行1列的array与dataset做差
    squaredDiff=diff**2#diff中的每一个数都平方
    squaredDist=sum(squaredDiff,axis=1)#每一行两数求和
    distance=squaredDist**0.5#再开方
    #再对距离进行排序
    sortedDistIndices=argsort(distance)#argsort函数对distance中元素从小到大排序,返回序号
    classCount={}
    #统计距离小于等于k的每个点的类别
    for i in xrange(k):
       voteLabel=labels[sortedDistIndices[i]]
       classCount[voteLabel]=classCount.get(voteLabel,0)+1
    maxCount=0              
    #找出离所求点最近的k个点中最多的类别         
    for key,value in classCount.items():
        if maxCount<value:
            maxCount=value
            maxIndex=key
    #返回所求点的类型,算法到此结束
    return maxIndex

樱草黄(西葫芦颜色)

(伍)再次来到前k个点出现频率最高的体系作为当前点的展望分类。

  然后我们在命令行中或在建三个python文件那样测试就能够:

4858.com 5

程序代码:

import kNN
from numpy import *

dataSet,labels=kNN.createDataSet()
testX=array([0,0.05])
k=3
maxIndex=kNN.kNNClassify(testX,dataSet,labels,3)
print maxIndex

代码见下

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.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

  运维程序:此时点[0,0.05]最接近B类。

#!/usr/bin//python
# coding: utf-8

'''
1、获取key和coord_values,样例使用的是list,但是如果真正用在训练上的话list就不适合了,建议改为使用数据库进行读取
2、对坐标进行精度化计算,这个其实我没理解是为什么,可能为了防止错误匹配吧,书上是这样写的
3、指定两个参数,参数一是新加入case的坐标,参数二是需要匹配距离最近的周边点的个数n,这里赢指定单数
4、距离计算,使用欧式距离
  新加入case的坐标与每一个已有坐标计算,这里还有优化空间,以后更新
  计算好的距离与key做成新的key-value
  依据距离排序
  取前n个case
5、取得key
  对前n个case的key进行统计
  取统计量结果最多的key即是新加入case所对应的分组
6、将新加入的values与分组写成key-value加入已有的key-value列队
输入新的case坐标,返回第一步......递归
'''

import operator

def create_case_list():
  # 1代表黄瓜,2代表香蕉,3代表茄子,4代表西葫芦
  case_list = [[25,3,73732],[27.5,8,127492],[13,6,127492],[16,13,50331049],[17,4,18874516],[22,8,13762774],[14,1,30473482],[18,3,38338108]]
  case_type = [1,1,2,2,3,3,4,4]
  return case_list,case_type

def knn_fun(user_coord,case_coord_list,case_type,take_num):
  case_len = len(case_coord_list)
  coord_len = len(user_coord)
  eu_distance = []
  for coord in case_coord_list:
    coord_range = [(user_coord[i] - coord[i]) ** 2 for i in range(coord_len)]
    coord_range = sum(coord_range) ** 0.5
    eu_distance.append(coord_range)
  merage_distance_and_type = zip(eu_distance,case_type)
  merage_distance_and_type.sort()
  type_list = [merage_distance_and_type[i][1] for i in range(take_num)]
  class_count = {}
  for type_case in type_list:
    type_temp = {type_case:1}
    if class_count.get(type_case) == None:
      class_count.update(type_temp)
    else: class_count[type_case] += 1
  sorted_class_count = sorted(class_count.iteritems(), key = operator.itemgetter(1), reverse = True)
  return sorted_class_count[0][0]

def auto_norm(case_list):
  case_len = len(case_list[0])
  min_vals = [0] * case_len
  max_vals = [0] * case_len
  ranges = [0] * case_len
  for i in range(case_len):
    min_list = [case[i] for case in case_list]
    min_vals[i] = min(min_list)
    max_vals[i] = max([case[i] for case in case_list])
    ranges[i] = max_vals[i] - min_vals[i]
  norm_data_list = []
  for case in case_list:
    norm_data_list.append([(case[i] - min_vals[i])/ranges[i] for i in range(case_len)])
  return norm_data_list,ranges,min_vals

def main():
  result_list = ['黄瓜','香蕉','茄子','西葫芦']
  dimension1 = float(input('长度是: '))
  dimension2 = float(input('弯曲度是: '))
  dimension3 = float(input('颜色是: '))
  case_list,type_list = create_case_list()
  #norm_data_list,ranges,min_vals = auto_norm(case_list)
  in_coord = [dimension1,dimension2,dimension3]
  #in_coord_len = len(in_coord)
  #in_coord = [in_coord[i]/ranges[i] for i in range(in_coord_len)]
  #class_sel_result = knn_fun(in_coord,norm_data_list,type_list,3)
  class_sel_result = knn_fun(in_coord,case_list,type_list,3)
  class_sel_result = class_sel_result - 1
  return result_list[class_sel_result]

if __name__ == '__main__':
  a = main()
  print '这货是: %s' %a

代码解释:

 应用:那里大家用kNN来分类2个大点的数据库,包罗数据维度不小和样本数相比多的数据库。那里我们用到一个手写数字的数据库,能够到这里下载。那些数据库包含数字0-九的手写体。每种数字差不多有200个样本。各种样本保持在二个txt文件中。手写体图像本人的高低是3二x3二的2值图,转变来txt文件保留后,内容也是3二x34个数字,0只怕一.

测试结果,效果还不赖

(一)classify0()函数的五个输入参数:inX
用于分类的输入向量,dataSet是输入的练习样本集,labels是标签向量,最终k是用于选择近日邻的数额,在那之中标签向量的成分数目和矩阵dataSet的行数同样。

数据库解压后有八个目录:目录trainingDigits存放的是大要两千个教练多少,testDigits存放大致900个测试数据。

4858.com 6

(二)代码中度量八个目的距离的法子是欧几里得公式:

编写kNN2.py:

                                                                       
                 4858.com 7

 

(三)shape函数是numpy.core.fromnumeric中的函数,它的效应是读取矩阵的尺寸,比方shape[0]不畏读取矩阵第二维度的长短。它的输入参数能够使三个整数表示维度,也得以是一个矩阵。

# -*- coding: utf-8 -*-
from numpy import *
import os
def kNNClassify(newInput,dataset,labels,k):#knn算法核心
    #先求数据库中每个图像与所要分类图像像素值差的平方再开方,用这种计算方法表示距离(相似度)俗称欧氏距离
    numSamples=dataset.shape[0] #获取数据库的行数(即文件夹下的文件数)
    diff=tile(newInput,(numSamples,1))-dataset#使用tile函数迭代创建一个numSample行1列的array与dataset做差
    squaredDiff=diff**2#diff中的每一个数都平方
    squaredDist=sum(squaredDiff,axis=1)#每一行的数求和
    distance=squaredDist**0.5#再开方
    #再对距离进行排序
    sortedDistIndices=argsort(distance)
    classCount={}
    #统计距离为k的每个图像的类别(即统计相似度最小的k个图像所表示的数字)
    for i in xrange(k):  
        voteLabel = labels[sortedDistIndices[i]]  
        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

    maxCount=0            
    #找出离所求图像类别最近的k个图像中最多的类别       
    for key,value in classCount.items():
        if maxCount<value:
            maxCount=value
            maxIndex=key
    #返回所求图像的类型(类型即数字)
    return maxIndex

#函数img2vector把一张32*32的图像转化成一行向量imgVector
def img2vector(filename):
    rows=32
    cols=32
    imgVector=zeros((1,rows*cols))
    fileIn=open(filename)
    for row in xrange(rows):
        lineStr=fileIn.readline()
        for col in xrange(cols):
            imgVector[0,row*32+col]=int(lineStr[col])
    return imgVector

#函数loadDataSet从文件夹中加载多个文件数据,python对文件数据流加载到内存的操作很方便,这里的代码可以仔细理解加记忆一下
def loadDataSet():
    dataSetDir='/home/chao/Desktop/python_work/knn/'
    trainingFileList=os.listdir(dataSetDir+'trainingDigits')
    numSamples=len(trainingFileList)
    train_x=zeros((numSamples,1024))#使用zeros函数为train_x分配numSamples行,每行1024列,每行为一个图像转化后的数据,总共numSamples行
    train_y=[]#用来存放每个图像的真实值
    for i in xrange(numSamples):
        filename=trainingFileList[i]
        train_x[i,:]=img2vector(dataSetDir+'trainingDigits/%s'%filename)
        label=int(filename.split('_')[0])
        train_y.append(label)
    testingFileList=os.listdir(dataSetDir+'testDigits')
    numSamples=len(testingFileList)
    test_x=zeros((numSamples,1024))#同train_x,但这里表示的是测试图像文件的
    test_y=[]
    for i in xrange(numSamples):
        filename=testingFileList[i]
        test_x[i,:]=img2vector(dataSetDir+'testDigits/%s'%filename)
        label=int(filename.split('_')[0])
        test_y.append(label)
    return train_x,train_y,test_x,test_y

#测试预测准确率
def testHandWritingClass():
    print "第一步:加载数据。。。"
    train_x,train_y,test_x,test_y=loadDataSet()

    numTestSamples=test_x.shape[0]#返回待测试图像的个数
    print "数据加载完成"
    matchCount=0#用来表示预测正确的图像的个数
    #每个待测图像都要调用一次knn预测其值
    for i in xrange(numTestSamples):
        print i
        predict=kNNClassify(test_x[i],train_x,train_y,3)#这里k=3准确率达98.63%,如果改成k=1的话会达到98.97%
        if predict==test_y[i]:
            matchCount+=1
    accuracy=float(matchCount)/numTestSamples
    print matchCount#打印正确预测个数
    print "accuracy is:%.2f%%"%(accuracy*100)#打印正确预测准确率

(4)tile函数是模板numpy.lib.shape_base中的函数。函数的样式是tile(A,reps)

 

        A的档案的次序差不离全数品种都能够:array, list, tuple, dict,
matrix以及基本数据类型int, string, float以及bool类型。

测试拾一分简单,编写一个main.py:

        reps的类型也多数,能够是tuple,list, dict, array,
int,bool.但不得以是float, string, matrix类型。行列重复copy的次数。

# -*- coding: utf-8 -*-
import kNN2
kNN2.testHandWritingClass()

(5)sum函数中插足参数。sum(a,axis=0)或然是.sum(axis=一) ,axis=0
便是平日的相加 ;参与axis=一以往便是将2个矩阵的每1行向量相加。

然后运营main.py观看准确率:

(6)argsort函数再次来到的是数组值从小到大的索引值。

933个预测正确
accuracy is:98.63%

 (七)   get() 函数再次来到字典钦赐键的值,若是值不在字典中再次回到暗中认可值。

 版权注解:原版的书文地址

(八)sorted举办排序,sorted(iterable, cmp=None, key=None, reverse=False)

         iterable:是可迭代类型;
         cmp:用于对比的函数,比较什么由key决定;
4858.com,       
 key:用列表成分的某部属性或函数实行作为第三字,有暗许值,迭代集结中的1项;
         reverse:排序规则. reverse = True  降序 或许 reverse = False
升序,有私下认可值。
         重回值:是三个通过排序的可迭代类型,与iterable同样。

三 示例-使用K-近邻算法创新约会网址的配对职能

三.一 图谋数据:从文本文件中分析数据

将待管理数据的格式改造为分类器能够吸收接纳的格式。

代码完毕:

 1 def file2matrix(filename):
 2     fr = open(filename)
 3     numberOfLines = len(fr.readlines())         #get the number of lines in the file
 4     returnMat = zeros((numberOfLines,3))        #prepare matrix to return
 5     classLabelVector = []                       #prepare labels return   
 6     fr = open(filename)
 7     index = 0
 8     for line in fr.readlines():
 9         line = line.strip()
10         listFromLine = line.split('\t')
11         returnMat[index,:] = listFromLine[0:3]
12         classLabelVector.append(int(listFromLine[-1]))
13         index += 1
14     return returnMat,classLabelVector

代码解释:

(一)file二matrix ()函数的参数,filename接收文件名。

(二)open(路径+文件名,读写格局),读写格局:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件。

(3)readlines() 自动将文件内容分析成1个行的列表,该列表能够由 Python
的 for … in … 结构进行拍卖。

(四)len()得到列表中的成分个数。

(伍)zeros(shape, dtype=float,
order=’C’),重临来1个给定形状和品种的用0填充的数组;

         参数:shape:形状

                   dtype:数据类型,可选参数,暗许numpy.float6四

                   dtype类型:t ,位域,如t4代表4位

                                     b,布尔值,true or false

                                     i,整数,如i8(64位)

                                     u,无符号整数,u捌(陆十几人)

                                    f,浮点数,f8(64位)

                                   c,浮点负数,

                                   o,对象,

                                   s,a,字符串,s24

                                   u,unicode,u24

                order:可选参数,c代表与c语言类似,行优先;F代表列优先

(六)strip()
方法用于移除字符串头尾钦命的字符,暗中认可删除空白符(包含’\n’, ‘\r’,
 ‘\t’,  ‘ ‘)。

 (柒)split()便是将三个字符串不一样成八个字符串组成的列表。

叁.二 策动数据:归1化数值

分裂的性格,其数值的取值范围差别,则总结距离时属性的权重就会不恐怕掌握控制。由此,平时使用的艺术是将数值归一化,如将取值范围管理为0到一依然-一到1以内。其通用公式:

newValue = (oldValue-min) /(max-min)

中间min和max分别是数额汇总的微乎其微特征值和最大特征值。

代码完毕:

1 def autoNorm(dataSet):
2     minVals = dataSet.min(0)
3     maxVals = dataSet.max(0)
4     ranges = maxVals - minVals
5     normDataSet = zeros(shape(dataSet))
6     m = dataSet.shape[0]
7     normDataSet = dataSet - tile(minVals, (m,1))
8     normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide
9     return normDataSet, ranges, minVals

叁.3 测试算法:作为完全程序验证分类器

一般把已有个别数据9/10看作战陶冶练样本分类器,其他百分之10数据去测试分类器,核查分类器的正确率。

代码达成:

 1 def datingClassTest():
 2     hoRatio = 0.10      #hold out 10%
 3     datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')       #load data setfrom file
 4     normMat, ranges, minVals = autoNorm(datingDataMat)
 5     m = normMat.shape[0]
 6     numTestVecs = int(m*hoRatio)
 7     errorCount = 0.0
 8     for i in range(numTestVecs):
 9         classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
10         print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
11         if (classifierResult != datingLabels[i]): errorCount += 1.0
12     print "the total error rate is: %f" % (errorCount/float(numTestVecs))
13     print errorCount

测试结果:

4858.com 8

基值误差在伍%,基本能够兑现对结果的估计。

四.行使算法:创设完全可用系统

代码落成:

 1 def classifierPerson():
 2    resultList = [u'不喜欢',u'比较喜欢',u'很喜欢']
 3    percentTats = float(raw_input(u"玩视频游戏所耗时间百分百:"))
 4    ffmiles = float(raw_input(u"每年获得的飞行常客里程数:"))
 5    iceCream = float(raw_input(u"每周消耗的冰淇淋公升数:"))
 6    datingDataMat, datingLables = kNN.file2matrix('datingTestSet2.txt')
 7    normMat,ranges,minVals = kNN.autoNorm(datingDataMat )
 8    inArr = array([ffmiles ,percentTats ,iceCream ])
 9    classifierResult = kNN.classify0((inArr-minVals )/ranges,normMat ,datingLables ,3)
10    print u"你对这个人喜欢度: %s" % resultList [classifierResult -1]

运行结果:

4858.com 9

伍 附-对数码解析的数目可视化

 代码落成:

1 def show_data():
2    dataSet,lables = kNN .file2matrix('datingTestSet2.txt')
3    jieguo = kNN .classify0([2674,8.54,8.0],dataSet ,lables ,10)
4    fig= plt.figure()
5    ax = fig.add_subplot(111)
6    ax.scatter(dataSet [:, 1], dataSet [:, 2],
7               15.0*array(lables ),15.0*array(lables))
8    fig.show()
9    raw_input()

运作结果:

4858.com 10

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有