2012-05-18 99 views
6

我想計算python中Dirichlet分佈的pdf,但在任何類型的標準庫中都找不到代碼。 scipy.stats包含一個很長的發佈列表,但似乎沒有包含Dirichlet,而numpy.random.mtrand允許從其中抽取一個樣本,但不會提供pdf。在python中計算Dirichlet分佈的pdf

由於Dirichlet很常見,我想知道是否有其他名稱我應該通過scipy.stats或類似的方式搜索它,或者我是否以某種方式錯過了它。

回答

4

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

警告:我沒有測試過這個。讓我知道它是否有效。

+0

謝謝你。我打算寫一些類似的東西,如果沒有人指出某處已經存在的東西。 – jpmccoy

+0

對於那些在2016+看到這篇文章的人,請使用下面的scipy.stats解決方案!它現在被添加。 –

-1

您可以從gamma分佈中推導出Dirichlet分佈。這顯示在wikipedia page上。在這裏你可以找到這個python代碼:

params = [a1, a2, ..., ak] 
    sample = [random.gammavariate(a,1) for a in params] 
    sample = [v/sum(sample) for v in sample] 
+0

這就是從狄氏採樣。我想要pdf。 pdf的公式很合理,我可以實現它,但如果Dirichlet隱藏在scipy或類似的地方,它會很有用。 – jpmccoy

3

由於SciPy的version 0.15,你可以使用scipy.stats.dirichlet.pdf (見here