命題:
hθ(x)=y=θ0+θ1*x1+θ2*x2+θ3*x12+θ4*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;