机器学习-吴恩达-ex3

文件说明

本次作业将实现one-vs-all的逻辑回归和神经网络来进行手写数字识别
文件有:
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 - 手写数字识别的训练数据
ex3weights.mat - 网络初始化权重
submit.m - 提交至服务器
displayData.m - 可视化数据
fmincg.m - 最小化函数
sigmoid.m - 激活函数
[*] lrCostFunction.m - 逻辑回归损失函数
[*] oneVsAll.m - 训练一对多分类器
[*] predictOneVsAll.m - 预测一对多分类器
[*] predict.m - 神经网络预测
*表示需要实现的文件

1.多分类

1.1 数据

加载数据

load('ex3data1.mat');

数据存储在ex3data1.mat中,包含5000例样本,每个样本是一张20*20大小的手写数字图片。load之后变成400*1的列向量,5000个样本用X表示,大小为5000*400。训练集的标签数据是5000*1的列向量,用y表示,数值在0-9中,表示其真实值。
m=5000表示样本量,n=400表示特征数
x ( 1 ) = { 1 2 . . . . . . 0 } 一 个 样 本 为 400 ∗ 1 的 列 向 量 x^{(1)}= \left\{ \begin{matrix} 1\\ 2\\ ......\\ 0\\ \end{matrix} \right\}一个样本为400*1的列向量 x(1)=12......04001
X = { − ( x ( 1 ) ) T − − ( x ( 2 ) ) T − . . . . . . − ( x ( 5000 ) ) T − } 所 有 样 本 为 5000 ∗ 400 的 矩 阵 X = \left\{ \begin{matrix} ^{-{(x^{(1)})}^T-}\\ ^{-{(x^{(2)})}^T-} \\ ......\\ ^{-{(x^{(5000)})}^T-} \end{matrix} \right\}所有样本为5000*400的矩阵 X=(x(1))T(x(2))T......(x(5000))T5000400
y = { 1 2 . . . . . . 0 } 一 个 样 本 为 5000 ∗ 1 的 列 向 量 y= \left\{ \begin{matrix} 1\\ 2\\ ......\\ 0\\ \end{matrix} \right\}一个样本为5000*1的列向量 y=12......050001

1.2 可视化数据

先随机选择100个样例,通过displayData.m中的displayData()展示数据在这里插入图片描述

1.3 矩阵化逻辑回归

h θ ( x ) = g ( θ T X ) h_\theta(x)=g(\theta^TX) hθ(x)=g(θTX),其中 g ( z ) = 1 1 + e − z g(z)={1\over {1+e^{-z}}} g(z)=1+ez1

1.3.1逻辑回归中的损失函数为:

J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) l o g ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) l o g ( 1 − h θ ( x ( i ) ) ) ] J(\theta)={1\over m}\sum_{i=1}^m\begin{bmatrix}-y^{(i)}log(h_\theta(x^{(i)}))-(1-y^{(i)}log(1-h_\theta(x^{(i)}))\end{bmatrix} J(θ)=m1i=1m[y(i)log(hθ(x(i)))(1y(i)log(1hθ(x(i)))]
为了计算每一个元素的差值和,我们需要对每个样例计算 h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ(x(i)),其中 h θ ( x ( i ) ) = g ( θ T x ( i ) ) h_\theta(x^{(i)})=g(\theta^Tx^{(i)}) hθ(x(i))=g(θTx(i)),并且激活函数为 g ( z ) = 1 1 + e − z g(z)={1\over {1+e^{-z}}} g(z)=1+ez1
定义X和 θ \theta θ如下:

X = { − ( x ( 1 ) ) T − − ( x ( 2 ) ) T − . . . . . . − ( x ( 5000 ) ) T − } 且 θ = { θ 0 θ 1 . . . . . . θ 400 } X =\left\{\begin{matrix}^{-{(x^{(1)})}^T-}\\ ^{-{(x^{(2)})}^T-} \\......\\^{-{(x^{(5000)})}^T-} \end{matrix} \right\} 且 \theta =\left\{\begin{matrix}^{\theta_0}\\ ^{\theta_1} \\......\\^{\theta_{400}} \end{matrix} \right\} X=(x(1))T(x(2))T......(x(5000))Tθ=θ0θ1......θ400
所以有 X θ = { − ( x ( 1 ) ) T θ − − ( x ( 2 ) ) T θ − . . . . . . − ( x ( 5000 ) ) T θ − } = { − θ T ( x ( 1 ) ) − − θ T ( x ( 2 ) ) − . . . . . . − θ T ( x ( 5000 ) ) − } = θ T X T , 大 小 为 5000 ∗ 1 X\theta=\left\{\begin{matrix}^{-{(x^{(1)})}^T\theta-}\\ ^{-{(x^{(2)})}^T\theta-} \\......\\^{-{(x^{(5000)})}^T\theta-} \end{matrix} \right\}=\left\{\begin{matrix}^{-\theta^T{(x^{(1)})}-}\\ ^{-\theta^T{(x^{(2)})}-} \\......\\^{-\theta^T{(x^{(5000)})}-} \end{matrix} \right\}=\theta^TX^T,大小为5000*1 Xθ=(x(1))Tθ(x(2))Tθ......(x(5000))Tθ=θT(x(1))θT(x(2))......θT(x(5000))=θTXT,50001
要做的工作是在lrCostFunction.m中计算损失函数,输入设定好的 θ 、 X 、 y \theta、X、y θXy通过公式

1.3.2 梯度

逻辑回归梯度公式为 ∂ J ∂ θ j = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ) {\partial J\over\partial\theta_j }={1\over m}\sum_{i=1}^m((h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j) θjJ=m1i=1m((hθ(x(i))y(i))xj(i))
计算每个样本的梯度如下,
在这里插入图片描述
= 1 m ∑ i = 1 m ( ( h θ ( i ) ) − y ( i ) ) x ( i ) = 1 m X T ( h θ ( x ) − y ) , = {1\over m}\sum_{i=1}^m((h_\theta^{(i)})-y^{(i)})x^{(i)}={1\over m}X^T(h_\theta(x)-y), =m1i=1m((hθ(i))y(i))x(i)=m1XT(hθ(x)y)

其 中 ( h θ ( x ) − y ) = [ h θ ( x ( 1 ) ) − y ( 1 ) h θ ( x ( 2 ) ) − y ( 2 ) . . . . . . h θ ( x ( 5000 ) ) − y ( 5000 ) ] 其中(h_\theta(x)-y)=\begin{bmatrix}h_\theta (x^{(1)})-y^{(1)}\\h_\theta (x^{(2)})-y^{(2)}\\......\\h_\theta (x^{(5000)})-y^{(5000)}\end{bmatrix} (hθ(x)y)=hθ(x(1))y(1)hθ(x(2))y(2)......hθ(x(5000))y(5000)
β i = ( h θ ( x ( i ) − y ( i ) ) \beta_i =(h_{\theta}(x^{(i)}-y^{(i)}) βi=(hθ(x(i)y(i)),则有
∑ i β i x ( i ) = [ ∣ ∣ ∣ x ( 1 ) x ( 2 ) . . . . . . x ( 5000 ) ∣ ∣ ∣ ] [ β 1 β 2 ⋮ β 5000 ] = X T β \sum _i\beta_ix^{(i)}=\begin{bmatrix}|&|& &|\\x^{(1)}&x^{(2)}&......&x^{(5000)}\\|&|& &|\end{bmatrix}\begin{bmatrix}\beta_1\\\beta_2\\\vdots\\\beta_{5000}\end{bmatrix}=X^T\beta iβix(i)=x(1)x(2)......x(5000)β1β2β5000=XTβ

1.3.3 对逻辑回归进行正则化

正则化后的逻辑回归损失函数:
J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) l o g ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) l o g ( 1 − h θ ( x ( i ) ) ) + λ 2 m ∑ j = 1 n θ j 2 ] J(\theta)={1\over m}\sum_{i=1}^m\begin{bmatrix}-y^{(i)}log(h_\theta(x^{(i)}))-(1-y^{(i)}log(1-h_\theta(x^{(i)}))+{\lambda\over{2m}}\sum_{j=1}^n\theta_j^2\end{bmatrix} J(θ)=m1i=1m[y(i)log(hθ(x(i)))(1y(i)log(1hθ(x(i)))+2mλj=1nθj2]
正则化后的梯度:
∂ J ∂ θ j = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ) + λ m θ j {\partial J\over\partial\theta_j }={1\over m}\sum_{i=1}^m((h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j)+{\lambda\over m}\theta_j θjJ=m1i=1m((hθ(x(i))y(i))xj(i))+mλθj

以上逻辑回归的损失函数及梯度计算代码为:
输入 θ . s h a p e = [ 400 , 1 ] 、 X . s h a p e = [ 5000 , 400 ] 、 y . s h a p e = [ 5000 , 1 ] 、 λ 为 实 数 \theta.shape=[400,1]、X.shape=[5000,400]、y.shape=[5000,1]、\lambda为实数 θ.shape=[400,1]X.shape=[5000,400]y.shape=[5000,1]λ,返回 J 为 实 数 、 g r a d J为实数、grad Jgrad

function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));

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)];
grad = grad(:);

end

1.4 one-vs-all K K K分类

对所有的样例进行分类, X . s h a p e = [ 5000 , 400 ] 、 y . s h a p e = [ 5000 , 1 ] 、 n u m _ l a b e l s = 10 表 示 10 类 结 果 , λ = 0.1 X.shape=[5000,400]、y.shape=[5000,1]、num\_labels=10表示10类结果,\lambda=0.1 X.shape=[5000,400]y.shape=[5000,1]num_labels=1010λ=0.1,返回所有参数 θ . s h a p e = [ 10 , 401 ] \theta.shape=[10,401] θ.shape=[10,401]

function [all_theta] = oneVsAll(X, y, num_labels, lambda)

m = size(X, 1);%5000
n = size(X, 2);%400

all_theta = zeros(num_labels, n + 1);%[5000,401]

X = [ones(m, 1) X];%[5000,400]

initial_theta = zeros(n + 1, 1);%[400,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;

end

预测,输入所有 θ . s h a p e = [ 10 , 401 ] \theta.shape=[10,401] θ.shape=[10,401] X . s h a p e = [ 5000 , 400 ] X.shape=[5000,400] X.shape=[5000,400]

h θ ( x ) = g ( X θ ) h_\theta(x)=g(X\theta) hθ(x)=g(Xθ),其中 g ( z ) = 1 1 + e − z g(z)={1\over {1+e^{-z}}} g(z)=1+ez1

function p = predictOneVsAll(all_theta, X)

m = size(X, 1); %测试样例数
num_labels = size(all_theta, 1); %10类

p = zeros(size(X, 1), 1); %预测结果
X = [ones(m, 1) X]; %

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

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

end

2神经网络

仅实现前馈过程,即predict,网络结构如图在这里插入图片描述
输入两层网络的 θ 和 X \theta和X θX

function p = predict(Theta1, Theta2, X)

m = size(X, 1);
num_labels = size(Theta2, 1);

p = zeros(size(X, 1), 1);

X = [ones(m, 1) X];

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

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

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


end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值