Wrong Hessian output in fminunc
2 次查看(过去 30 天)
显示 更早的评论
Can somebody explain weird Matlab's output for the following optimization problem? The goal is to minimize and to evaluate Hessian matrix at the solution. However, Matlab returns a matrix of NaNs for the Hessian at the solution point. Here is the code
[xOpt,~,~,~,grad,hessian] = fminunc(@(x) x(1)^2+x(2)^2,[1,1])
0 个评论
采纳的回答
Matt J
2020-8-13
编辑:Matt J
2020-8-13
Another solution would be to use standalone routines for numerical gradient and hessian estimation
https://www.mathworks.com/matlabcentral/fileexchange/13490-adaptive-robust-numerical-differentiation
fun=@(x) (x(1)^2+x(2)^2);
xOpt = fminunc(fun ,[1,1]);
g=gradest(fun,xOpt)
H=hessian(fun,xOpt)
No hidden scale factors if you go that route:
xOpt =
0 0
g =
0 0
H =
2.0000 0
0 2.0000
3 个评论
Matt J
2020-8-16
There is no requirement in the solution I've given you that the objective be in analytic form.
更多回答(2 个)
Bruno Luong
2020-8-12
编辑:Bruno Luong
2020-8-13
I guess the hessian is estimated from BFGS formula, that needs more than 1 FMINUNC iteration. In you case the minimum is reached in 1 iteration (since the gradient point directly to the minimum), the hessian estimation is not yet in the update cycle.
A small modification make # iteration > 1, and hessian starts well.
[xOpt,~,~,~,grad,hessian] = fminunc(@(x) 2*x(1)^2+x(2)^2,[1,1])
2 个评论
Bruno Luong
2020-8-13
编辑:Bruno Luong
2020-8-13
Not 100% satisfied answer but if you use trust-region algorithm and suppy the gradient, you 'll get back the hessian even with 1 iteration
options = optimoptions('fminunc', ...
'Algorithm', 'trust-region', ...
'SpecifyObjectiveGradient', true ...
);
[xOpt,out,b,c,grad,hessian] = fminunc(@fun,[1,1],options)
function [f,g] = fun(x)
% Calculate objective f
f = x(1)^2+x(2)^2;
if nargout > 1 % gradient required
g = 2*x;
end
end
If your function is quadratic and the -gradient points toward the minimum at any point, meaning if FMINUNC converge in 1 iteration regardless the starting point, then you must have hessian that is a scale of eye matrix. The NAN likely happens only for the trivial case as you have showed.
Matt J
2020-8-13
编辑:Matt J
2020-8-13
Just run fmincon (twice) with no constraints. Running a second time is important, because the hessian output is not the Hessian calculated at the final point, but rather the Hessian at the point just prior to that.
fun=@(x) x(1)^2+x(2)^2;
xOpt = fmincon(fun ,[1,1]);
[xOpt,~,~,~,~,grad,hessian] = fmincon(fun,xOpt)
xOpt =
1.0e-08 *
0.5588 0.5588
grad =
1.0e-07 *
0.2608
0.2608
hessian =
1 0
0 1
4 个评论
Matt J
2020-8-17
Not as far as I can see. The documentation on the meaning of the Hessian output is here,
but there is no mention that I can see of any pre-scaling of the objective.
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!