scipy.stats.rv_continuous.fit
方法会找到最大化由输入数据和分布规范 rv_continuous
确定的对数似然函数的参数。例如,这可能是 normal
或 gamma
。
scipy.stats.rv_continuous.fit
的文档没有解释如何生成对数似然函数,我想知道它是如何生成的。我需要它以便在估计 fit 返回的参数(即最大值)时计算对数似然的值。scipy.stats.rv_continuous.fit
方法会找到最大化由输入数据和分布规范 rv_continuous
确定的对数似然函数的参数。例如,这可能是 normal
或 gamma
。
scipy.stats.rv_continuous.fit
的文档没有解释如何生成对数似然函数,我想知道它是如何生成的。我需要它以便在估计 fit 返回的参数(即最大值)时计算对数似然的值。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)))
我认为这很重要,值得单独回答。
对数似然是给定概率分布时观测到一组观测值的概率的对数。您可以使用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)))
log_likelihood = np.sum(np.log(norm.pdf(data,m,s)))
而不是log_likelihood = np.log(np.product(norm.pdf(data,m,s)))
这样做的原因是,将许多小数相乘会得到一个非常小的数。取对数然后求和可以使你计算的数字范围更容易控制。 - nikosd