【问题标题】:Writing an Algorithm for maximum likelihood estimation in MATLAB在 MATLAB 中编写最大似然估计算法
【发布时间】:2016-10-13 22:24:38
【问题描述】:

我知道 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 输入......我该如何规避这个问题?我究竟做错了什么?感谢任何想提供帮助的人;)

【问题讨论】:

  • 我的论文停留在非常相似的阶段。 ;)
  • 为什么它不是一个有效的输入?一种规避问题的方法是编写自己的最小化函数,而不是使用内置的 matlabs....
  • 你用fminunc(@(param) two_var(param, data), param0 )给fminunc打电话了吗?
  • 是的...它告诉我“初始用户提供的目标函数评估失败。FMINUNC 无法继续。”
  • 你的循环没有意义。看看sumto 发生了什么 - 在循环的每个步骤中,您都将c 添加到它,然后再次计算变量ml(其在最终迭代中的值是您的函数将返回的值) .您可能应该完全摆脱循环,只需将矢量化操作应用于data。然后使用sum计算似然函数的值。

标签: algorithm matlab maximize


【解决方案1】:

感谢所有帮助评论问题的人。好吧,我已经使用了所有有用的 cmets 来改进我的代码。这是我的最终结果。

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 估计值。

非常感谢所有给我一些提示的人! ;)

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多