《机器学习实战》个人学习记录笔记(三)———k-近邻算法实战之sklearn手写数字识别

原创 2018年04月15日 18:15:05

第二章 k-近邻算法

PS:个人笔记 根据《机器学习实战》这本书,Jack-Cui的博客,以及深度眸的视频进行学习

1. Sklearn实现k-近邻算法

sklearn.neighbors.KNeighborsClassifier就可以是实现上小结,我们实现的k-近邻算法。KNeighborsClassifier函数一共有8个参数。

KNneighborsClassifier参数说明:

⭐⭐n_neighbors:默认为5,就是k-NN的k的值,选取最近的k个点。


⭐⭐weights:默认是uniform,参数可以是uniform、distance,也可以是用户自己定义的函数。uniform是均等的权重,就说所有的邻近点的权重都是相等的。distance是不均等的权重,距离近的点比距离远的点的影响大。用户自定义的函数,接收距离的数组,返回一组维数相同的权重。

algorithm:快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。ball tree是为了克服kd树高纬失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。

leaf_size:默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。需要根据问题的性质选择最优的大小。

metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度量)。

p:距离度量公式。在上小结,我们使用欧氏距离公式进行距离度量。除此之外,还有其他的度量方法,例如曼哈顿距离。这个参数默认为2,也就是默认使用欧式距离公式进行距离度量。也可以设置为1,使用曼哈顿距离公式进行距离度量。

metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。

n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。如果为-1,那么CPU的所有cores都用于并行工作。

import numpy as np
from os import listdir
from sklearn.neighbors import KNeighborsClassifier as kNN

"""
函数说明:将32x32的二进制图像转换为1x1024向量。

Parameters:
    filename - 文件名
Returns:
    returnVect - 返回的二进制图像的1x1024向量
"""
def img2vector(filename):                             #这一步骤就是数据的预处理,
    returnVect = np.zeros((1, 1024))                  #创建1x1024零向量,就是变成(1,1024)的数组
    fr = open(filename)
    for i in range(32):                               #每一行的前32个元素依次添加到returnVect中
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0, 32*i+j] = int(lineStr[j])   #返回转换后的1x1024向量
    return returnVect

"""
函数说明:手写数字分类测试

Parameters:
    无
Returns:
    无
"""
def handwritingClassTest():
    hwLabels = []                                       #测试集的Labels,后面用来比对计算错误率
    trainingFileList = listdir('trainingDigits')        #listdir()是返回目录下的文件名
    m = len(trainingFileList)                           #返回文件夹下文件的个数
    trainingMat = np.zeros((m, 1024))                   #初始化训练的Mat矩阵,测试集,就是批量处理
    for i in range(m):                                  #从文件名中解析出训练集的类别
        fileNameStr = trainingFileList[i]               #获得文件的名字;是为了下一步获取每个文件的数字类别
        classNumber = int(fileNameStr.split('_')[0])    #获得分类的数字;因为分隔后的第一个是代表类别的数字
        hwLabels.append(classNumber)                    #将获得的类别添加到hwLabels中
        trainingMat[i,:] = img2vector('trainingDigits/%s' % (fileNameStr))    #将每一个文件的1x1024数据存储到trainingMat矩阵中,trainingMat最后是m行1024列的矩阵
    neigh = kNN(n_neighbors = 3, algorithm = 'auto')    #构建kNN分类器;第一个指标就是K,第二个指标就是自动搜索适合的算法
    neigh.fit(trainingMat, hwLabels)                    #拟合模型, trainingMat为测试矩阵,hwLabels为对应的标签;这两步就是之前定义的classify那个函数的作用
    testFileList = listdir('testDigits')                #返回testDigits目录下的文件列表   同样也要对测试集进行相同的处理
    errorCount = 0.0                                    #错误检测计数
    mTest = len(testFileList)                           #测试数据的数量
    for i in range(mTest):                              #从文件中解析出测试集的类别并进行分类测试  
        fileNameStr = testFileList[i]                   #获得文件的名字
        classNumber = int(fileNameStr.split('_')[0])    #获得分类的数字
        vectorUnderTest = img2vector('testDigits/%s' % (fileNameStr))    #获得测试集的1x1024向量,用于训练
        classifierResult = neigh.predict(vectorUnderTest)    #获得预测结果;# classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
        print("分类返回结果为%d\t真实结果为%d" % (classifierResult, classNumber)) 
        if(classifierResult != classNumber):
            errorCount += 1.0
    print("总共错了%d个数据\n错误率为%f%%" % (errorCount, errorCount/mTest * 100))


if __name__ == '__main__':
    handwritingClassTest()







实现具有动态主机IP的域名解析

[ 作者: wenhuah   添加时间: 2001-5-2 12:24:33 ]来源:www.chinaaid.com.cn目的利用一台INTERNET DNS HOST 将域名定向到家中(个人)的...
  • ju_feng
  • ju_feng
  • 2002-03-27 08:51:00
  • 630

k-近邻算法实现手写数字识别系统

k-近邻算法实现手写数字识别系统 一、实验介绍 1.1 实验内容 本实验将会从电影题材分类的例子入手,详细讲述k-近邻算法的原理。在这之后,我们将会使用该算法实现手写数字识别系统。 1.2 课...
  • oxuzhenyi
  • oxuzhenyi
  • 2017-03-26 15:48:41
  • 1832

机器学习实战(第2章 k-近邻算法)

机器学习实战(第2章 k-近邻算法)
  • jichun4686
  • jichun4686
  • 2017-07-22 10:24:28
  • 556

《机器学习实战》读书笔记2:K-近邻(kNN)算法 & 源码分析

声明:文章是读书笔记,所以必然有大部分内容出自《机器学习实战》。外加个人的理解,另外修改了部分代码,并添加了注释1、什么是K-近邻算法?简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类。...
  • Artprog
  • Artprog
  • 2017-02-03 00:43:27
  • 1697

Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)

本文将从k-邻近算法的思想开始讲起,使用python3一步一步编写代码进行实战训练。并且,我也提供了相应的数据集,对代码进行了详细的注释。除此之外,本文也对sklearn实现k-邻近算法的方法进行了讲...
  • c406495762
  • c406495762
  • 2017-07-15 16:04:39
  • 27914

《机器学习实战》笔记之二——K-近邻算法

第二章 K-近邻算法 K-近邻算法从文本文件中解析和导入数据使用Matplotlib创建扩展图归一化数值 2.1 k-近邻算法概述 工作原理: 存在一个样本数据集合,并且样本集中每个数据都存在标...
  • u010454729
  • u010454729
  • 2015-09-02 20:12:15
  • 1679

代码注释:机器学习实战第2章 k-近邻算法

在学习的过程中发现书中很多代码并没有注释,这对新入门的同学是一个挑战,特此贴出我对代码做出的注释,仅供参考,欢迎指正。...
  • da_da007
  • da_da007
  • 2017-03-18 17:21:21
  • 575

python3.5《机器学习实战》学习笔记(一):k近邻算法

转载请注明作者和出处:http://blog.csdn.net/u013829973 系统版本:window 7 (64bit) python版本:python 3.5 IDE:Spyder ...
  • u013829973
  • u013829973
  • 2017-09-12 11:10:41
  • 778

机器学习实战之02-k近邻算法全部源代码+测试数据+详细注释

  • 2015年11月08日 14:33
  • 686KB
  • 下载

机器学习实战——使用K-近邻算法识别手写数字

使用K-近邻分类器构造手写识别系统,手写数字图片已经经过处理成为文本文件,如下所示: 每张图片都是32像素X32像素 首先,我们要把每个输入的文本文件转换KNN算法(前面的KNN算法实践已...
  • kelvinLLL
  • kelvinLLL
  • 2017-03-25 21:45:33
  • 423
收藏助手
不良信息举报
您举报文章:《机器学习实战》个人学习记录笔记(三)———k-近邻算法实战之sklearn手写数字识别
举报原因:
原因补充:

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