Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ベイジアンネットワーク

ベイジアンネットワーク(Bayesian network, Bayesnet)は複数の確率変数の間の依存関係をDAGで表現するモデル

分析の流れ

確率変数間の関係性の表現

確率変数間の関係を確率の積で表す。例えばX→YX \to Yという依存関係(因果関係)は

P(X,Y)=P(Y∣X)P(X)P(X, Y) = P(Y|X) P(X)

と分解されると考える。P(Y∣X)P(Y|X)はXXの値によって決まるので、XXの値に応じてYYが決まるという依存関係を表す。

Loading...

上の図の場合、

P(Y,X1,X2)=P(Y∣X1,X2)P(X1)P(X2)P(Y, X_1, X_2) = P(Y | X_1, X_2) P(X_1) P(X_2)

となる

この条件付き確率を確率変数間の関係性として扱い、 条件付き確率表 (Conditional Probabilities Tables: CPT)を使って表現する。

( CPD (Conditional Probability Distribution) という呼び方もある様子?)

CPTは単に確率変数の値と確率の表である。例えば以下のようになる

Loading...
Loading...
Source
Loading...

パラメータの推定

最尤推定でCPTの各セルにいれるべき確率(これをパラメータθ\thetaと表すことにする)を推定する。

確率変数のインデックスをii、確率変数の値をjj、条件付き確率については条件をkkとすると、推定したいパラメータはθi,j,k\theta_{i,j,k}となる

例えばP(x=1)P(x=1)はx=1x=1を満たすサンプル数N1N_{1}と全体のサンプル数の比率

P(x=1)=N1NP(x=1) = \frac{N_{1}}{N}

で求められるように、

同様に、条件i,j,ki,j,kを満たすサンプル数をNi,j,kN_{i,j,k}と書くことにすると

θi,j,k=Ni,j,kN\theta_{i,j,k} = \frac{N_{i,j,k}}{N}

となる

モデルの評価

データに対するネットワークの当てはまりの良さの指標にはAICやBICなどが使われる

BICは

BIC=−2l(θ∣X)+k(log⁡N)BIC = -2l(\theta|X) + k(\log N)

XXはデータ、kkはモデルのパラメータ数、NNはサンプルサイズ、l(θ∣X)l(\theta|X)はモデルの対数尤度

分析例(スクラッチ)

データの用意

まずデータを生成する。上記のCPTを真の値として、そこから疑似乱数でデータを生成する。

Loading...

パラメータの推定

パラメータはθi,j,k\theta_{i,j,k}を求めていく

θi,j,k=Ni,j,kN\theta_{i,j,k} = \frac{N_{i,j,k}}{N}

確率変数のインデックスをii、確率変数の値をjj、条件付き確率の条件がkkである。

P(x1=0)P(x_1=0)については、条件付き確率ではないのでk=[]k=[]と表すことにするとθ1,0,[]\theta_{1, 0, []}となる

[0.62, 0.38]
[0.44, 0.56]
[(0, 0), (0, 1), (1, 0), (1, 1)]
array([[0.06, 0.08, 0.08, 0.03], [0.23, 0.25, 0.07, 0.2 ]])

モデルの評価

モデルの対数尤度l(θ∣X)l(\theta|X)に比例する値を計算する

l(θ∣X)∝∑i∑j∑k(Nijk)log⁡θ^i,j,kl\left(\theta \mid \boldsymbol{X}\right) \propto \sum_i \sum_j \sum_k\left(N_{i j k}\right) \log \hat{\theta}_{i, j, k}
-322.07467382966473
BIC=−2l(θ∣X)+k(log⁡N)BIC = -2l(\theta|X) + k(\log N)

XXはデータ、kkはモデルのパラメータ数、NNはサンプルサイズ、l(θ∣X)l(\theta|X)はモデルの対数尤度

671.780368775258

pympyパッケージによる推定

INFO:pgmpy: Datatype (N=numerical, C=Categorical Unordered, O=Categorical Ordered) inferred from data: 
 {'x1': 'N', 'x2': 'N', 'y': 'N'}
[<TabularCPD representing P(x1:2) at 0x73297ce6ac80>, <TabularCPD representing P(y:2 | x1:2, x2:2) at 0x73297ce6ada0>, <TabularCPD representing P(x2:2) at 0x73297ce69c60>]
+-------+------+
| x1(0) | 0.62 |
+-------+------+
| x1(1) | 0.38 |
+-------+------+