Regularized linear regression
之前已经做过线性回归, 我们知道线性回归就是要找到 一条直线去拟合训练数据,模型的损失函数为
但是,这个模型可能会有些权重很大,有些权重很小,导致过拟合,就是过分拟合了训练数据,使得模型的复杂度提高,泛化能力较差,泛化能力就是对未知数据的预测能力。为了防止过拟合,通常会加入权重惩罚项,就是模型的正则项。正则项可以取不同的形式,在回归问题中取平方损失,就是参数的L2范数,也可以取L1范数。取平方损失时,模型的损失函数变为:
lambda是正则项系数,如果它的值很大,说明对模型的复杂度惩罚大,对拟合数据的损失惩罚小,这样它就不会过分拟合数据,在训练数据上的偏差较大,在未知数据上的variance较小,但是可能出现欠拟合的现象;相反,如果lambda值很小,说明比较注重对训练数据的拟合,在训练数据上的bias会小,但是可能会导致过拟合。
要求出theta使得损失J最小,可以将J对theta求导,得到结果如下:
所以直接使用这个方程解就可以求出最佳的theta,不过也可以使得梯度下降算法,但是要折腾一下调步长参数。
程序如下:
@H_301_31@
- %%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