多分类和神经网络
文件说明
本次作业将实现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......0⎭⎪⎪⎬⎪⎪⎫一个样本为400∗1的列向量
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))T−⎭⎪⎪⎪⎬⎪⎪⎪⎫所有样本为5000∗400的矩阵
y
=
{
1
2
.
.
.
.
.
.
0
}
一
个
样
本
为
5000
∗
1
的
列
向
量
y= \left\{ \begin{matrix} 1\\ 2\\ ......\\ 0\\ \end{matrix} \right\}一个样本为5000*1的列向量
y=⎩⎪⎪⎨⎪⎪⎧12......0⎭⎪⎪⎬⎪⎪⎫一个样本为5000∗1的列向量
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+e−z1
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=1∑m[−y(i)log(hθ(x(i)))−(1−y(i)log(1−hθ(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+e−z1。
定义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,大小为5000∗1
要做的工作是在lrCostFunction.m中计算损失函数,输入设定好的
θ
、
X
、
y
\theta、X、y
θ、X、y通过公式
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)
∂θj∂J=m1∑i=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),
=m1∑i=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=1∑m[−y(i)log(hθ(x(i)))−(1−y(i)log(1−hθ(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
∂θj∂J=m1i=1∑m((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
J为实数、grad
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=10表示10类结果,λ=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+e−z1
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