使用Matlab fminsearch最大化目标函数返回Inf或NaN

时间:2019-02-10 16:21:03

标签: matlab function optimization fminsearch log-likelihood

我正在尝试使用function使fminsearch最大化,并想知道为什么目标函数在-Inf之后不断返回5th iteration,从而产生exitflag =0。将MaxIter300增加到100K并不能改善这种情况。为了说明我的观点,请在下面的代码中找到:

function lnl = objective(Params, Model)

Data       = Model.Data;
Threshold  = Model.Threshold;
mu_hat     = Params(1);
sig_hat    = Params(2);
num_loss   = size(Data,1);
frac_loss  = 1./Data;
var_hat    = sig_hat ^ 2;
a1         = 1/(sig_hat * sqrt(2 * pi));
b1         = log(Data) - mu_hat;
c1         = b1.^2 ./ (2 * var_hat);
ppdf       = frac_loss .* a1 .* exp(-c1); 

b2         = log(Threshold) - mu_hat;
d1         = b2 ./(sig_hat * sqrt(2));
ccdf       = 0.5 * erfc(-d1); % cdf of lognormal 

obj_func   = log(ppdf) - num_loss * log(1 - ccdf);
lnl        =  -sum(obj_func); 
end
=======================================
function Results = estimation(Model)

x            = Model.Data;
calib        = lognfit(x);

mu_hat       = calib(1); 
sig_hat      = calib(2);

InitialParams = [mu_hat - 2  sig_hat - 0.4];
%Optimization using fminsearch
options = optimset('LargeScale', 'off', 'MaxIter', 300,   
'MaxFunEvals', 300, 'Display', 'iter',...
      'TolFun', 1e-4, 'TolX', 1e-4, 'TolCon',1e-4); 

[Params, Fval, Exitflag] = fminsearch(@(Params)   
objective(Params, Model), InitialParams, options);
Results.Params           = Params;
Results.Exitflag         = Exitflag;
Results.Fval             = Fval;

end

================== test data ======================

clear; clc;

b= [90005.34; 35000.657; 10025.56; 51000.1; 10200.78;   
510000.67...
; 720000.98; 70000.678; 102000.123; 89000.89; 40000.12;
51000.56...
; 32000.12; 230000.23; 170000; 35600; 234000; 120000.34; 
45600.56; 30000.12 ];

Model.Data = b;
Model.Threshold = 15000;
res = estimation(Model)

Ps:未知Matlab如何遍历起始参数(InitialParams)以达到-Inf,但是当我在Excel中计算目标函数时,在我的模拟中距离-Inf还远。任何解决此问题的建议将不胜感激。

  • 我想我需要确保erfc(-d1) ~= 2,因此也要确保d1<3。因此需要添加约束条件(不可能是fminserach的先验条件)。

最佳

0 个答案:

没有答案