加载中…
个人资料
雨林木风博客
雨林木风博客
  • 博客等级:
  • 博客积分:0
  • 博客访问:549
  • 关注人气:15
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

机器学习实战-手写数字识别

(2017-01-09 11:25:22)
标签:

机器学习

knn算法

python

分类: 人工智能和大数据
       用K-近邻算法来进行手写数字的识别,K-近邻算法也叫KNN算法。
KNN算法原理
      KNN算法是机器学习的一个算法,简单的说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。原理是:存在一个样本数据集合,也称做训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本集中前k个最相似的数据,这就是k-近邻算法中的k的出处,通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。

KNN算法流程
     KNN算法可以对电影进行分类,电影分类是按照题材进行分类的,比如电影中有动作片和爱情片。那么怎么去区分一部电影是爱情片或者动作片呢?很明显的特点就是,动作片中有打斗场景,爱情片中有接吻场景,但是仅仅靠这点是无法准确进行分类的。因为动作片中也会有接吻场景,爱情片中也可能会有打斗场景,但是我们可以肯定爱情片中的接吻场景比较多,动作片中打斗场景也比较多,所以根据接吻和打斗的次数比较来对一部未进行分类的电影进行分类。有好事者对一部分电影进行了统计。

电影名称                                          打斗镜头                接吻镜头                     电影类型
California Man                                    3                         104                            爱情片
He's Not Really into Dudes                 2                         100                            爱情片
Beautiful Woman                                1                           81                            爱情片
Kevin Longblade                                101                        10                             动作片
Robo Slayer 3000                                99                          5                              动作片
Amped ll                                              98                          2                              动作片
?                                                         18                         90                             未知
注:?是待分类的电影

已知电影与未知电影的距离

电影名称                                                   与未知电影的距离
California Man                                                 20.5
He's Not Really into Dudes                             18.7
Beautiful Woman                                             19.2
Kevin Longblade                                             115.3
Robo Slayer 3000                                            117.4
Amped ll                                                          118.9
按照距离递增排序,可以找到K个距离最近的电影。假定k=4,则最靠近的电影是He's Not Really into Dudes Beautiful Woman California Man、Kevin Longblade ,其中有三个爱情片,一个动作片,少数服从多数,所以就把?分成了爱情片,一次完整的KNN算法流程已经走完了。

KNN算法进行手写数字的识别

运行环境:Python 2.7,OpenCV3.0.1
手写数字图片集合:我们采用opencv自带的这张2000*1000的图片进行手写数字的识别,里边共有5000个数字,每个数字占用20*20个像素,0-9这10个数字分别有500张,可以清楚看到每个数字都是占5行,其中一行有100个数字,我们准备用每个数字的5行的每一行的前50个作为训练数据(5*50=250),后50个作为测试(5*50=250)
                                                       digits.png
Python代码:
(我截图的目的是为了界面的美观性,也为了让读者亲自把代码敲一遍,更好的去理解KNN)
http://s6/mw690/005NemkAzy77QvOCXuBe5&690
说明识别的正确率是91.76,读者可以尝试把k改成其他的正整数去实验一下,我把k=4运行了一下是91.92。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有