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

5f411072af838ef572ad381c41301dad.gif

逻辑回归

(logistic regression)

5f411072af838ef572ad381c41301dad.gif

matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第1张图片

    由于以前学习的时候做的笔记都在学校,又不能返校,所以带不回来了。因此我打算把所有的东西都推倒重来,虽然需要很多时间,但是从中也学到了很多的新东西。最近再一次学了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

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

matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第2张图片

matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第3张图片

    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/

模型准确率:

                      matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第4张图片

                  matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第5张图片

            matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第6张图片

        matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第7张图片

                matlab编写识别手写数字_不调包的基于matlab的手写数字识别_第8张图片

你可能感兴趣的:(matlab编写识别手写数字,reshape函数matlab,分位数回归的matlab程序,手写数字识别mnist下载,投入产出模型matlab代码)