Максимизация целевой функции с использованием Matlab fminsearch возвращает Inf или NaN - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь максимизировать function, используя fminsearch, и удивляюсь, почему целевая функция продолжает возвращать -Inf после 5th iteration, таким образом получая exitflag =0.Увеличение MaxIter с 300 до 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).

Best

...