Regularized linear regression
之前已经做过线性回归, 我们知道线性回归就是要找到 一条直线去拟合训练数据,模型的损失函数为
但是,这个模型可能会有些权重很大,有些权重很小,导致过拟合,就是过分拟合了训练数据,使得模型的复杂度提高,泛化能力较差,泛化能力就是对未知数据的预测能力。为了防止过拟合,通常会加入权重惩罚项,就是模型的正则项。正则项可以取不同的形式,在回归问题中取平方损失,就是参数的L2范数,也可以取L1范数。取平方损失时,模型的损失函数变为:
lambda是正则项系数,如果它的值很大,说明对模型的复杂度惩罚大,对拟合数据的损失惩罚小,这样它就不会过分拟合数据,在训练数据上的偏差较大,在未知数据上的variance较小,但是可能出现欠拟合的现象;相反,如果lambda值很小,说明比较注重对训练数据的拟合,在训练数据上的bias会小,但是可能会导致过拟合。
要求出theta使得损失J最小,可以将J对theta求导,得到结果如下:
所以直接使用这个方程解就可以求出最佳的theta,不过也可以使得梯度下降算法,但是要折腾一下调步长参数。
程序如下:
- %%Exercie:Regularizedlinearregression
- %正则化的线性回归
- %在简单的线性回归上加了正则项,用于惩罚权重,减少模型参数的搜索空间,
- %使得权重不会偏向于某些特征,模型更加平滑
- %%
- %%数据初始化
- x=load('ex5Linx.dat');%x是只有一个特征,为一个列向量
- y=load('ex5Liny.dat');
- %画图
- figure
- plot(x,y,'o','MarkerFacecolor','r','MarkerSize',8);
- m=length(x);%m样本数量
- x=[ones(m,1),x,x.^2,x.^3,x.^4,x.^5];%根据x构造特征向量,这里是多项式的特征,每个特征取(0-5)次方
- n=size(x,2);%特征数量
- %%梯度下降算法
- %theta=zeros(n,1);%初始化权重向量,一个列向量
- %alpha=0.01;%学习率,步长
- %lambda=0;
- %MAX_ITR=500;
- %fori=1:MAX_ITR
- %grad=(1/m).*(x'*(x*theta-y)+lambda*theta);%计算梯度
- %theta=theta-alpha*grad;%更新权重
- %end
- %theta
- %J=(0.5/m)*(sum((x*theta-y).^2)+lambda*sum(theta.^2))
- %theta_norm=norm(theta)
- %%
- %%Normalequations
- lambda=[0110];
- plotstyle={'b','g'}
- fori=1:3
- L=lambda(i).*eye(n);
- L(1,1)=0;
- theta=(x'*x+L)\x'*y;
- theta
- J=(0.5/m)*(sum((x*theta-y).^2)+lambda(i)*sum(theta.^2))
- theta_norm=norm(theta)%计算theta的L2范数
- holdon
- x_vals=(-1:0.05:1)';%这个范围要根据x的范围确定
- features=[ones(size(x_vals)),x_vals,x_vals.^2,x_vals.^3,...
- x_vals.^4,x_vals.^5];
- plot(x_vals,features*theta,char(plotstyle(i)),'LineWidth',2)
- legend(['lambda=',num2str(i)])
- end
- legend('Trainingdata','\lambda=0','\lambda=1','\lambda=10');
- title('5thorderfit')
- holdoff
Regularized Logistic regression
正则化的逻辑斯蒂回归模型也是在之前的
logistic regression上增加了正则项。
其中一阶导和海森矩阵的形式有所变化:
程序如下:
- functionout=map_feature(feat1,feat2)
- %MAP_FEATUREFeaturemappingfunctionforExercise5
- %
- %map_feature(feat1,feat2)mapsthetwoinputfeatures
- %tohigher-orderfeaturesasdefinedinExercise5.
- %
- %Returnsanewfeaturearraywithmorefeatures
- %Inputsfeat1,feat2mustbethesamesize
- %Note:thisfunctionisonlyvalidforEx5,sincethedegreeis
- %hard-codedin.
- degree=6;
- out=ones(size(feat1(:,1)));
- fori=1:degree
- forj=0:i
- out(:,end+1)=(feat1.^(i-j)).*(feat2.^j);
- end
- end
- %%Regularizedlogisticregression
- %加入正则项的逻辑斯蒂回归模型
- %%
- %%数据初始化
- x=load('ex5Logx.dat');%这里x的每一行是一个二维向量,表示有两个特征
- y=load('ex5Logy.dat');
- %Findtheindicesforthe2classes
- pos=find(y);neg=find(y==0);
- x_unfeatured=x;%保存未构造特征前的x
- x=map_feature(x(:,x(:,2));%由于原始数据下样本不是线性可分的,所以这里根据x的2个特征构造更多的特征
- [mn]=size(x);
- %%
- %%定义sigmoid函数
- g=inline('1.0./(1.0+exp(-z))','z');
- %%牛顿算法
- lambda=[0110];%正则项系数
- MAX_ITR=15;
- fori=1:3
- theta=zeros(n,1);%权重初始化
- J=zeros(MAX_ITR,1);%保存损失
- forj=1:MAX_ITR
- h=g(x*theta);%计算sigmoid值
- L=lambda(i).*eye(n);
- L(1,1)=0;
- J(j)=-(1.0/m).*sum(y.*log(h)+(1-y).*log(1-h))+...
- lambda(i)/(2*m).*norm(theta(2:end))^2;
- grad=(1/m).*(x'*(h-y)+L*theta);%计算梯度
- H=(1/m).*x'*diag(h)*diag(1-h)*x+lambda(i)/m.*L;%计算海森矩阵
- theta=theta-H\grad;
- J
- norm_theta=norm(theta)
- figure
- plot(x_unfeatured(pos,x_unfeatured(pos,2),'k+',2,7)
- holdon
- plot(x_unfeatured(neg,x_unfeatured(neg,'ko','MarkerFaceColor','y',248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> %显示结果
- u=linspace(-1,1.5,200);
- v=linspace(-1,200);
- z=zeros(length(u),length(v));
- forii=1:length(u)
- forjj=1:length(v)
- z(ii,jj)=map_feature(u(ii),v(jj))*theta;
- z=z';
- %plotz=0
- contour(u,v,z,[0,0],2)
- legend('y=1','y=0','Decisionboundary')
- title(sprintf('\\lambda=%g',lambda(i)),'FontSize',14)
- holdoff