Think Bayes ベイズの定理のメモ 3
続き
■サイコロ問題
4面のサイコロ、6面のサイコロ、8面のサイコロ、12面のサイコロ、20面のサイコロの入った箱を持っているとする。
箱からサイコロをランダムに選んで振って6が出たとする。各サイコロを降った確率はどうなるか。
from thinkbayes import Suite
class Dice(Suite):
def Likelihood(self, data, hypo):
if hypo < data:
return 0
else :
return 1.0/hypo
def main():
suite = Dice([4,6,8,12,20])
suite.Update(6)
suite.Print()
if __name__ == '__main__':
main()
答え
4 0.0
6 0.392156862745
8 0.294117647059
12 0.196078431373
20 0.117647058824
■機関車問題
「ある鉄道会社では、機関車に1...Nという番号をつけている。ある日、60番という機関車を目撃したとすると、
鉄道会社は何台の機関車を所有しているのか推定せよ。」
これはサイコロの問題と同じになります。
したは60番を見た後に30番、90番、130番・・・・・と続いたとき
import thinkplot
from thinkbayes import Suite
class Train(Suite):
def Likelihood(self, data, hypo):
if hypo < data:
return 0
else :
return 1.0/hypo
def main():
hypos = xrange(1, 1001)
suite = Train(hypos)
for data in [60,30,90,130,100,20,30,50,10,40,50,100,20,10,30,40,80,90,50,100]:
suite.Update(data)
print suite.Mean()
thinkplot.PrePlot(1)
thinkplot.Pmf(suite)
### ファイルに書き出したいときは以下を実行
# thinkplot.Save(root='train1',
# xlabel='Number of trains',
# ylabel='Probability',
# formats=['pdf', 'eps'])
if __name__ == '__main__':
main()
■事前確率をべき乗分布で更新
1台の機関車を所有する会社と1000台を所有する会社は同じ確率じゃないだろ
1台の機関車をもつ零細企業は沢山あるのにたいして1000台を所有する大企業は
べき乗分布になるだろう
ということで、事前確率をべき乗分布にした場合
ついでに仮説を500にしたときと1000と2000にしたとき。
import thinkbayes
import thinkplot
from thinkbayes import Pmf, Percentile
from dice import Suite
class Train(Suite):
def __init__(self, hypos, alpha=1.0):
Pmf.__init__(self)
for hypo in hypos:
self.Set(hypo, hypo**(-alpha))
self.Normalize()
def Likelihood(self, data, hypo):
if hypo < data:
return 0
else :
return 1.0/hypo
def Mean(suite):
total = 0
for hypo, prob in suite.Items():
total += hypo * prob
return total
def MakePosterior(high, dataset):
hypos = xrange(1, high+1)
suite = Train(hypos)
suite.name = str(high)
for data in dataset:
suite.Update(data)
thinkplot.Pmf(suite)
return suite
def main():
dataset = [60,30,90,130,100,20,30,50,10,40,50,100,20,10,30,40,80,90,50,100]
for high in [500, 1000, 2000]:
suite = MakePosterior(high, dataset)
print high, suite.Mean()
if __name__ == '__main__':
main()
これからさらに信用区間をとったりするんですが、それは割愛で。
以上
関連する投稿:
- 2016-07-18:Think Bayes ベイズの定理のメモ 2
- 2016-07-09:Think Bayes ベイズの定理のメモ
- 2017-01-21:Yahoo!Japan ファイナンス から株価の取得
- 2017-02-01:GDPを支える要素のメモとグラフ
- 2020-04-11:新型コロナウイルス(covid-19)陽性患者数のグラフ 1