Python でディリクレ分布の pdf を計算したいのですが、どのような種類の標準ライブラリでもそのためのコードを見つけることができませんでした。scipy.stats には分布の長いリストが含まれていますが、ディリクレは含まれていないようです。
ディリクレは非常に一般的であるため、scipy.stats などで検索する必要がある他の名前があるかどうか、または何らかの理由でそれを見逃しただけかどうか疑問に思っています。
Python でディリクレ分布の pdf を計算したいのですが、どのような種類の標準ライブラリでもそのためのコードを見つけることができませんでした。scipy.stats には分布の長いリストが含まれていますが、ディリクレは含まれていないようです。
ディリクレは非常に一般的であるため、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))]))
警告: 私はこれをテストしていません。それが機能するかどうか教えてください。
scipyバージョン 0.15の時点で、使用できますscipy.stats.dirichlet.pdf
(こちらを参照)
ガンマ分布からディリクレ分布を導き出すことができます。これはウィキペディアのページに示されています。そこに、次の 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なのかサンプリング用なのか完全にはわかりません。