ベイズ推論のモデルの作り方
Pythonで体験するベイズ推論より
ベイズ推論でどうモデル作るのか!?の概念編です。
「メールの受信数のベイズ推論」の時にどうモデルを作ったかを書いてます。
0)まず自分が全知全能の神となって、データセットをつくる方法を想います。
1)ベイジアンモデリングの出発点として重要なのは、「計測したデータにあう確率変数はどれか」と考えることです。データがどのように生成されたかについて考えることです。ポアソン分布は、カウントされているデータを表すのに良い確率変数なので、メールの受信数はポアソン分布からのサンプルだというモデルを立てます。「ベイズ推論の考え方(2)・・ベイズ推定と確率分布」
2)次に、「OK、メールの受信数がポアソン分布であるとすると、ポアソン分布に何が必要か?」さて、ポアソン分布にはパラメーター$λ$が必要です。
3)$λ$の値は、何がよいのか、わかっているのか?いや、わからないが、2つの$𝜆$値があり、前半と後半の2種類あると予想した。この変化がいつあるかはわからないから、その変化点を$τ$とした
4)2つの$λ$を表すための確率分布は何が良いだろうか?$λ$は正の実数なので指数分布がよさそうだ。指数分布にもパラメーターがある$α$だ。
5)パラメータ𝛼がいくつかわかっているか?いや、わからない。ここでも$α$の確率分布を考えることもできるが、もうやめよう。$α$の影響は無視できる程度だろうし、$λ$の値に対する信念(「$λ$は途中で変化する」「たぶん10から30の間だろう」)はもっているが、$α$の値に対する信念があるわけではないのだ。だから受信数に対する、モデリングで終わりである。
それでも、$α$も設定しないといけない。$λ$に対する信念「たぶん10から30の間だろう」があるので、小さい値を$α$にすると大きな値の確率が高くなるので、よくないだろう、逆もだめそうだから、何が良いだろうか?良い作戦は、$λ$の平均値が観測データの平均値と等しくなるようにするというので、これは[「ベイズ推論の考え方(3)・・pymc3による実際の計算」で計算した方法です。
6)$𝜏$が何日目かもアィデアがない。だから$𝜏$は一様分布であるとかんがえた。
ここまで読んでどう感じたか、ほぼほぼ自分の主観的な意志でモデルを作っている。だから自分が全知全能の神となるしかありません。
「メールの受信数のベイズ推論」では、この順番でモデルを作ってきたが、逆にすると予測ができるのである。
つまりこのPython
スクリプトで予測ができます。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
# 1. DiscreteUniform(0,80)からサンプリングして、ユーザーの動作が切り替わるタイミングを指定します。
tau = np.random.randint(0, 80)
print(tau)
# 2.指数分布 Exp(𝛼)から𝜆1と𝜆2をサンプリングする。。
alpha = 1./20.
lambda_1, lambda_2 = np.random.exponential(scale=1/alpha, size=2)
print(lambda_1, lambda_2)
# 𝜏より前の日については、ユーザーの受信したメール数を、ポアソン分布Poi(𝜆1)からサンプリングし後の日をポアソン分布Poi(𝜆2)からサンプリングします。
data = np.r_[stats.poisson.rvs(mu=lambda_1, size=tau), stats.poisson.rvs(mu=lambda_2, size = 80 - tau)]
# 結果を描画します。
plt.bar(np.arange(80), data, color="#348ABD")
plt.bar(tau-1, data[tau - 1], color="r", label="user behaviour changed")
plt.xlabel("Time (days)")
plt.ylabel("count of text-msgs received")
plt.title("Artificial dataset")
plt.xlim(0, 80)
plt.legend()
plt.show()
結果は、元のデータとは同じになりません。
3回計算を繰り返して予測したグラフを載せましたが、また繰り返しても、いろいろなパターンの予測になります。
このように予測できるということが、後々重要になってくるようです。