【正則化應用】正則化在線性迴歸以及邏輯迴歸中的應用

命題:
hθ(x)=y=θ01*x12*x23*x124*x22
正則化的思路需要分析每個參數對結果的影響,如果該參數對結果影響不大,則就需要把該參數拿掉,反之,則需要保留該參數。
如果我們θ3是一個很小的參數,例如:0.00023,則我們認爲θ3*x12是一個多餘項;

所以對原來代價函數做如下調整(使用λ來調整前後兩個表達式之間的權重關係):
在這裏插入圖片描述
針對上述的表達式求導:
在這裏插入圖片描述

以下的代碼並未對θ0進行特殊調整。代碼如下:

%入參:rap表示迴歸計算的步長
%入參:minvalues表示迴歸計算的最小偏差,如果小於該值則表示擬合成功,返回TheTa
%入參:maxtimes表示最大擬合次數,如果達到該次數,即使沒有擬合成功,也返回最後一次的TheTa值
%入參:x表示x的矩陣,i*J的矩陣,代表訓練集有I個,X有J-1個變更,其中X(0)=1
%入參:y表示結果集,i*1的矩陣,其中訓練集有i個
%入參:theta表示參數集,j*1,表示有J個參數;
%出參:Theta表示經過訓練後的參數結果,對應於theta
%出參:bResult表示經過訓練後,是否達到目標的擬合結果,即兩次的迴歸的最小偏差小於minvalues
%出參:Thsl表示訓練結果,[n,2]其中n代表訓練了多少次,第一列記錄訓練次數,第二列記錄本次訓練後的最小偏差。
function [TheTa,bResult,Thsl] = RepeatGetMini(rap,minvalues,maxtimes,r,x,y,theta)
  curtimes=0;
  m=size(theta)(1);
  while true,
    curtimes=curtimes+1;
    J1=costFunctionJ2(x,y,theta);
    tmpmartrix=theta'*x'-y';
    %計算兩個theta的值,由於計算導數的函數不一樣,這裏無法寫成For循環去計算導數
    %theta1=theta1-(rap/m)*(後面j從0到m求和)(theta1*x(i)-y(i))*x(i)
    %...到j,下面的表達達就是theta=theta-(tmpmartrix*x)'.*(rap/m)就上面所說的矩陣
	***theta=theta.*(1-rap*r/m)-(tmpmartrix*x)'.*(rap/m);***    
    J2=costFunctionJ2(x,y,theta);
    steperr=J2-J1;
    Thsl(curtimes,:)=[curtimes,steperr];
    
    if abs(steperr)<=minvalues,
      TheTa=theta;
      bResult=true;
      break;
    elseif curtimes>= maxtimes,
      TheTa=theta;
      bResult=false;
      break;
    end;
   end;
end;

%計算theta1+theta2*x1+theta3*x2,與y的方差
%X,特徵項的矩陣列表[i*j],i是記錄集的條數,j代表參j-1數的個數(其中x0的列恆爲1),x1,x2...xj
%y,結果矩陣列表[i*1]
%theta,爲參數列表[j*1]
function J = costFunctionJ2(X,y,theta)
  m=size(X,1);
  predictions=theta'*X';
  sqrtmp = predictions - y';
  sqrErrors=sqrtmp.^2;
  J=1/(2*m)*sum(sqrErrors);
 end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章