
15.4
ランダムサンプリング
■
185
参照)
*
1
m
は観察された種数である。
p
の最初の
m
個の要素だけが必要となる。他については、
x
i
が
0
なので、
p
i
x
i
が
1
であり積から無視できる。
15.4
ランダムサンプリング
ディリクレ分布からランダムサンプルを生成するには
2
通りの方法がある。
1
つは周
辺ベータ分布を使うものだが、その場合には、
1
つずつ選んで、残りのスケールを足
し合わせて
1
になるようにしないといけない(
http://en.wikipedia.org/wiki/Dirichlet_
distribution#Random_number_generation
参照)。
それほど明示的ではないが、より高速なのは、
n
個のガンマ分布
*
2
から値を選び、全
体で割ることで正規化するものである。コードは次のようになる。
# class Dirichlet
def Random (self):
p = numpy.random.gamma(self.params)
return p / p.sum()
結果をいくつか確認することができる。
n
の事後確率分布を抽出するコードは次のよ
うになる。
def DistOfN(self):
pmf = thinkbayes.Pmf ()
for hypo, prob in self.Items():
pmf.Set(hypo.n, prob)
return pmf
DistOfN
は、最上位の仮説を順に処理して、各
n
の確率を累積する。
図15-2に結果を ...