目录
实验目的
在本练习中,您将实现正则化线性回归和正则化逻辑回归.
实验步骤与内容
1.数据加载
a.首先,下载ex5Data.zip并从zip文件中解压缩文件。 这个数据包包含两组数据,一组用于线性回归,另一组用于逻辑回归。它还包括一个名为“map_feature.m”的辅助函数,它将用于logistic回归。确保这个函数的m文件放在计划编写代码的同一个工作目录中。
2.线性回归的正则化
a. 这个练习的第一部分着重于正则化线性回归和正规方程。将数据文件ex5Linx.dat
和ex5Liny.dat
加载到程序中。这些对应于开始时的x和y变量。 请注意,在这些数据中,输入“x”是一个单一的特征,因此你可以在二维图上将y绘成x的函数(自己尝试)。从这张图片来看,拟合一条直线似乎是一种过于简单的近似。然而,我们将尝试对数据拟合一个高阶多项式,以捕捉更多的点的变化。
b.我们来试试五阶多项式。我们的假设是
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
+
θ
5
x
5
h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4+\theta_5x^5
hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4+θ5x5
这意味着我们有一个六个特征的假设,因为x0,x1,…x5现在都是我们回归的特征。 请注意,即使我们正在产生多项式拟合,我们仍然有一个线性回归问题,因为假设在每个特征中都是线性的。
c.由于我们将一个5阶多项式拟合到一个只有7个点的数据集,因此可能会发生过拟合。 为了防止这种情况,我们将在我们的模型中使用正则化。 回想一下,在正则化问题中,目标是最小化与θ有关的代价函数:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta)=\frac{1}{2m}[\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^n\theta_j^2]
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
其中λ是正则化参数。 正则化参数λ是对拟合参数的控制。 随着拟合参数的增大,成本函数的惩罚也会增大。这种惩罚取决于参数的平方以及λ的大小。 另外,请注意,λ后的求和不包括 θ 0 2 \theta_0^2 θ02.
d.现在我们将使用正规方程找到模型的最佳参数。回想一下正则化线性回归的正规方程的解是:
θ
=
(
X
T
X
+
λ
[
0
1
.
.
.
1
]
)
−
1
X
T
y
⃗
\theta=(X^TX+\lambda\begin{bmatrix}0\\ ~ & 1\\~&~&.\\~&~&~&.\\~&~&~&~&.\\~&~&~&~&~&~&1\end{bmatrix})^{-1}X^T\vec{y}
θ=(XTX+λ⎣⎢⎢⎢⎢⎢⎢⎡0 1 . . . 1⎦⎥⎥⎥⎥⎥⎥⎤)−1XTy
与λ对应的矩阵是一个(n + 1)×(n + 1)对角线矩阵,左上方为0,其他对角线项为1。(请记住,n是特性的数量,不包括未处理项)。向量y和矩阵X的定义与非正则回归相同。
e.利用这个方程,用下面的三个正则化参数找到θ的值:
①
λ
=
0
(
t
h
i
s
i
s
t
h
e
s
a
m
e
c
a
s
e
a
s
n
o
n
−
r
e
g
u
l
a
r
i
z
e
d
l
i
n
e
a
r
r
e
g
r
e
s
s
i
o
n
)
① \lambda=0~~~~~~(this is the same case as non-regularized linear regression)
①λ=0 (thisisthesamecaseasnon−regularizedlinearregression)
② λ = 1 ② ~~~\lambda=1 ② λ=1
③ λ = 10 ③ ~~~\lambda=10 ③ λ=10
在执行程序时,请记住X是一个m×(n + 1)矩阵,因为有m个训练示例和n个特征,加上x0 = 1这个截距项。 在为本练习提供的数据中,您只给出了x的第一个幂。 您将需要在特征向量X中包含x的其他幂,这意味着第一列将包含所有的幂,下一列将包含第一个幂,下一列将包含第二个幂,以此类推。你可以在Matlab/Octave中使用命令执行此操作。
x_1 = [ ones(length(y),1), x , x.^ 2 , x .^ 3 , x .^ 4 , x .^ 5] %the second lamda
lamda = 0;
metri = eye(6);
metri(1,1) = 0;
%扩维
theta =(inv(x_1'*x_1 + lamda*metri))*x_1'*y;
disp('theta')
disp(theta)
x_1 = -1:0.01:1;
x_1 = x_1';
m = length(x_1);
X = [ ones(m,1), x_1 , x_1.^ 2 , x_1 .^ 3 , x_1 .^ 4 , x_1 .^ 5];
plot(x_1,X*theta, '--b','Linewidth',2);
除了列出θ向量的每个元素
θ
j
θ_j
θj的值外,我们还将提供θ的L2范数,这样您就可以快速检查您的答案是否正确。在Matlab/Octave中,您可以使用命令norm(x)计算向量x的L2 -范数。同时,绘制每个数据的多重拟合。你将得到与以下图形类似的图形:
通过这个图形,关于正则化参数λ对模型的影响你能得出什么结论?
(补充,上诉图片大图为:)
3.正则化逻辑回归
在练习的第二部分,你将使用牛顿方法实现正则化逻辑回归。 首先,将文件“ex5Logx.dat”和“ex5Logy.dat”加载到程序中。该数据集表示具有两个特征的Logistic回归问题的训练集。 为了避免以后的混淆,我们将把“ex5Logx.dat”中包含的两个输入特性称为u和v。因此,在“ex5Logx.dat”文件中,第一列数字表示特征u,你将在水平轴上绘制该特征,而第二个特征表示v,你将在垂直轴上绘制该特征。
加载数据后,用不同的标记绘制点来区分这两种分类。在Matlab/Octave中的命令为:
x=load('ex5Logx.dat');
y=load('ex5Logy.dat');
figure
% Find the indices for the 2 classes
pos = find(y);
neg = find(y == 0);
plot(x(pos ,1),x(pos , 2 ),'+','MarkerSize',8)
hold on
plot(x(neg ,1),x(neg ,2),'o','MarkerEdgeColor','y','MarkerFaceColor','y','MarkerSize',8)
title('Training data');
xlabel('u');
ylabel('v');
legend('y=1','y=0');
在绘制你的图像后,它应该看起来像这样:
现在我们将为该数据拟合一个正则化的回归模型。回想一下,在logistic回归中,假设函数是:
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
=
P
(
y
=
1
∣
x
;
θ
)
h_\theta(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}=P(y=1|x;\theta)
hθ(x)=g(θTx)=1+e−θTx1=P(y=1∣x;θ)
在这个练习中,我们将x赋值为所有单项式(意义多项式)u和v,直到第六次幂:
x
=
[
1
u
v
u
2
u
v
v
2
u
3
⋅
⋅
⋅
u
v
5
v
6
]
x=\begin{bmatrix}1\\u\\v\\u^2\\uv\\v^2\\u^3\\·\\·\\·\\uv^5\\v^6\end{bmatrix}
x=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1uvu2uvv2u3⋅⋅⋅uv5v6⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
为了说明该理论,我们定义了28个特征向量X,表示为 x 0 = 1 , x 1 = u , x 2 = v , … , x 28 = v 6 x_0=1,x_1=u,x_2=v,…,x_{28}=v^6 x0=1,x1=u,x2=v,…,x28=v6 请记住,u是“ex5Logx.dat”文件中的第一列数字,v是第二列。从现在开始,我们只将x的条目称为x0、x1等,而不是它们在u和v方面的值。 为了节省枚举x的所有项的麻烦,我们包含了一个名为“map_feature”的Matlab/Octave助手函数,它将原始输入映射到特征向量。 此函数适用于单个训练示例以及整个训练。 若要使用此函数,请将“map_feature.m”放置在工作目录中并调用
x = map_feature(u,v);
这假设两个原始特征存储在名为“u”和“v”的列向量中。 如果只有一个训练示例,则每个列向量都是标量。 该函数将输出存储在变量“x”中的新特征数组。 当然,您可以为参数和输出使用任何您想要的名称。 只需确保您的两个参数是相同大小的列向量。
在建立这个模型之前,请记住,我们的目标是最小化正则化Logistic回归中的成本函数:
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)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2
请注意,这看起来像非正则Logistic回归的成本函数,除了末尾有一个正则化项。 我们现在将使用牛顿方法最小化这个函数。
回想一下牛顿更新规则是:
θ
(
t
+
1
)
=
θ
(
t
)
−
H
−
1
∇
θ
J
\theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_\theta{J}
θ(t+1)=θ(t)−H−1∇θJ
这是与练习4中用于非正则Logistic回归的相同规则。 但由于您现在正在实现正则化,梯度∇θ(J)和HessianH有不同的形式:
∇ θ J = [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) + λ m θ 1 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) + λ m θ 2 ⋅ ⋅ ⋅ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x n ( i ) + λ m θ n ] \nabla_\theta{J}=\begin{bmatrix}\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}\\\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_1^{(i)}+\frac{\lambda}{m}\theta_1\\\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_2^{(i)}+\frac{\lambda}{m}\theta_2\\·\\·\\·\\\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_n^{(i)}+\frac{\lambda}{m}\theta_n\end{bmatrix} ∇θJ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡m1∑i=1m(hθ(x(i))−y(i))x0(i)m1∑i=1m(hθ(x(i))−y(i))x1(i)+mλθ1m1∑i=1m(hθ(x(i))−y(i))x2(i)+mλθ2⋅⋅⋅m1∑i=1m(hθ(x(i))−y(i))xn(i)+mλθn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
H = 1 m [ ∑ i = 1 m h θ ( x ( i ) ) ( 1 − h θ ( x ( i ) ) ) x ( i ) ( x ( i ) ) T + λ m [ 0 1 ⋅ ⋅ ⋅ 1 ] ] H=\frac{1}{m}[\sum_{i=1}^mh_\theta(x^{(i)})(1-h_\theta(x^{(i)}))x^{(i)}(x^{(i)})^T+\frac{\lambda}{m}\begin{bmatrix}0\\~&1\\~&~&·\\~&~&~&·\\~&~&~&~&·\\~&~&~&~&~&1\end{bmatrix}] H=m1[i=1∑mhθ(x(i))(1−hθ(x(i)))x(i)(x(i))T+mλ⎣⎢⎢⎢⎢⎢⎢⎡0 1 ⋅ ⋅ ⋅ 1⎦⎥⎥⎥⎥⎥⎥⎤]
请注意,如果您将λ=0替换为这些表达式,您将看到与非正则Logistic回归相同的公式。 另外,记住在这些公式中,
这5点就用不着翻译了吧,挺好懂的了。
现在使用下面的lambda的三个值在这个数据集上运行牛顿方法:
a.λ=0(这与非正则化线性回归是同一种情况)
b.λ=1
c. λ=10
为了确定牛顿方法是否收敛,它可能有助于打印出J(θ)在每次迭代中的值。
在牛顿法中,J(θ)不应在任何一点上下降。 如果是,请检查您是否正确定义了J(θ)。 还要检查梯度和Hessian的定义,以确保正则化部分没有错误。
收敛后,使用θ的值在分类问题中找到决策边界。 判定边界定义为所在线
P
(
y
=
1
∣
x
;
θ
)
=
0.5
⇒
θ
T
x
=
0
P(y=1|x;\theta)=0.5~~~\Rightarrow~~~\theta^Tx=0
P(y=1∣x;θ)=0.5 ⇒ θTx=0
在线性回归中,绘制决策边界比绘制最佳拟合曲线更困难。 您将需要绘制
θ
T
x
=
0
θ^Tx=0
θTx=0线隐式,通过绘制等高线。 这可以通过在表示原始u和v输入的一个点网格上评估
θ
T
x
θ^Tx
θTx来实现,然后绘制
θ
T
x
=
0
θ^Tx=0
θTx=0的曲线。
下面给出了Matlab/Octave的绘图实现。 要获得最佳的查看结果,请使用与这里相同的绘图范围。
当你完成时,you的λ的三个值的绘图应该类似于下面的绘图
结论分析与体会:
Regularized Linear Regression:
1.通过这个图形,关于正则化参数λ对模型的影响你能得出什么结论?
结论:
1.由图片可以看出,当λ=0时,训练集上曲线很好地拟合了每个样本点,灵活度较高。但是在测试集上,就出现了过拟合的现象。
2.当λ=10的时候,训练集上的曲线未能很好地拟合样本点,这又造成了欠拟合现象。
故如果λ过小,会出现过拟合,如果λ过大,会出现欠拟合,所以应该通过训练,比较错误率,选择最优的λ
Regularized Logistic Regression:
最后,由于θ有28个元素,所以我们不会在结果逐个元素地作比较。而是使用norm(theta)计算θ的L2范数,并将其与解中的范数进行检查。λ的值如何影响结果?
结论:
由下面的实验结果可知,当迭代次数足够,损失函数区域稳定后,λ的值会影响损失值,当λ越小,稳定后的损失值就越小,当λ越大,稳定后的损失值就越大。对应的J(θ)值分析如下:
对应的J值:
J
=
0.693147
J
=
0.349069
J
=
0.304406
J
=
0.286945
J
=
0.265515
J
=
0.249631
J
=
0.240259
J
=
0.228778
J
=
0.207278
J
=
0.201609
J
=
0.200301
J
=
0.199871
J
=
0.199838
J
=
0.199837
J
=
0.199837
J
=
0.693147
J
=
0.529750
J
=
0.524692
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.524633
J
=
0.693147
J
=
0.647602
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J
=
0.647584
J=0.693147~~~J=0.349069~~~J=0.304406~~~J=0.286945~~~J=0.265515~~~J=0.249631\\J=0.240259~~~J=0.228778~~~J=0.207278~~~J=0.201609~~~J=0.200301~~~J=0.199871\\J=0.199838~~~J=0.199837~~~J=0.199837~~~J=0.693147~~~J=0.529750~~~J=0.524692\\J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633\\J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633\\J=0.693147~~~J=0.647602~~~J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584\\J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584\\J=0.647584~~~J=0.647584~~~J=0.647584
J=0.693147 J=0.349069 J=0.304406 J=0.286945 J=0.265515 J=0.249631J=0.240259 J=0.228778 J=0.207278 J=0.201609 J=0.200301 J=0.199871J=0.199838 J=0.199837 J=0.199837 J=0.693147 J=0.529750 J=0.524692J=0.524633 J=0.524633 J=0.524633 J=0.524633 J=0.524633 J=0.524633J=0.524633 J=0.524633 J=0.524633 J=0.524633 J=0.524633 J=0.524633J=0.693147 J=0.647602 J=0.647584 J=0.647584 J=0.647584 J=0.647584J=0.647584 J=0.647584 J=0.647584 J=0.647584 J=0.647584 J=0.647584J=0.647584 J=0.647584 J=0.647584
体会:
本次实验的重点就在于实现线性分类和非线性的逻辑回归分类任务。在训练集上训练出的结果与测试集上的结果不一定全部很好地符合。训练集上如果模型灵活度过高,那么很有可能在测试集上出现过拟合的现象。如果训练集上拟合效果特别差,那么在测试集上也可能会出现欠拟合现象,因此,通过本实验,我们要找到一个最优解,但是通常情况下一般是在取某个范围内的λ值,从而得到结果。
Codes
map_feature.m
function out = map_feature(feat1, feat2)
% MAP_FEATURE Feature mapping function for Exercise 4
%
% map_feature(feat1, feat2) maps the two input features
% to higher-order features as defined in Exercise 4.
%
% Returns a new feature array with more features
%
% Inputs feat1, feat2 must be the same size
%
% Note: this function is only valid for Ex 4, since the degree is
% hard-coded in.
degree = 6;
out = ones(size(feat1(:,1)));
for i = 1:degree
for j = 0:i
out(:, end+1) = (feat1.^(i-j)).*(feat2.^j);
end
end
Regularized Linear Regression
%加载数据
x = load('ex5Linx.dat');
y = load('ex5Liny.dat');
figure
%显示原始数据
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r')
title('Training data');
xlabel('x');
ylabel('y');
%将特征值变成训练样本矩阵
x_1 = [ones(length(x),1) x x.^2 x.^3 x.^4 x.^5];
[m n] = size(x_1);
n = n -1;
figure
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
title('Training data');
xlabel('x');
ylabel('y');
%计算参数sidta,并且绘制出拟合曲线
rm = diag([0;ones(n,1)]);%lamda后面的矩阵
lamda = [0 1 10]';
colortype = {'g','b','r'};
sida = zeros(n+1,3); %初始化参数sida
xrange = linspace(min(x_1(:,2)),max(x_1(:,2)))';
hold on;
for i = 1:3
sida(:,i) = inv(x_1'*x_1+lamda(i).*rm)*x_1'*y;%计算参数sida
norm_sida = norm(sida) % norm 求sida的2阶范数
yrange = [ones(size(xrange)) xrange xrange.^2 xrange.^3,...
xrange.^4 xrange.^5]*sida(:,i);
plot(xrange',yrange,char(colortype(i)))
hold on
end
legend('traning data', '\lambda=0', '\lambda=1','\lambda=10')
hold off
figure
hold on
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
title('Training data');
xlabel('x');
ylabel('y');
x_1 = [ ones(length(y),1), x , x.^ 2 , x .^ 3 , x .^ 4 , x .^ 5] %the second lamda
lamda = 10;
metri = eye(6);
metri(1,1) = 0;
%扩维
theta =(inv(x_1'*x_1 + lamda*metri))*x_1'*y;
disp('theta')
disp(theta)
x_1 = -1:0.01:1;
x_1 = x_1';
m = length(x_1);
X = [ ones(m,1), x_1 , x_1.^ 2 , x_1 .^ 3 , x_1 .^ 4 , x_1 .^ 5];
plot(x_1,X*theta, '--b','Linewidth',2);
Regularized Logistic Regression
clc,clear
x=load('ex5Logx.dat');
y=load('ex5Logy.dat');
figure
% Find the indices for the 2 classes
pos = find(y);
neg = find(y == 0);
plot(x(pos ,1),x(pos , 2 ),'+','MarkerSize',8)
hold on
plot(x(neg ,1),x(neg ,2),'o','MarkerEdgeColor','y','MarkerFaceColor','y','MarkerSize',8)
title('Training data');
xlabel('u');
ylabel('v');
legend('y=1','y=0')
hold off
figure
xx=x;
x = map_feature(x(:,1),x(:,2));
[m, n] = size(x);
lambda = [0;1;10];
L = eye(n,n);
L(1,1) = 0;
g=@(z) 1.0 ./ (1+exp(-z));
for k=1:length(lambda)
theta = zeros(n,1);
for i = 1:15
%Calculate the hypothesis function
z = x*theta;
h = g(z);
%Calculate the cost function
J = -(1/m)*sum(y.*log(h)+(1-y).*log(1-h))+(lambda(k,1)/(2*m))*sum(theta(2:end).^2);
%Calculate Hession matrix
H = (1/m).*x'*diag(h)*diag(1-h)*x + (lambda(k,1)/m)*L;
%Calculate gradient
G = (lambda(k,1)/m).*theta;
G(1,1) = 0;
J_delta = (1/m).*x'*(h-y) + G;
%Update the value of theta
theta = theta - H^(-1)*J_delta;
store(i,k)=J;
fprintf('J=%f\n',J);
end
% Define the ranges of the grid
u = linspace(-1 , 1.5, 200);
v = linspace(-1 , 1.5 ,200);
%Initialize space for the values to be plotted
b = zeros(length(u),length(v));
% Evaluate z = theta*x over the grid
for i = 1:length(u)
for j = 1:length(v)
b(i,j) = map_feature(u(i), v(j))*theta;
end
end
plot ( xx ( pos , 1 ) , xx ( pos , 2 ) , '+','MarkerSize',8 );
hold on;
plot ( xx ( neg , 1 ) , xx ( neg , 2 ) , ' o ','MarkerEdgeColor','y','MarkerFaceColor','y','MarkerSize',8 );
b = b';
contour(u, v, b, [0, 0], 'LineWidth', 2);
legend('y = 1', 'y = 0', 'Decision boundary');
xlabel('x')
ylabel('y')
title(sprintf('\\lambda = %g', lambda(k,1)), 'FontSize', 10);
figure;
end
for i=1:length(lambda)
plot(1:15,store(:,i),'o--','MarkerFaceColor', 'r');
title(sprintf('\\lambda = %g', lambda(i,1)), 'FontSize', 10);
legend('J(\theta)');
if i == length(lambda)
break;
end
figure;
end