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
*表示需要做的内容
在这部分的练习中,你需要对之前实现的逻辑回归进行拓展,并将它应用到多元分类中
首先是文件数据导入代码,这段代码文件中已经有了,不需要自己添加
描述一下其中的数据存储形式。
ex3data1.mat中有5000组训练样本,每个样本都是2020像素的灰度数字图像。每个像素的浮点型数值都表示该点的灰度强度。2020的像素网络展开成一个400维的向量存储为矩阵X的一行。所以X的大小是5000*400。
%将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代替。
你将会从可视化训练样本的一个子集开始,在ex3.m的第一部分,代码从矩阵X中随机挑选了100组数据,并将它传入到displayData函数中。displayData函数将每一行映射成20*20的灰度图,并将他们一起显示出来。
你将会使用多重多分类逻辑回归模型建立一个多元分类器。因为有10组(0-9),所以你需要分别训练10个逻辑分类器。为了保证训练效率,你需要确保你的代码能很好的向量化。这一节,你将会实现一个矢量化的逻辑回归,在这个逻辑回归中不需要使用for循环。
我之前写的代码都一直使用向量化,所以只贴了成本函数向量化的部分,理解一下就好。
成本函数:
预测函数:
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;
在这部分的练习中,你将会通过实现多重正则逻辑回归分类器实现多分类,这是针对我们数据集中的每一个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是不能结束的。
对于每一个输入,使用训练好的逻辑回归分类器计算它属于各个分类的概率。预测函数将会选择对于逻辑回归分类器输出概率最高的一个分类,以及作为输入预测的类标签。
代码:
[probability indices] = max(sigmoid(all_theta * X'));
p = indices';
在这部分的练习中,你将会使用和之前相同的训练集实现一个神经网络识别手写数字。神经网络能够表示建立非线性假设的复杂模型。这周,你将会使用我们从一个神经网络训练好的参数。你的目标是使用我们对预测的权重实现一个前向传播算法。
神经网络.一个输入层,一个隐藏层,一个输出层
我们提供了一组已经训练好的神经网络的参数(θ(1),θ(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(无语。。。)。