3

这是我在尝试执行 MLE 时在 Matlab 中注意到的。我的第一个估计器使用了 pdf 的对数似然,并将产品分解为一个总和。例如,(f(x)=b ax^(a-1)exp(-bx^a))分解的日志 weibull pdf 是:

log_likelihood=log(b)+log(a)+(a-1)log(x)-bx^a

对此的评估与此大不相同:

log_likelihood=log(bax^(a-1)exp(-bx^a))

计算机在这两个阶段做的有什么不同?第一个给出了更大的数字(几个数量级)。

4

2 回答 2

4

根据您使用的数字,这可能是一个数字问题:如果您将非常大的数字与非常小的数字组合在一起,由于数字精度的限制,您可能会得到不准确。

一种可能性是在第二种情况下您会失去一些准确性,因为您是在不同的规模下操作的。

于 2012-09-27T14:38:55.013 回答
3

我从事一个实现系统发育树的最大似然性的科学软件项目,并且一直遇到有关数值精度的问题。通常情况下,下降是...

  1. 在模型中具有相同值的竞争应用程序之间,
  2. 手动计算 MLE 分数时,
  3. 按照计算中的操作顺序。

这真的都归结为第三,甚至在你的情况下。当在计算过程中缩放它们的指数时,小数和非常大数的乘法会导致奇怪的结果。在(臭名昭著的)“每个计算机科学家应该知道的关于浮点运算的知识”中有很多关于此的内容。但是,如果这就是您感兴趣的全部,我提到的是它的不足之处。

总而言之,您看到的问题是计算函数时浮点/双精度数字和运算的表示形式的严格数字问题。我对 MATLAB 不太熟悉,但它们可能具有任意精度类型,可以为您提供更好的结果。

除此之外,尽可能长时间地保持它们的符号性,并且如果您对变量大小有任何直觉(因为a与 相比总是非常大x),那么请确保您明智地选择括号的顺序。

第一个方程应该更好,因为它处理添加logs,并且应该比第二个更稳定——x^a尽管它会主导方程,但让我有点厌倦,但无论如何它在实践中都会。

于 2012-09-27T14:59:03.087 回答