编程作业 3: Multi-class Classification and Neural Networks

记录机器学习第3次编程作业的解题思路,通过这次的练习,你可以使用logistic regression和neural networks来进行手写数字识别。

Part 1. Multi-class Classification

1. Training Set 说明

ex3data1.mat中存放的是Multi-class Classification使用的Training Set,包含了X和y两个值,使用MATLAB打开后显示如下图:

ex3data1.mat

在ex3.m中,会调用load来加载ex3data1.mat中的数据

load('ex3data1.mat')

X中包含了5000个样本,每个样本代表1个数字,1个数字由20 * 20 的像素组成,代表一个灰度图像,每一个像素用一个浮点数表示。一个样本为400 * 1的行向量,因此,整个输入样本的维度是5000 * 400。

ex3.pdf中对X的描述

y中表示的是对应样本X表示的数字是多少,其中数字0被标记为10,数字1到9被标记为1到9,y的维度为5000 * 1

ex3.pdf中对y的描述

2. 可视化数据

在ex3.m中会调用displayData可以将由20 * 20 的像素点组成的数字绘制出来

ex3.m中调用displayData绘制数字

随机选择100个样本进行绘制,效果图如下:

随机选择100个样本进行显示

当然,我们可以绘制所有的5000个数字,displayData传入X作为参数即可,由于数据量太大了,每个数字会被缩小显示,点击Z+可以放大图像。

>displayData(X);
显示所有的样本

放大后的效果为下图所示,我们可以看到一个数字都有对应有很多种形状,即Multi-class Classification中的OneVsAll。

放大图片

3. lrCostFunction

和编程作业2的costFunctionReg实现代码一样

temp = theta(2:length(theta));
J = sum((-y).*log(sigmoid(X*theta)) - (1-y).*log(1 - sigmoid(X*theta)))/m + (lambda/(2*m))*sum(temp.^2);

for i=1:size(X,2)
    grad(i) = ((sigmoid(X*theta) - y)'*X(:,i))/m;
end

grad = grad + [0;((lambda/m)*temp)];

4. oneVsAll

这道题在注释里面有一段提示可以参考

Example Code for fmincg

实现代码如下:

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

5. predictOneVsAll

首先,传入的all_theta是通过oneVsAll得到的,all_theta是一个 10 * 401的矩阵,一共10行,每一行代表一个数字,一共10个数字。

function p = predictOneVsAll(all_theta, X)

为了更容易理解算法的实现,我会把计算过程中得到的关键值保存为.mat格式的文件,下图为all_theta的值。

all_theta.mat

通过all_theta,我们可以计算出一个temp矩阵,维度为5000*10,每一行代表一个样本,一共5000个样本,每一列表示成为该num_labels的概率,num_labels值等于列值。

temp = zeros(size(X, 1), num_labels);
for i=1:num_labels,
    temp(:,i) = sigmoid(X*(all_theta(i,:)'));
end

例如:第一行第二列的值为0.0003518171008132601,表示第一个样本是数字2的概率为0.0003518171008132601。第一行中数值最大的是第10列,即:0.999561625035584,说明第一个样本最有可能对应的num_labels为10代表的数字,预测输出为10。

temp矩阵

因此,p的计算过程为:找出每一行的最大值的index,即为预测值输出值。

for i=1:m,
[x, ix] = max(temp(i,:));
p(i) = ix;
end

通过上面的代码计算得到的p的值,是一个5000 * 1的向量

p

完整实现代码如下:

predictOneVsAll

Part 2. Neural Networks

predict

第二部分只需要实现predict函数,predict传入的参数Theta1和Theta2,是从ex3weights.mat中加载来的,X仍然来自ex3data1.mat。

ex3weights.mat
ex3weights.mat
Neural network model.
X = [ones(m, 1) X];

z2 = X*Theta1';
a2 = sigmoid(z2);
a2 = [ones(size(a2, 1), 1) a2];

z3 = a2*Theta2';
a3 = sigmoid(z3);

再使用和predictOneVsAll一样的取最大值方法

for i=1:m,
[x, ix] = max(a3(i,:));
p(i) = ix;
end

完整实现代码

predict

提交以后完成本次作业

submit
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容