山东大学机器学习实验4

在本练习中,您将实现正则化线性回归和正则化逻辑回归。首先,请下载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')

猜你喜欢

转载自blog.csdn.net/qq_50213874/article/details/129554488