Использование fminsearch для оценки параметров

Я пытаюсь найти оценку максимального правдоподобия журнала для распределения Гаусса, чтобы оценить параметры. Я знаю, что в Matlab есть встроенная функция, которая делает это, подбирая распределение Гаусса, но мне нужно сделать это с помощью logMLE, чтобы позже расширить этот метод для других распределений. Итак, вот функция логарифма правдоподобия для гауссовского расстояния: Gaussian Log MLE

И я использовал этот код для оценки параметров набора переменных (r) с помощью fminsearch. но мой поиск не охватывает, и я не совсем понимаю, в чем проблема:

clear
clc
close all
%make random numbers with gaussian dist
r=[2.39587291079469
1.57478022109723
-0.442284350603745
4.39661178526569
7.94034385633171
7.52208574723178
5.80673144943155
-3.11338531920164
6.64267230284774
-2.02996003947964];
% mu=2 sigma=3

%introduce f
f=@(x,r)-(sum((-0.5.*log(2*3.14.*(x(2))))-(((r-(x(2))).^2)./(2.*(x(1))))))
fun = @(x)f(x,r);

% starting point
x0 = [0,0];
 [y,fval,exitflag,output] = fminsearch(fun,x0)


f = 
    @(x,r)-(sum((-0.5.*log(2*3.14.*(x(2))))-(((r-(x(2))).^2)./(2.*(x(1))))))


Exiting: Maximum number of function evaluations has been exceeded
         - increase MaxFunEvals option.
         Current function value: 477814.233176 
y = 1×2    
1.0e+-3 *

    0.2501   -0.0000

fval = 4.7781e+05 + 1.5708e+01i
exitflag = 0
output = 
    iterations: 183
     funcCount: 400
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Exiting: Maximum number of function evaluations has been exceeded↵         - increase MaxFunEvals option.↵         Current function value: 477814.233176 ↵' 

person Frankova T    schedule 03.07.2019    source источник


Ответы (1)


Перепишите f следующим образом:

введите описание изображения здесь

function y = g(x, r)

     n = length(r);

     log_part = 0.5.*n.*log(x(2).^2);

     sum_part = ((sum(r-x(1))).^2)./(2.*x(2).^2);

     y = log_part + sum_part;

 end

Используйте fmincon вместо fminsearch, потому что стандартное отклонение всегда является положительным числом.

Установите нижнюю границу стандартного отклонения равной нулю 0


Полный код выглядит следующим образом:

%make random numbers with gaussian dist
r=[2.39587291079469
1.57478022109723
-0.442284350603745
4.39661178526569
7.94034385633171
7.52208574723178
5.80673144943155
-3.11338531920164
6.64267230284774
-2.02996003947964];
% mu=2 sigma=3

fun = @(x)g(x, r);
% starting point
x0 = [0,0];

% borns 
lb = [-inf, 0];
ub = [inf, inf];
[y, fval] = fmincon(fun,x0,[],[],[],[],lb,ub, []);
function y = g(x, r)

     n = length(r);

     log_part = 0.5.*n.*log(x(2).^2);

     sum_part = ((sum(r-x(1))).^2)./(2.*x(2).^2);

     y = log_part + sum_part;
end

Решение

y = [3.0693    0.0000]

Для лучшей оценки используйте mle() напрямую

Код довольно прост:

y = mle(r,'distribution','normal')

Решение

y = [3.0693    3.8056]
person Adam    schedule 04.07.2019
comment
Уважаемый Адам, я знаю, что mle делает это, но мне нужно было сделать это для другого использования, и я хотел расширить это для дистрибутивов, для которых Matlab не имеет встроенного кода. Да, ваши предложения ясно дали понять - person Frankova T; 06.07.2019
comment
Хорошо, примите мой ответ, дайте мне знать, если у вас возникнут вопросы - person Adam; 06.07.2019
comment
Прочтите это, если у вас есть собственный PDF-файл stackoverflow.com/questions/56625339/ и этого stackoverflow.com/questions/56522903/ - person Adam; 06.07.2019
comment
Дорогой Адам, я принял твой ответ, но Стек сказал мне, что мой ответ нельзя сосчитать, так как у меня нет высокой репутации; но мне сообщили, что мое голосование будет рассмотрено. - person Frankova T; 07.07.2019
comment
@FrankovaT Попробуйте еще раз, с низкой репутацией вы можете принимать только ответы - person Adam; 07.07.2019