gezp

  • 4

    获得赞
  • 2

    发布的文章
  • 0

    答辩的项目

【多元逻辑回归分类】基于matlab的MNIST实践

机器学习

最后更新 2020-04-17 16:51 阅读 11799

最后更新 2020-04-17 16:51

阅读 11799

机器学习

一、多元逻辑回归原理

1.1 多元逻辑回归问题

二元分类问题与多元分类问题如下图所示:

image.png

One-vs-all(one-vs-rest): 对于多类分类问题,可以将其看做成二类分类问题:保留其中的一类,剩下的作为另一类。例如:

image.png1.2 多元逻辑回归常用步骤
1.2.1 构造预测函数

 Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),使用Sigmoid函数,可以将任意实数映射到[0,1]区间,这样使用0.5作为阈值,可以利用回归方法解决分类问题,Sigmoid函数形式为:

image.png Sigmoid 函数的图像为“S”形,如下图所示:  

image.png    对于分类问题,确定决策边界(也叫分类边界),是非常重要的,下面左图是一个线性的决策边界,右图是非线性的决策边界。  

image.png

对于线性边界的情况,边界形式如下:

image.png构造预测函数为: 

image.png函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:  

image.png

1.2.2 构造损失函数J

Cost函数和J函数如下,

image.png它们是基于最大似然估计推导得到的。综合上述两式得 

image.png 

下面详细说明推导的过程: 将(1)式(1.2.1节最后)综合起来可以写成:

image.png取似然函数为:

image.png对数似然函数为:

image.png最大似然估计就是求使 l(θ) 取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求的最佳参数。但是,在Andrew Ng的课程中将取为下式,即:

image.png因为乘了一个负的系数-1/m,所以J(θ)取最小值时的θ为要求的最佳参数。         


1.2.3 梯度下降法求的最小值

θ更新过程: 

image.png经过化简,θ更新过程可以写成: 

image.png

二、基于Matlab的MNIST手写数字实验

2.1 输入输出数据处理

数据来自THE MNIST DATABASEof handwritten digits网站(http://yann.lecun.com/exdb/mnist),含60000行训练集和10000行的测试数据集(mnist.test)。每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。图片设为“xs”,把这些标签设为“ys”。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是 mnist.train.images ,训练数据集的标签是 mnist.train.labels。

每一张图片包含28像素X28像素。可以用一个数字数组来表示这张图片,把这个数组展开成一个向量,长度是 28x28 = 784。从这个角度来看,MNIST数据集的图片就是在784维向量空间里面的点, 并且拥有比较复杂的结构。 在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值在0-255之间,归一化后,值介于0和1之间。

相对应的MNIST数据集的标签是介于0到9的数字,用来描述给定图片里表示的数字,为了方便训练,需要对输出 one-hot 编码 ,使标签数据是"one-hot vectors"。一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。所以在此教程中,数字n将表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。因此, mnist.train.labels 是一个 [60000, 10] 的数字矩阵。

2.2 假设模型的选择

采用逻辑回归模型 h(w)=g(w’X+b),其中g(z)=1/(1+exp(z));  x为输入数据,28*28=784*1维数的向量 。   

2.3 算法实现过程

%%加载训练数据===============================
Load data;
%加载图片,784*60000的矩阵,表示60000张图片
train_images=data.train_images;
%加载标签数据,表示60000*1的矩阵,表示60000个标签
train_labels=data.train_images;
%%训练过程================================
%初始化参量w,b
w=zeros(784,10);
b=zeros(10,1);
%进行10次逻辑回归训练得到多个参量,再进行组装
for (i=1 to 10)
{
    %两类逻辑分类训练,k为迭代次数,a为学习速率
    [w1,b1]=BinLogistRrgressionTrain( train_images,train_labels,k,a);
  w=joint(w,w1);
  b=joint(b,b1);
} 
%%仿真测试===========================
y=predict(test_images,w,b);
s=test(y,test_labels);%测试正确率


三、实验结果与数据分析

3.1 训练数据个数对准确率的影响 

在迭代次数k=200,学习速率为a=0.5时的测试数据 

image.png由图可知,随着训练数据的增多,训练准确率也在增加,当训练数据很小时,准确率增加幅度较大,当训练数据很大时,准确率增长幅度减缓。但随着数据量的增加,计算量增加,训练时间也会增加。由此,可以选择训练数据量n=2000以上比较合适。 

3.2 学习速率对准确率的影响

在训练数据为n=1000,迭代次数k=200时的测试数据

image.png由图可知,当学习速率a<1时,随着学习速率a的增大,训练准确率也在增加,当学习速率啊a>1时,准确率幅度变化不大,轻微波动。由此,可以选择学习速率a=1左右比较合适。

3.3 迭代次数对准确率的影响

在训练数据为n=1000,学习速率a=0.5,a=1时的测试数据

image.png由图可知,学习速率不同时,迭代次数的效果不同,当迭代次数k<300时,随着迭代次数k的增大,训练准确率也在增加,当学习速率啊k>300时,准确率幅度变化不大,甚至降低。由此,可以选择迭代次数k=300左右比较合适。

3.4 总结及选择合适参数 

image.png

参考上述参数建议,选取一下几组数据进行训练与测试 由此可以选择参数训练数据个数n=6000,学习速率a=1,迭代次数k=200进行训练.。

3.5 本次实验结论及心得     

通过采用简单的多类逻辑回归分类模型,使手写数字识别的准确率达到了89.2%,尽管不是很高,但也基本上实现了一个简单图像识别的功能,学到了一些经验,如,当要适当减少迭代次数以加快训练时间,可以适当增加学习速率,以至于准确率不会降低太多。

其次在该过程中,也遇到了不少问题,如当训练样本过多时(总训练样本有60000),训练时间太长,不能迅速得到模型,这是该方法的一个弊端。  


参考资料:

  • coursera课程:《机器学习》(由斯坦福大学Andrew NG讲授)
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://flyai.com/article/394
讨论
500字
表情
发送
删除确认
是否删除该条评论?
取消 删除