权重非线性拟合
拟合函数为\(f_{\theta}(x),x\)是输入,y是输出,\(\theta\)是参数,f是拟合函数
1.随机初始化参数\(\theta\),\(y=\sqrt{w}.*y\)
2.计算拟合值\(yfit=\sqrt{w}.*f_{\theta}(x),err=y-yfit\),以及\(sse=r^T*r\)
3.计算雅克比矩阵J(\(J*=W^{1/2}J\)).
雅克比矩阵计算公式:
for i = 1:numParams
% Calculate delta(:,i), but remember to set it back to 0 at the end of the loop.
delta(:,i) = DerivStep(i) * theta(:,i);
deltaZero = delta(:,i) == 0;
if any(deltaZero)
% Use the norm as the "scale", or 1 if the norm is 0.
nTheta = sqrt(sum(theta(deltaZero,:).^2, 2));
delta(deltaZero,i) = DerivStep(i) * (nTheta + (nTheta==0));
end
thetaNew = theta + delta;
yplus = func(thetaNew);
dy = yplus(:) - y0(:);
J(:,i) = dy./delta(rowIdx,i);
delta(:,i) = 0;
end
4.Jplus = [J;diag(sqrt(lambda*sum(abs(J).^2,1)))],
rplus = [err;zeros(p,1)],p为参数个数
参数变化为step =Jplus\rplus;
5.$\theta = \theta+ step $
6.如果sse>sseold
\(lambda = max(0.1.*lambda,eps)\)
else
\(lambda = 10.*lambda\);
计算新的Jplus(J不用重新计算),step,beta,yfit,err,sse,并再重新判断sse>sseold,满足的话回到2
具体详见nlinfit.m函数

浙公网安备 33010602011771号