在Python中计算狄利克雷分布的概率密度函数

8
我想在 Python 中计算 Dirichlet 分布的概率密度函数,但是在任何标准库中都没有找到相应的代码。虽然 scipy.stats 中包含了很多分布的名称,但却不包括 Dirichlet 分布,而 numpy.random.mtrand 可以对其进行采样,但却无法获得概率密度函数。
由于 Dirichlet 分布很常见,我想知道是否应该在 scipy.stats 或类似的地方通过其他名称进行搜索,或者是否我可能已经错过了它。
4个回答

6

我在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))]))

警告:我没有测试过这个。如果它有效,请让我知道。


谢谢。如果没有人指出已经存在类似的东西,我打算写一个类似的东西。 - jpmccoy
对于在2016年及以后看到此帖子的人,请使用下面的scipy.stats解决方案!它已经被添加了。 - Dylan Daniels

3
截至scipy 版本0.15,您可以使用scipy.stats.dirichlet.pdf(请参见这里)。

-1
你可以从伽马分布推导出狄利克雷分布。这在wikipedia页面上有说明。 在那里,你会找到这段Python代码:
    params = [a1, a2, ..., ak]
    sample = [random.gammavariate(a,1) for a in params]
    sample = [v/sum(sample) for v in sample]

这是从狄利克雷分布中进行抽样的。我想要概率密度函数。概率密度函数的公式相当简单,我可以直接实现它,但如果狄利克雷分布在scipy或类似的地方隐藏起来,那将会很有用。 - jpmccoy

-2

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