我知道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
输入......我怎样才能解决这个问题呢?我究竟做错了什么?感谢任何想要帮助的人;)
答案 0 :(得分:1)
感谢所有帮助评论该问题的人。好吧,我已经使用了所有有用的注释来改进我的代码。这是我的最终结果。
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))
并获得与您可以获得的ML估计一致的ML估计。
非常感谢所有给我一些提示的人! ;)