我想在 python 中计算 Dirichlet 分布的 pdf,但在任何类型的标准库中都找不到这样做的代码。scipy.stats 包含一长串分布,但似乎不包括 Dirichlet,并且 numpy.random.mtrand 从中提取一个样本,但不提供 pdf。
由于 Dirichlet 很常见,我想知道是否应该在 scipy.stats 或类似名称中搜索其他名称,或者我是否只是以某种方式错过了它。
我想在 python 中计算 Dirichlet 分布的 pdf,但在任何类型的标准库中都找不到这样做的代码。scipy.stats 包含一长串分布,但似乎不包括 Dirichlet,并且 numpy.random.mtrand 从中提取一个样本,但不提供 pdf。
由于 Dirichlet 很常见,我想知道是否应该在 scipy.stats 或类似名称中搜索其他名称,或者我是否只是以某种方式错过了它。
我在 numpy 中找不到一个,但它看起来足以实现。这是一个丑陋的小单线。(我遵循了维基百科上给出的函数,除了你必须提供 x = [x1, ..., xk] 和 alpha = [a1, ..., ak])。
import math
import operator
def dirichlet_pdf(x, alpha):
return (math.gamma(sum(alpha)) /
reduce(operator.mul, [math.gamma(a) for a in alpha]) *
reduce(operator.mul, [x[i]**(alpha[i]-1.0) for i in range(len(alpha))]))
警告:我没有测试过这个。让我知道它是否有效。
您可以从伽马分布推导出狄利克雷分布。这显示在维基百科页面上。在那里你可以找到这个 python 代码:
params = [a1, a2, ..., ak]
sample = [random.gammavariate(a,1) for a in params]
sample = [v/sum(sample) for v in sample]
我认为它可能包含在numpy.random.mtrand.dirichlet
但我不完全确定这是 pdf 还是用于采样。