Coursera_Stanford_ML_ex3_多标度分类和神经网络初步 作业记录

Programming Exercise 3:Multi-class Classi cation and Neural Networks


        这周总结一下Week4的作业,使用Logstic Regression对多类别的数据进行分类,能够使用已经训练好的神经网络对图片里的数字进行识别并分类,总体来说难度较前两周有所提高,不过对于矩阵用的好的同学来说也不算难。

       首先看一下作业要求:



           这周有三个LR文件,一个NN文件需要我们去完成。

一.ex3

       题目大意是在给出的手写数字图片基础上,利用LR对图像中的数字进行分类。

       数据处理:一共有0-9这10个类别,为防止在搜索矩阵时候的越界,将0用10进行替换。给了5000张20x20的图片,数据以像素值的形式存放在ex3data1.mat中,load('ex3data1.mat');直接将每张图片的像素值和类别存放在X和y中,X的矩阵大小为5000x400(每个像素点均作为自变量),y的矩阵大小为5000x1。



       当然这些操作都是已经写好了,不过在我们自己写的时候第一步是至关重要的,直接影响到训练的效果,应该引起我们的重视。

       lrCostFunction.m目的是给出误差函数和梯度函数,因为使用的是Logstic Regression和上一周的一致,所以不再赘述。

       oneVsAll.m目的是训练函数使误差函数达到最小,方法是对每个类别分别进行训练,得出使误差函数的参数,因为在视频中也有讲对多标度分类问题每一类的判断都分为两部分,属于该类别(y=1)以及不属于该类别(y=0)

for c=1:num_labels
    initial_theta = zeros(n + 1, 1);
    
    options = optimset('GradObj', 'on', 'MaxIter', 50);
    
    all_theta(c,:) = fmincg (@(t)lrCostFunction(t, X, (y==c), lambda), initial_theta, options);

end

     

       值得注意的是,fmincg这个函数是Carl Edward Rasmussen 这哥们写的,是一种寻优函数,以后有机会仔细研究一下。在初始化参数时不要忘记加常数项。

       predictOneVsAll.m训练完每个类别的参数,在对新数据进行预测时,选择预测结果最高的类别作为预测结果。

[c,b]=max(sigmoid(X*all_theta'),[],2);
p=b;

       返回每行最大值所在的列,最终的预测精度可以达到95.04%,这比文档中的精度略高,可能跟参数精度的选择有关,选低了可能造成截断误差较大,影响精度。

二.ex3_nn.m 

      



       predict.m神经网络的参数是已经训练好的,只需要完成对新数据的预测即可,不要忘记加调整项(至于为什么要加调整项?神经网络单层结果与逻辑回归相似,类似加了一个截距,最终目的还是使结果达到最优)。

X=[ones(m,1) X];
[c,b]=max(sigmoid([ones(m,1) sigmoid(X*Theta1')]*Theta2'),[],2);
p=b;

      预测精度达到97.52%和文档中的精度相近。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值