
174
■
14
章
階層的モデル
14.3
階層化する
前節では、
r
が既知と仮定した。この仮定を緩めよう。
Emitter
と呼ぶ別のスイート
を定義して、放射源の振る舞いをモデル化し、
r
を推定する。
class Emitter(thinkbayes.Suite):
def
__
init
__
(self, rs, f=0.1):
detectors = [Detector(r, f) for r in rs]
thinkbayes.Suite.
__
init
__
(self, detectors)
rs
は、
r
の仮説値の列、
detectors
は、
r
の各値に対応する
Detector
オブジェクト
の列である。スイートの値が
Detector
オブジェクトなので、
Emitter
はメタスイート
(
metaSuite
)、すなわち値としてスイートを含むスイートとなる。
Emitter
の更新には、
r
の各仮説値の下でデータの尤度を計算する必要がある。
r
の
各値は、ある範囲の
n
の値を持つ
Detector
によって表される。
与えられた
Detector
からデータの尤度を計算するには、
n
の値をループして調べな
がら
k
の全確率を足し合わせる。
SuiteLikelihood
がそれを次のようにする。
# class Detector
def SuiteLikelihood(self, data):
total = 0
for hypo, prob in self.Items():
like = self.Likelihood(data, hypo) ...