6

我想在 python 中计算 Dirichlet 分布的 pdf,但在任何类型的标准库中都找不到这样做的代码。scipy.stats 包含一长串分布,但似乎不包括 Dirichlet,并且 numpy.random.mtrand 从中提取一个样本,但不提供 pdf。

由于 Dirichlet 很常见,我想知道是否应该在 scipy.stats 或类似名称中搜索其他名称,或者我是否只是以某种方式错过了它。

4

4 回答 4

5

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

警告:我没有测试过这个。让我知道它是否有效。

于 2012-05-18T20:49:45.547 回答
3

从 scipy版本 0.15开始,您可以使用scipy.stats.dirichlet.pdf (请参阅此处

于 2015-11-03T02:05:44.673 回答
-1

您可以从伽马分布推导出狄利克雷分布。这显示在维基百科页面上。在那里你可以找到这个 python 代码:

    params = [a1, a2, ..., ak]
    sample = [random.gammavariate(a,1) for a in params]
    sample = [v/sum(sample) for v in sample]
于 2012-05-18T20:23:40.923 回答
-2

我认为它可能包含在numpy.random.mtrand.dirichlet但我不完全确定这是 pdf 还是用于采样。

于 2012-05-19T00:54:43.407 回答