在本练习中,您将实现正则化线性回归和正则化逻辑回归。首先,请下载ex5Data.zip并从zip文件中提取文件。该数据包包含两组数据,一组用于线性回归,另一组用于逻辑回归。它还包括一个名为“映射特征。m”的辅助函数,它将用于逻辑回归。确保此函数的m文件放置在您计划编写代码的同一个工作目录中。
上图是线性回归在不同lambda下的拟合情况,可以看出:
当lambda=0时(如图中橘色线条),出现过拟合现象,即基本穿过每一个数据点。
当lambda=1时(如图中黄色线条),拟合情况较号。
当lambda=10时(如图中紫色线条),出现欠拟合情况,即存在较大偏差。
所以我们可以总结出:λ是正则化参数,用来平衡两个目标之间的关系。通过在代价函数中引入λ倍的参数值,来控制特征的影响大小。λ较大,则特征对于代价函数的影响较大,结果是算法会尽量降低参数的影响,可能导致欠拟合。λ较小,会导致算法尽量拟合训练集,可能会导致过拟合。因此选择合适的正则化参数是必要的。
下图为lambda=0的拟合情况:
下图为lambda=1的拟合情况:
下图为lambda=10的拟合情况:
下图为损失函数在不同lambda下,随迭代次数的变化情况:
综合上面的图可以得知:
当lambda=0时,出现过拟合现象,即基本穿过每一个分界数据点。
当lambda=1时,拟合情况较号。
当lambda=10时,出现欠拟合情况,即存在较大偏差。
所以我们可以总结出:λ是正则化参数,用来平衡两个目标之间的关系。通过在代价函数中引入λ倍的参数值,来控制特征的影响大小。λ较大,则特征对于代价函数的影响较大,结果是算法会尽量降低参数的影响,可能导致欠拟合。λ较小,会导致算法尽量拟合训练集,可能会导致过拟合。因此选择合适的正则化参数是必要的。
1.经过几次实验,发现应该记住回归方法中的一些公式,比如损失函数以及求导后的结果,海森矩阵等等,整体的结构和流程都是差不多,记忆后这样再写代码的时候更快,比较方便。
2.λ是正则化参数,用来平衡两个目标之间的关系。通过在代价函数中引入λ倍的参数值,来控制特征的影响大小。λ较大,则特征对于代价函数的影响较大,结果是算法会尽量降低参数的影响,可能导致欠拟合。λ较小,会导致算法尽量拟合训练集,可能会导致过拟合。因此选择合适的正则化参数是必要的。
1.导入数据并绘制
x=load('ex5Logx.dat');
y=load('ex5Logy.dat');
pos=find(y==1);%分离正类
neg=find(y==0);%分离负类
nx=x;
plot(x(pos,1),x(pos,2),'+');
hold on
plot(x(neg,1),x(neg,2),'o');
legend('y=1','y=0');
xlabel('u');
ylabel('v');
figure
2.正则化下牛顿法求解
x=map_feature(x(:,1),x(:,2));
[m,n]=size(x)
lambda=[0;1;10];
meye=eye(n);
meye(1,1)=0;
g=inline('1./(1+exp(-z))');%内联函数
for i=1:length(lambda)
theta=zeros(n,1);
for j=1:15
z=x*theta;
h=g(z);%sigmoid函数
costJ=-(1/m)*sum(y.*log(h)+(1-y).*log(1-h))+lambda(i,1)/(2*m)*sum(theta(2:end).^2);%损失函数
jilv(j,i)=costJ;%记录损失函数随迭代次数的变化
H=(1/m).*x'*diag(h)*diag(1-h)*x+(lambda(i,1)/m)*meye;%海森矩阵
pu=(lambda(i,1)/m).*theta;
pu(1,1)=0;
ltheta=1/m.*x'*(h-y)+pu; %损失函数的梯度
theta=theta-H^(-1)*ltheta;%更新theta
end
u=linspace(-1,1.5,200);
v=linspace(-1,1.5,200);
z=zeros(length(u),length(v));
for t=1:length(u)
for l=1:length(v)
z(t,l)=map_feature(u(t),v(l))*theta;%拟合结果
end
end
plot(nx(pos,1),nx(pos,2),'+');
hold on
plot(nx(neg,1),nx(neg,2),'o');
z=z';
contour(u,v,z,[0,0],'LineWidth',2)%决策边界
xlabel('u');
ylabel('v');
legend('y=1','y=0','decision boundary');
title(sprintf('\\lambda = %g', lambda(i,1)));
figure;
end
3.损失函数绘制
for i=1:length(lambda)
plot(1:15,jilv(:,i),'o-')%损失函数随迭代次数的变化
hold on
end
xlabel('迭代次数')
ylabel('Jtheta')
legend('lambda=0','lambda=1','lambda=10')