机器学习练习之正则化

这个练习是来自http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex5/ex5.html

Regularized linear regression

之前已经做过线性回归, 我们知道线性回归就是要找到 一条直线去拟合训练数据,模型的损失函数

但是,这个模型可能会有些权重很大,有些权重很小,导致过拟合,就是过分拟合了训练数据,使得模型的复杂度提高,泛化能力较差,泛化能力就是对未知数据的预测能力。为了防止过拟合,通常会加入权重惩罚项,就是模型的正则项。正则项可以取不同的形式,在回归问题中取平方损失,就是参数的L2范数,也可以取L1范数。取平方损失时,模型的损失函数变为:

lambda是正则项系数,如果它的值很大,说明对模型的复杂度惩罚大,对拟合数据的损失惩罚小,这样它就不会过分拟合数据,在训练数据上的偏差较大,在未知数据上的variance较小,但是可能出现欠拟合的现象;相反,如果lambda值很小,说明比较注重对训练数据的拟合,在训练数据上的bias会小,但是可能会导致过拟合。

要求出theta使得损失J最小,可以将J对theta求导,得到结果如下:

所以直接使用这个方程解就可以求出最佳的theta,不过也可以使得梯度下降算法,但是要折腾一下调步长参数。

程序如下:

[plain] view plain copy
  1. %%Exercie:Regularizedlinearregression
  2. %正则化的线性回归
  3. %在简单的线性回归上加了正则项,用于惩罚权重,减少模型参数的搜索空间,
  4. %使得权重不会偏向于某些特征,模型更加平滑
  5. %%
  6. %%数据初始化
  7. x=load('ex5Linx.dat');%x是只有一个特征,为一个列向量
  8. y=load('ex5Liny.dat');
  9. %画图
  10. figure
  11. plot(x,y,'o','MarkerFacecolor','r','MarkerSize',8);
  12. m=length(x);%m样本数量
  13. x=[ones(m,1),x,x.^2,x.^3,x.^4,x.^5];%根据x构造特征向量,这里是多项式的特征,每个特征取(0-5)次方
  14. n=size(x,2);%特征数量
  15. %%梯度下降算法
  16. %theta=zeros(n,1);%初始化权重向量,一个列向量
  17. %alpha=0.01;%学习率,步长
  18. %lambda=0;
  19. %MAX_ITR=500;
  20. %fori=1:MAX_ITR
  21. %grad=(1/m).*(x'*(x*theta-y)+lambda*theta);%计算梯度
  22. %theta=theta-alpha*grad;%更新权重
  23. %end
  24. %theta
  25. %J=(0.5/m)*(sum((x*theta-y).^2)+lambda*sum(theta.^2))
  26. %theta_norm=norm(theta)
  27. %%
  28. %%normalequations
  29. lambda=[0110];
  30. plotstyle={'b','g'}
  31. fori=1:3
  32. L=lambda(i).*eye(n);
  33. L(1,1)=0;
  34. theta=(x'*x+L)\x'*y;
  35. theta
  36. J=(0.5/m)*(sum((x*theta-y).^2)+lambda(i)*sum(theta.^2))
  37. theta_norm=norm(theta)%计算theta的L2范数
  38. holdon
  39. x_vals=(-1:0.05:1)';%这个范围要根据x的范围确定
  40. features=[ones(size(x_vals)),x_vals,x_vals.^2,x_vals.^3,...
  41. x_vals.^4,x_vals.^5];
  42. plot(x_vals,features*theta,char(plotstyle(i)),'linewidth',2)
  43. legend(['lambda=',num2str(i)])
  44. end
  45. legend('Trainingdata','\lambda=0','\lambda=1','\lambda=10');
  46. title('5thorderfit')
  47. holdoff


结果:



Regularized Logistic regression

正则化的逻辑斯蒂回归模型也是在之前的 logistic regression增加了正则项。
要使得上面的损失函数最小,同样这样使用牛顿方法,它的更新规则为:

其中一阶导和海森矩阵的形式有所变化:
程序如下:
[plain] view plain copy
  1. functionout=map_feature(feat1,feat2)
  2. %MAP_FEATUREFeaturemappingfunctionforExercise5
  3. %
  4. %map_feature(feat1,feat2)mapsthetwoinputfeatures
  5. %tohigher-orderfeaturesasdefinedinExercise5.
  6. %
  7. %returnsanewfeaturearraywithmorefeatures
  8. %Inputsfeat1,feat2mustbethesamesize
  9. %Note:thisfunctionisonlyvalidforEx5,sincethedegreeis
  10. %hard-codedin.
  11. degree=6;
  12. out=ones(size(feat1(:,1)));
  13. fori=1:degree
  14. forj=0:i
  15. out(:,end+1)=(feat1.^(i-j)).*(feat2.^j);
  16. end
  17. end
    %%regularizedlogisticregression
  1. %加入正则项的逻辑斯蒂回归模型
  2. %%
  3. %%数据初始化
  4. x=load('ex5Logx.dat');%这里x的每一行是一个二维向量,表示有两个特征
  5. y=load('ex5Logy.dat');
  6. %Findtheindicesforthe2classes
  7. pos=find(y);neg=find(y==0);
  8. x_unfeatured=x;%保存未构造特征前的x
  9. x=map_feature(x(:,x(:,2));%由于原始数据下样本不是线性可分的,所以这里根据x的2个特征构造更多的特征
  10. [mn]=size(x);
  11. %%
  12. %%定义sigmoid函数
  13. g=inline('1.0./(1.0+exp(-z))','z');
  14. %%牛顿算法
  15. lambda=[0110];%正则项系数
  16. MAX_ITR=15;
  17. fori=1:3
  18. theta=zeros(n,1);%权重初始化
  19. J=zeros(MAX_ITR,1);%保存损失
  20. forj=1:MAX_ITR
  21. h=g(x*theta);%计算sigmoid值
  22. L=lambda(i).*eye(n);
  23. L(1,1)=0;
  24. J(j)=-(1.0/m).*sum(y.*log(h)+(1-y).*log(1-h))+...
  25. lambda(i)/(2*m).*norm(theta(2:end))^2;
  26. grad=(1/m).*(x'*(h-y)+L*theta);%计算梯度
  27. H=(1/m).*x'*diag(h)*diag(1-h)*x+lambda(i)/m.*L;%计算海森矩阵
  28. theta=theta-H\grad;
  29. J
  30. norm_theta=norm(theta)
  31. figure
  32. plot(x_unfeatured(pos,x_unfeatured(pos,2),'k+',2,7)
  33. holdon
  34. plot(x_unfeatured(neg,x_unfeatured(neg,'ko','MarkerFaceColor','y',248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> %显示结果
  35. u=linspace(-1,1.5,200);
  36. v=linspace(-1,200);
  37. z=zeros(length(u),length(v));
  38. forii=1:length(u)
  39. forjj=1:length(v)
  40. z(ii,jj)=map_feature(u(ii),v(jj))*theta;
  41. z=z';
  42. %plotz=0
  43. contour(u,v,z,[0,0],2)
  44. legend('y=1','y=0','Decisionboundary')
  45. title(sprintf('\\lambda=%g',lambda(i)),'FontSize',14)
  46. holdoff

结果:

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...