机器学习-mnist kNN算法识别(python)

本文详细介绍了k近邻(kNN)算法,并通过一维和二维数据直观解释算法原理。接着,文章实现了kNN算法识别MNIST手写数字图像,并展示了在不同测试样本上的错误率,以此说明kNN算法在图像识别中的应用。
摘要由CSDN通过智能技术生成

方以类聚,物以群分  

                                             ---周易·系辞上》

 

测试环境:python3.6、win7 32bit、x86。

在上一篇文章中介绍了mnist数据的格式,以及用python如何读取mnist数据并转化成numpy格式的数据(https://blog.csdn.net/eleclike/article/details/79968574),本文将从机器学习众多算法中比较直观易于理解的kNN(k近邻)算法介绍如何识别mnist图片。

 

1  什么是kNN

 

将待测试的数据每个特征和训练样本数据的每个特征进行比较,然后提取k个最邻近的训练样本数据,统计这k个训练样本数据的分类标签,其中出现次数最多的标签所表示的类别就是待测试数据的类别。kNN的含义就是k个最相近的“邻居”。这里面怎么进行每个特征的比较就会有很多种方法,其中比较常用的就是距离值。

 

1.1 一维数据的kNN

通常一个样本数据有很多个特征值,比如一张图片少则几百个像素,多则几万个像素,而人脑在处理3维以上空间(3个多的特征)时,需要脑补的画面比较多,直观理解起来比较困难,一般需要借助数学工具来抽象表达,而在处理一维和二维空间时就会得心应手的多。下面先以最直观的一维数据来看看kNN算法是个什么样子的,这时的样本就只有1个特征,最后我们再扩展到高维空间。

下图中在一条直线上有A类标签的3个训练样本,它们的特征值分别为x0=2,x1=3,x2=4,B类标签的训练样本有4个,它们的特征值分别为x3=10,x4=11,x5=12,x6=14,在这个训练集中共有7个样本,现在有一个待测试对象,它的值为x=6。它应该被分类为A还是B呢?

 


计算x=6与其他7个点的直线距离,分别为x-x0=4,x-x1=3,x-x2=2  x-x3=4,x-x4=5,x-x5=6,x-x6=8,得到了7个距离值,将这7个距离值从小到大排序得到训练样本顺序为A,A,A(或者B),B(或者A),B,B,B。

如果取k=1,最近的1个邻居为A,所以x属于类别A。

如果取k=2,最近的2个邻居都是A,所以x属于类别A。

如果取k=3,最近的3个邻居中3个A,或者2个A和1个B,A的类别超过50%,所以x的类别还是A。

如果取k=4,最近的4个邻居中3个A,1个B,A的类别超过50%,x的类别还是A。

如果取k=5,最近的5个邻居中3个A,2个B,x类别为A。

如果取k=6,最近的6个邻居中3个A,3个B,x的类别可以为A,也可以为B。

如果取k=7,最近的7个邻居在4个B,3个A,x的类别变成了B。

 

从上面的k取值可以得到一些经验:

1)k值越接近样本数,类别就和直观上看到的结果相反了,所以在选择k值时应与样本数相比要足够小;

2)如果k的值为偶数,有可能出现了类别各占一半的情况,需要加入判别机制。

 

1.2 二维数据的kNN

  • 11
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值