我正在尝试最小化征费功能:[1]:https://www.sfu.ca/~ssurjano/levy13.html 使用LM算法。该算法使用Hessian矩阵,该矩阵的目的是最小化最小二乘函数。 这是我的代码:
function x=LM_core(x,beta,fg,fh)
% fg is the gradient at point x.
% fh is the Hessian at point x
n=length(x);
pos_def = beta*eye(n);
sdum = fh + pos_def;
s = -sdum\fg; % calculating the inverse matrix using the linear solver.
lambda = 1;
x = x + lambda*s;
end
主要功能是:
function [xmin,fxmin,iter,err1,err2,err3]=lm_opt(x0,tol,f,f_g,f_h)
% Three function handles: f for Objective funciton, f_g for gradient and f_h for Hessian
% ------------------------Pre-initialization------------------------------
itermax=1e5;
beta=1e3;
LL=0.25;
HH=2;
%-------------------------------------------------------------------------
x0=x0(:); x=x0;
for iter=1:itermax
xold=x;
fold = f(x);
fg = f_g(x); %gradient
fh = f_h(x); %Hessian
x = LM_core(x,beta,fg,fh); % Calculate the next point using LM method.
fnew = f(x);
if fnew < fold
beta= LL*beta;
err1=norm(fg);
err2=abs(fnew-fold);
err3=norm(x-xold);
if err1<tol && err2<tol && err3<tol
xmin=x;
fxmin=f(xmin);
break;
end
else
beta=HH*beta;
x=xold;
end
end
可以通过解析获得梯度和粗麻布矩阵。
我使用初始猜测= [1,1]时遇到以下错误
警告:矩阵是奇数,接近奇数或缩放比例很差。结果可能不正确。 RCOND = NaN。
我该如何克服这个问题?
有没有一种方法可以根据目标函数梯度和hessian来初始化beta,LL和HH?
我该如何改进该算法?