matlab编写识别手写数字_不调包的基于matlab的手写数字识别

5f411072af838ef572ad381c41301dad.gif

逻辑回归

(logistic regression)

5f411072af838ef572ad381c41301dad.gif

a7e270b9d03217d6895f4bef369fc4b0.png

    由于以前学习的时候做的笔记都在学校,又不能返校,所以带不回来了。因此我打算把所有的东西都推倒重来,虽然需要很多时间,但是从中也学到了很多的新东西。最近再一次学了logistic regression算法,觉得对这个算法的领悟又上了一个层次。所以决定手写一下这个算法,作为练手的工具,当然是首选matlab和minist数据集了。

    首先说明一下,读取数据的代码不是我写的,是借鉴了别人的。因为用matlab读取数据我不是很熟练(慢慢会熟练的)。

    先说一下整个算法的流程吧,由于这个算法也不是什么新鲜的东西了。大家随便在百度搜一下逻辑回归算法,就会出来一大堆,所以就不做介绍了。

例如:https://www.cnblogs.com/BYRans/p/4713624.html

    再说一下整个程序的编写流程吧。整个过程大概可以分为:数据读取、模型训练、模型准确率测试三个大的步骤。

    1,数据读取:由于minist数据集的存储格式不是专门为matlab准备的,所以需要使用fopen、fread等函数,为了搞懂这个,我还专门下载了几本matlab的书来读。但由于不是今天的中重点,所以就不细说了。当然,读取完数据还要将数据进行reshape,以及feature scaling这样才能输入模型,以及使模型收敛更快。

    2,模型训练:这个部分对我来说是编写代码最难的一部分,不是因为它的算法有多复杂,而是如果你没有使用正确的方法,那么你会被众多的参数特征搞得头皮发麻。好在我在写的时候用了向量化编程法,使得编程变得很简单。

    那么何为“向量化”编程呢?其核心思想是将模型中众多的加法和乘法写成向量的乘法,这样写程序可以减少大量的循环语句。但是,这样写的前提是你要有相当的线性代数功底,要能够洞悉哪些地方可以这样写,哪些地方不能这么写。

    我使用的模型优化方法是gradient descent,具体的细节我也不说了,参考:https://www.cnblogs.com/pinard/p/5970503.html

    我认为最重要的还是向量化编程法,我是参考下面的两张图来写的。

767cdbc1baf8c5ded4fdd5f79f6e8507.png

c94a7bb317bf27f4e7b861907824043b.png

    3,模型准确率测试。上面忘记说了,单个逻辑回归算法是做二分类的,将它用于识别手写数字的关键在于:在训练每一个数字识别的时候,都将该数字视为正类,其余的数字视为负类。比如在训练数字6的时候,将6视为正类,其余0、1、2、3、4、5、7、8、9都视为负类。对每一个数字都训练一个假设函数h(x)或者叫分类器也行,这样就有10个分类器,每个分类器输出的是属于正类的概率。将测试数据分别经过这10个分类器,选概率最大的那个分类器,就认为该输出所对应的“正类”,就是预测的数字。

    所以这一部分的编程如果也按照向量法,是非常简单的。

以上便是大概的编程过程了,细节之处,还需自行动手操作一下才能体会。下面展示一下我的编程结果吧。此外,我将全部代码放到了我的百度云盘,可供诸君下载:

链接:https://pan.baidu.com/s/1br_FY_zTFyCWOPe49tMH8Q 

提取码:3913

minist数据集获取地址:

http://yann.lecun.com/exdb/mnist/

模型准确率:

                      b0a18efb397d36777b7a34d7ac641486.png

                  e8677dfbcb89339b86fd5ca0291c6575.png

            bd784c8ff5d5e7192104522c22f6fc98.png

        fecf7e38a0223dc865118e5fa9653418.png

                f770f1bed5403f3ac2bed8ab18f2aa60.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值