机器学习练习之正则化

前端之家收集整理的这篇文章主要介绍了机器学习练习之正则化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这个练习是来自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

结果:

原文链接:https://www.f2er.com/regex/361805.html

猜你在找的正则表达式相关文章