吴恩达机器学习第四周学习笔记及编程作业答案
⼀、理论基础
1. 神经⽹络
⾮线性假设
当特征太多时,计算的负荷会⾮常⼤,这时可以使⽤⾮线性的多项式项,能够帮助我们建⽴更好的分类模型。
1.1 模型表⽰
第⼀层成为输⼊层(Input Layer),最后⼀层称为输出层(Output Layer),中间⼀层成为隐藏层(Hidden Layers)。我们为每⼀层都增加⼀个偏差单位(bias unit),偏差单元的值为1
ai(j)代表第j层的第i个激活单元。θ(j)代表从第j层映射到第j+1层时的权重的矩阵,例如 (1)代表从第⼀层映射到第⼆层的权重的矩阵。
其尺⼨为:以第 + 1层的激活单元数量为⾏数,以第 层的激活单元数加⼀为列数的矩阵。例如:上图所⽰的神经⽹络中 (1)的
尺⼨为3*4。
对于上图所⽰的模型,激活单元和输出分别表达为:
每⼀个 都是由上⼀层所有的 和每⼀个 所对应的决定的
我们把这样从左到右的算法称为前向传播算法(FORWARD PROPAGATION )
神经⽹络表⽰ AND 函数:
所以可以得出AND函数:
OR 函数:
⼆、编程作业
(⼀)逻辑回归解决多分类问题
1.lrCostFunction.m(Logistic regression cost function): modify your code in lrCostFunction to account for regularization. Once again, you should not putany loops into your code.
(unregularized) logistic regression cost function:
regularized logistic regression cost function:
正则逻辑回归成本的偏导数:
Sigmoid function:
注:在这个等式中,我们使⽤了这样⼀个事实:如果a和b是向量,则有:
function [J, grad] = lrCostFunction(theta, X, y, lambda)
% Initialize some useful values
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));
%分别计算出代价值J和梯度grad,后部的theta平⽅⾥⾯theta(0)是不参与的,故在程序中theta(1)是不参与的
J = 1 / m * ( -y' * log(sigmoid( X * theta )) - (1 - y)' * log(1 - sigmoid( X * theta ))) + lambda/(2*m)*(theta'*theta -theta(1)^2);
grad = 1 / m * (X' * (sigmoid(X*theta) - y));
temp = theta;
temp(1) = 0;
grad = grad + lambda/m * temp;
grad = grad(:);
end
function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1);%⾏
n = size(X, 2);%列
all_theta = zeros(num_labels, n + 1); %num_labels为分类器个数,N+1为参数个数,为训练1-10个便
签,所以需要矩阵为10*n+1,本题为10×401
% Add ones to the X data matrix
X = [ones(m, 1) X];%在原有矩阵前⾯附加⼀列1的向量,因为有常数项,5000×401
%fminunc是⼀个优化求解器,它可以到⼀个未约束函数的最⼩值
%本题运⽤了fmincg()函数求参数,与函数fminunc()相⽐,处理属性过多时更⾼效!
initial_theta=zeros(n+1,1);%模型参数θ的初始值
%'GradObj' 设置为 'on' ,告诉 fminunc 我们使⽤的函数同时返回代价(cost)和梯度(gradient),这是的 fminunc 在最⼩化 cost 时使⽤我们⾃⼰的梯度。%‘MaxIter' 设置为 50,表⽰fminunc 在返回之前最多迭代50次
options = optimset('GradObj', 'on', 'MaxIter', 50);
%@为函数句柄,@后⾯括号⾥的 t 表⽰函数的参数,也就是我们所需要求解最⼩代价的参数θ
for c = 1:num_labels
% 传⼊ lrCostFunction() ⾥的 theta 是列向量,所以 all_theta(c,:)',调⽤fmincg时,theta的初始值为 all_theta(c,:)' ,有转置
theta = fmincg(@(t)(lrCostFunction(t,X,(y==c),lambda)),initial_theta, options);
all_theta(c,:)=theta';
end
end
3.predictOneVsAll.m(Predict using a one-vs-all multi-class classifier)
function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1);
lambda编程p = zeros(size(X, 1), 1);
% Add ones to the X data matrix
X = [ones(m, 1) X];%在原有矩阵前⾯附加⼀列1的向量,因为有常数项
% X: 5000 * 401, all_theta: 10 * 401
% X * all_theta': 5000 * 10
[max1, p] = max(X * all_theta', [], 2);
end
注:max(A, [], 2): obtain the max for each row.
(⼆)神经⽹络解决多分类问题
4.predict.m(Neural network prediction function)
function p = predict(Theta1, Theta2, X)
% Useful values
m = size(X, 1);
num_labels = size(Theta2, 1);
p = zeros(size(X, 1), 1);
% a1加⼀列偏置项,值全为1
a1 = [ones(m,1) X];
z2 = a1 * Theta1';
% 计算a2
a2 = sigmoid(z2);
a2添加⼀列偏置项,值全为1
a2 = [ones(size(z2,1),1) a2];
z3 = a2 * Theta2';
% 计算a3
a3 = sigmoid(z3);
[max2,index] = max(a3, [] , 2);
p = index;
end
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论