Я пытаюсь максимизировать 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