当前位置:   article > 正文

机器学习作业一:使用k-近邻算法实现手写数字识别(1)+(2)_基于knn手势识别题目

基于knn手势识别题目

一、k-近邻算法

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
在这里插入图片描述
举个例子。如上图所示,假设图中绿色圆形为待分类目标,当K=3时,绿色圆形的最邻近的3个点是2个红色三角形和1个蓝色正方形,因此我们判定绿色的这个待分类点属于红色的三角形一类;当K=5时,绿色圆形的最邻近的5个点是2个红色三角形和3个蓝色正方形,所以在这个条件下我们判定绿色的这个待分类点属于蓝色正方形一类。

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

工作原理:
1.存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
2.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前 k 个最相似的数据,这就是 K 近邻算法中 k 的出处,通常 k 是不大于 20 的整数。最后,选择 k 个最相似数据中出现次数最多的分类,作为新数据的分类。

二、k值的选取及归一化的重要性

1.k值的选取
k值选取过小,则容易发生过拟合,此时我们很容易学习到噪声,也就非常容易判定为噪声类别;k值选取过大,就相当于用较大范围中的训练数据进行预测,这时与待分类目标较远的(不那么相似)训练实例也会起到预测的作用,但这样会使预测发生错误(完全忽略训练数据实例中的大量有用信息)。
2.归一化的重要性
假设有多个特征值时,其中某个特征数量级比较大(如身高/cm),其他特征较小时(鞋码),此时会导致距离的错误计算,分类结果会被特征值所主导,而弱化了其他特征的影响,从而带来错误的预测结果,所以需要对数据进行归一化。

三、k近邻算法的一般流程

1.收集数据:可以使用任何方法
2.准备数据:距离计算所需要的数值,最好是结构化的数据格式(数据量纲不统一时)
3.分析数据:可以使用任何方法(可用python内的Matplotlib库将数据可视化)
4.训练算法:此步骤不适用于 K 近邻算法
5.测试算法:计算错误率
6.使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K 近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理

四、使用KNN进行手写数字识别的步骤

1.收集数据:提供文本文件
2.准备数据:编写函数classify0(),将图像格式转换为分类器使用的list格式
3.分析数据:在python命令提示符中检查数据,确保符合要求
4.训练算法:KNN不适用这步
5.测试算法:编写函数使用提供的部分数据集(已经分类好的数据)作为测试样本,如果预测的结果不同,则标记错误
6.使用算法:本题没有使用

五、主要代码

数据的准备:
将训练数据和测试数据分别以txt文件的形式保存在trainingDigits和testDigits文件夹中,目录trainingDigits中包含了大约2000个例子,每个例子的内容如下图所示,每个数字大约有200个样本;目录testDigits中包含了大约900个测试数据。
在这里插入图片描述
在这里插入图片描述

转换图片格式(32X32的二进制矩阵转成1X1024的向量)

def img2vector(filename)
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32): #32行
        lineStr = fr.readline()    #一次读一行
        for j in range(32):  #32列
            returnVect[0,32*i+j] = int(lineStr[j])
    return returnVect``
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

k-近邻算法

`def classify0(inX
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/1008063
    推荐阅读
    相关标签
      

    闽ICP备14008679号