机器学习---编程练习(三):多元分类和神经网络

机器学习—编程练习(三):多元分类和神经网络

文件列表

ex3.m - Octave/MATLAB script that steps you through part 1
ex3 nn.m - Octave/MATLAB script that steps you through part 2
ex3data1.mat - Training set of hand-written digits
ex3weights.mat - Initial weights for the neural network exercise
submit.m - Submission script that sends your solutions to our servers
displayData.m - Function to help visualize the dataset
fmincg.m - Function minimization routine (similar to fminunc)
sigmoid.m - Sigmoid function
[*] lrCostFunction.m - Logistic regression cost function
[*] oneVsAll.m - Train a one-vs-all multi-class classifier
[*] predictOneVsAll.m - Predict using a one-vs-all multi-class classifier
[*] predict.m - Neural network prediction function
*表示需要做的内容

1 多元分类

在这部分的练习中,你需要对之前实现的逻辑回归进行拓展,并将它应用到多元分类中

1.1 数据

首先是文件数据导入代码,这段代码文件中已经有了,不需要自己添加
文件导入
描述一下其中的数据存储形式。

ex3data1.mat中有5000组训练样本,每个样本都是2020像素的灰度数字图像。每个像素的浮点型数值都表示该点的灰度强度。2020的像素网络展开成一个400维的向量存储为矩阵X的一行。所以X的大小是5000*400。
在这里插入图片描述

1.1.1补充知识:矩阵向量化及恢复

在这里插入图片描述

%将3个矩阵组成一个长向量
thetaVec = [Theta1(:); Theta2(:); Theta3(:);];
%A(:):将矩阵A中的每列合并成一个长的列向量
Dvec = [D1(:); D2(:); D3(:);];

%将长向量恢复成矩阵
Theta1 = reshape(thetaVec(1:100), 10, 11);
Theta2 = reshape(thetaVec(111:220), 10, 11);
Theta3 = reshape(thetaVec(221:231), 1, 11);

训练集的第二部分是包含训练集标签的5000维的向量y。

并且为了与Matlab/Octave保持一致,输入的数字0以10代替。

1.2 可视化数据

你将会从可视化训练样本的一个子集开始,在ex3.m的第一部分,代码从矩阵X中随机挑选了100组数据,并将它传入到displayData函数中。displayData函数将每一行映射成20*20的灰度图,并将他们一起显示出来。
在这里插入图片描述

1.3 逻辑回归向量化

你将会使用多重多分类逻辑回归模型建立一个多元分类器。因为有10组(0-9),所以你需要分别训练10个逻辑分类器。为了保证训练效率,你需要确保你的代码能很好的向量化。这一节,你将会实现一个矢量化的逻辑回归,在这个逻辑回归中不需要使用for循环。

1.3.1 成本函数向量化

1.3.2 梯度向量化

1.3.3 正方逻辑回归向量化

我之前写的代码都一直使用向量化,所以只贴了成本函数向量化的部分,理解一下就好。

成本函数:
在这里插入图片描述
预测函数:
在这里插入图片描述
S函数g(z)
在这里插入图片描述
如果设
在这里插入图片描述
计算矩阵间的乘积Xθ
在这里插入图片描述
这样就可以对所有样本计算θTx(i) ,并且只需要1行代码。

这个方法我一直在用,如果使用前不思考一下也容易发生错误。具体的错误和替代方法我在
(练习二)中有说明。
练习二的costFunctionReg.m的代码这里可以直接用

theta_grad = theta;
theta_grad(1) = 0;

h = sigmoid(X*theta);
J = 1/m.*(-y' * log(h) - (1 - y)' * log(1 - h)) + lambda./(2*m).*theta'*theta;
grad = 1/m*(X'*(h - y)) + (lambda/m)*theta_grad;

1.4 多分类

在这部分的练习中,你将会通过实现多重正则逻辑回归分类器实现多分类,这是针对我们数据集中的每一个K类的。在手写数据集中,K = 10,但是你的代码应该能在K等于任意值的情况下工作。

这里需要注意一下返回值
返回的θ是一个K*(N+1)矩阵,其中第一列是分类标签。

将下面代码粘贴到oneVsAll.m中就行了

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';
	
endfor
%这里不知道怎么回事我写的for···end也能运行,得出的没一类的成本函数值是一样的。在Octave中for循环的结束语是forend
%end是不能结束的。

1.4 多分类预测

对于每一个输入,使用训练好的逻辑回归分类器计算它属于各个分类的概率。预测函数将会选择对于逻辑回归分类器输出概率最高的一个分类,以及作为输入预测的类标签。

代码:

[probability indices] = max(sigmoid(all_theta * X'));
p = indices';

2 神经网络

在这部分的练习中,你将会使用和之前相同的训练集实现一个神经网络识别手写数字。神经网络能够表示建立非线性假设的复杂模型。这周,你将会使用我们从一个神经网络训练好的参数。你的目标是使用我们对预测的权重实现一个前向传播算法。

2.1 模型表示

神经网络.一个输入层,一个隐藏层,一个输出层
在这里插入图片描述
我们提供了一组已经训练好的神经网络的参数(θ(1),θ(2))。

2.2 前向传播与预测函数

将代码贴到 predict.m


X = [ones(m, 1) X];
z_2 = X*Theta1';
a_2 = sigmoid(z_2);

a_2 = [ones(m, 1) a_2];
z_3 = a_2*Theta2';
[probability indices] = max(sigmoid(z_3)');
p = indices';

然后97.5%的准确率,这图识别的是8(无语。。。)。

在这里插入图片描述
换了一个5
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值