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

来源:互联网 发布:python爬虫框架scrapy 编辑:程序博客网 时间:2024/06/05 19:27

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%和文档中的精度相近。



0 0
原创粉丝点击