xml地图|网站地图|网站标签 [设为首页] [加入收藏]

智能家电

当前位置:美高梅游戏网站 > 智能家电 > k-近邻算法实现手写数字识别系统实验报告

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

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-09-07 02:21

众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。

实验内容来源于实验楼: https://www.shiyanlou.com/courses/777/labs/2621/document
最近,正在学习CS231n的课程内容,翻看实验楼里有没有什么有趣的实验时,偶然发现这个k-近邻算法的实验。想到这不正是CS231n课程中介绍过的吗, 便想着练练手,在cs231n的assignment1中有实现过,本次实验中有提及具体的应用场景,就想试试看。

美高梅游戏官网娱乐,没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格上的确有可能会和同题材的电影相近。

关于k-近邻算法的具体内容可以看cs231n中的笔记。

那么动作片具有哪些共有特征,使得动作片之间非常类似,而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。

实验从电影的分类讲起,介绍了k近邻算法的原理。

美高梅棋牌,这个项目先基于电影中出现的亲吻、打斗出现的次数,使用k近邻算法构造程序,自动划分电影的题材类型。主要是使用电影分类讲解k近邻算法的基本概念,然后学习如何在其他系统上使用k近邻算法。

接下来是代码。

美高梅游戏网站,说明:这个项目源自 图灵教育 的 《机器学习实战》书籍第2章,感谢图灵教育授权实验楼发布。

准备:使用python导入数据

第一部分是关于数据的导入。

from numpy import *
    import operator

    def createDataSet():
        group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        labels = ['A','A','B','B']
        return group, labels
  • k近邻分类算法
  • 从文本文件中解析和导入数据
  • 使用Matplotlib创建扩散图
  • 归一化数值

测试分类器

首先将32*32的图像数据转换成一个向量

from numpy import *

def img2vector(filename):
    # 创建向量
    returnVect = zeros((1,1024))

    # 打开数据文件,读取每行内容
    fr = open(filename)

    for i in range(32):
        # 读取每一行
        lineStr = fr.readline()

        # 将每行前32字符转成int存入向量
        for j in range(32):
            returnVect[0,32*i+j] = int(lineStr[j])

    return returnVect

然后对代码进行分析,

import operator

def classify0(inX, dataSet, labels, k):
    # 获取样本数据数量
    dataSetSize = dataSet.shape[0]

    # 矩阵运算,计算测试数据与每个样本数据对应数据项的差值
    diffMat = tile(inX, (dataSetSize,1)) - dataSet

    # sqDistances 上一步骤结果平方和
    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]

由于numpy具有broadcast的供能,因此代码

diffMat = tile(inX, (dataSetSize,1)) - dataSet

可以替换成:

diffMat = inX - dataSet

最后编写测试程序:

from os import listdir

def handwritingClassTest():
    # 样本数据的类标签列表
    hwLabels = []

    # 样本数据文件列表
    trainingFileList = listdir('digits/trainingDigits')
    m = len(trainingFileList)

    # 初始化样本数据矩阵(M*1024)
    trainingMat = zeros((m,1024))

    # 依次读取所有样本数据到数据矩阵
    for i in range(m):
        # 提取文件名中的数字
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)

        # 将样本数据存入矩阵
        trainingMat[i,:] = img2vector('digits/trainingDigits/%s' % fileNameStr)

    # 循环读取测试数据
    testFileList = listdir('digits/testDigits')

    # 初始化错误率
    errorCount = 0.0
    mTest = len(testFileList)

    # 循环测试每个测试数据文件
    for i in range(mTest):
        # 提取文件名中的数字
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])

        # 提取数据向量
        vectorUnderTest = img2vector('digits/testDigits/%s' % fileNameStr)

        # 对数据文件进行分类
        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)

        # 打印KNN算法分类结果和真实的分类
        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)

        # 判断KNN算法结果是否准确
        if (classifierResult != classNumStr): errorCount += 1.0

    # 打印错误率
    print "nthe total number of errors is: %d" % errorCount
    print "nthe total error rate is: %f" % (errorCount/float(mTest))

总的程序

简单地说,k近邻算法采用测量不同特征值之间的距离方法进行分类。

k-近邻算法

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值型和标称型。

本书讲解的第一个机器学习算法是k-近邻算法,它的工作原理是:

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签。

一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

现在我们回到前面电影分类的例子,使用k近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,图2-1显示了6部电影的打斗和接吻镜头数。

假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用kNN来解决这个问题。

美高梅游戏网站 1此处输入图片的描述

首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,图2-1中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见表2-1。

表2-1 每部电影的打斗镜头数、接吻镜头数以及电影评估类型

美高梅游戏网站 2Paste_Image.png

即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如表2-2所示。此处暂时不要关心如何计算得到这些距离值,使用Python实现电影分类应用时,会提供具体的计算方法。

表2-2 已知电影与未知电影的距离

美高梅游戏网站 3Paste_Image.png

现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到k个距离最近的电影。假定k=3,则三个最靠近的电影依次是He’s Not Really into DudesBeautiful WomanCalifornia Man。k近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

本章主要讲解如何在实际环境中应用k近邻算法,同时涉及如何使用Python工具和相关的机器学习术语。按照1.5节开发机器学习应用的通用步骤,我们使用Python语言开发k近邻算法的简单应用,以检验算法使用的正确性。

k近邻算法的一般流程:

  • 收集数据:可以使用任何方法。
  • 准备数据:距离计算所需要的数值,最好是结构化的数据格式。
  • 分析数据:可以使用任何方法。
  • 训练算法:此步骤不适用于k近邻算法。
  • 测试算法:计算错误率。
  • 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

首先,创建名为kNN.py的Python模块,本章使用的所有代码都在这个文件中。读者可以按照自己的习惯学习代码,既可以按照本书学习的进度,在自己创建的Python文件中编写代码,也可以直接从本书的源代码中复制kNN.py文件。我推荐读者从头开始创建模块,按照学习的进度编写代码。

我们打开 Xfce 终端,创建实验文件夹KNN

cd Codemkdir KNNcd KNNtouch kNN.py

然后我们先来安装 NumPy 模块。

sudo pip install numpy

随后我们就可以使用 vim 或者 sublime 对我们的 kNN.py文件进行编辑。在kNN.py文件中增加下面的代码:

 from numpy import * import operator def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group, labels

在上面的代码中,我们导入了两个模块:第一个是科学计算包NumPy;第二个是运算符模块,k近邻算法执行排序操作时将使用这个模块提供的函数,后面我们将进一步介绍。

然后保存kNN.py文件,确保我们在 kNN.py 文件的路径下(/home/shiyanlou/Code/KNN),在 Xfce 终端内输入ipython,进入Python交互式开发环境。

进入Python开发环境之后,输入下列命令导入上面编辑的程序模块:

本文由美高梅游戏网站发布于智能家电,转载请注明出处:k-近邻算法实现手写数字识别系统实验报告

关键词:

上一篇:学会数据分析还得看这4个实战项目!

下一篇:没有了