2016-06-13 1 views
1

Я знаю, что у MATLAB есть пакет для оценки максимального правдоподобия, но для образовательных целей я пишу сам алгоритм, который возвращает мне оценки. Теперь я написал функцию, которую я пытаюсь свести к минимуму (поскольку я использую отрицательный логарифмический правдоподобие). Вот он:Написание алгоритма оценки максимального правдоподобия в MATLAB

function ml = two_var(param, data) 
mu = param(1); 
sigma = param(2); 
n=numel(data); 
sumto = 0; 
for i=1:n 
    c = data(i)- mu; 
    sumto = sumto + c; 
    ml = n/2*log(2*pi)+n/2*log(sigma^2)+1/(2*sigma^2)*sumto^2; 
end 

Этот код относится к оценке гауссовой разности. Теперь проблема в том, что эта функция не является допустимым входом fminunc ... Как я могу обойти проблему? Что я делаю не так? Спасибо всем, кто хочет помочь;)

+1

Мой тезис застрял на довольно похожей стадии. ;) –

+0

Почему это недействительный ввод? Способ обхода проблемы заключается в написании вашей собственной функции минимизации вместо использования встроенных встроенных макросов .... –

+0

Вы вызвали fminunc с помощью 'fminunc (@ (param) two_var (param, data), param0)'? – Jommy

ответ

0

Спасибо всем, кто помог в комментировании вопроса. Ну, я использовал все ваши полезные комментарии, чтобы улучшить свой код. Вот мой окончательный результат.

function ml = t_var(param) 
rng default; 
data = random('norm',0,1,[400,1]); 
z = (data - param(1)) ./ param(2); 
L = -.5.*z.*z - log(sqrt(2.*pi).*param(2)); 
ml = -sum(numel(data).*L); 

Этот код, несомненно, легче читать; кроме того, он использует быстрые векторные операции, разрешенные в MATLAB. После определения этой функции является то легко назвать его

x0 =[0 0] 
[x,fval] = fminsearch(@t_var,x0,optimset('TolX',1e-19,'MaxFunEvals',1000,'MaxIter',1000)) 

и получить оценки ОД, которые согласуются с теми, которые вы можете получить в противном случае.

Большое спасибо всем, кто дал мне несколько советов! ;)