人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

OpenBayesの使い方(2)

OpenBayesの使い方(1)の続き。今回はデータからCPTを学習する方法を紹介します。当然ながらSprinklerの元データは手に入らないので前回のBNからCPTの確率値に従ってサンプルデータを1000個生成し、新しく作ったBNのCPTをこの1000個のサンプルデータから学習させてみます。

#coding:utf-8
from OpenBayes import JoinTree
from copy import deepcopy
from time import time
from WaterSprinkler import *

# ベイジアンネットからサンプルをN個生成
# 学習用のデータとする
N = 1000
# cases = [{'c':0,'s':1,'r':0,'w':1}, {...}, ...]
cases = G.Sample(N)

# 分布を設定してないベイジアンネットを作成
G2 = deepcopy(G)
G2.InitDistributions()
ie = JoinTree(G2)

# パラメータを学習
t = time()
ie.LearnMLParams(cases)
print "Learned from %d cases in %1.3f secs" % (N, (time()-t))

# 学習されたパラメータを表示
for v in G2.all_v:
    print v.distribution, "\n"

まあ解説するまでもなくそのまんまです。学習データが辞書のリストってのが少し特殊な書き方でしょうか。学習されたパラメータは、元のBNのCPTとほぼ同じ値になりました!

学習と推論ができればけっこういろんなことができそうです。OpenBayesでは他にも不完全データからCPTを学習したり、構造の学習もできるようです。