由scipy.stats.rv_continuous.fit生成的对数似然函数

3
scipy.stats.rv_continuous.fit 方法会找到最大化由输入数据和分布规范 rv_continuous 确定的对数似然函数的参数。例如,这可能是 normalgammascipy.stats.rv_continuous.fit 的文档没有解释如何生成对数似然函数,我想知道它是如何生成的。我需要它以便在估计 fit 返回的参数(即最大值)时计算对数似然的值。
2个回答

3
虽然Mark的回答在技术上是正确的,但我必须重新强调nikosd在评论中提出的问题 - 先取积再取对数,在许多实际情况下会使你的结果无法使用。如果在data中有许多(数千/数百万)观察值,每个观察值的概率都小于等于1,因此你的乘积np.product(norm.pdf(data,m,s))会非常小,通常比数值精度还要小,导致结果不稳定/错误。
因此更好的方法 - 这也是为什么首先使用对数似然的原因 - 是先对单个概率np.log(norm.pdf(data,m,s))取对数,然后对结果向量求和。
import numpy as np
from scipy.stats import norm

data = [1,2,3,4,5]
m,s = norm.fit(data)
log_likelihood = np.sum(np.log(norm.pdf(data,m,s)))

我认为这很重要,值得单独回答。


3

对数似然是给定概率分布时观测到一组观测值的概率的对数。您可以使用scipy.stats.rv_continuous.pdf(x,params)访问scipy.stats.rv_continuous成员中某一点x处的概率密度函数的值。您需要针对数据的每个成员计算这些值的乘积,然后取其对数。例如:

import numpy as np
from scipy.stats import norm

data = [1,2,3,4,5]
m,s = norm.fit(data)
log_likelihood = np.log(np.product(norm.pdf(data,m,s)))

4
这个答案是正确的。另一个建议是,如果你对对数求和而不是对乘积取对数,则可以获得数字上更稳定的性能。在代码中,应该这样写:log_likelihood = np.sum(np.log(norm.pdf(data,m,s))) 而不是 log_likelihood = np.log(np.product(norm.pdf(data,m,s))) 这样做的原因是,将许多小数相乘会得到一个非常小的数。取对数然后求和可以使你计算的数字范围更容易控制。 - nikosd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接