Bayesian Network
ベイジアンネットワークは、変数と条件付き依存関係を有向非巡回グラフとしてモデル化し、証拠に基づいて原因の確率を更新できるようにします。
ベイジアンネットワークは、信念ネットワークとも呼ばれ、有向非巡回グラフ(DAG)を使って確率変数とその条件付き依存関係を表現する確率的グラフィカルモデルです。各ノードは病気、症状、センサーの読み取り値などの変数を表し、各矢印は直接的な影響からその影響を受ける変数へ向かいます。各ノードには、親ノードの値の組み合わせごとに分布を示す条件付き確率表があり、これらの表を組み合わせることで、すべての変数の完全な同時分布が定義されます。一部の変数について証拠が与えられると、ネットワークは残りの変数の確率を更新します。これにより、不確実性のもとでの診断、リスク評価、意思決定支援に使えるツールとなります。Judea Pearl氏は1980年代に理論の多くを発展させ、確率的推論と因果推論に関する研究によって2011年のチューリング賞を受賞しました。
構造と条件付き確率表#
グラフは条件付き独立性を表します。各変数は、その親が既知であれば、自身の子孫ではない変数から独立します。そのため、同時分布を小さな局所要素に分解できます。P(X1, ..., Xn) = P(X1 | parents(X1)) × ... × P(Xn | parents(Xn))。Pearl氏の研究に登場し、Russell氏とNorvig氏の教科書『Artificial Intelligence: A Modern Approach』で広く使われている古典的な強盗・警報ネットワークには、はい・いいえの2値変数が5つあります。強盗または地震が自宅の警報を作動させ、警報を聞いた隣人のJohnとMaryが家主に電話します。
5つの2値変数の完全な同時確率表には、独立な確率が31個必要です。このネットワークで必要なのは10個です。強盗と地震にそれぞれ1つ、2つの親の組み合わせごとの警報に4つ、警報を条件とする各隣人に2つです。各表の大きさはノードの親の数だけで決まるため、変数が増えるほど削減効果は急速に大きくなります。
推論: 証拠に基づく信念の更新#
推論では、観測された変数を固定し、グラフ全体にベイズの定理を適用して、クエリ変数の事後分布を計算します。推論はどの方向にも行えます。原因から結果への推論(予測)、結果から原因への推論(診断)、共通の結果を持つ原因間の推論です。最後のパターンは「説明による遮断」と呼ばれ、警報が鳴ったとわかった後に地震が起きたことを知ると、強盗の確率が下がることを意味します。全列挙法や変数消去法による厳密推論は、小規模または木構造に近いネットワークでは実用的ですが、一般にはNP困難です。そのため、大規模なネットワークでは尤度重み付け、ギブスサンプリング、ループあり信念伝播などの近似手法を使います。
この例では、教科書にあるクエリP(Burglary | John calls, Mary calls)に対し、観測されていない地震と警報の変数について、因数分解された同時分布を合算する全列挙法で答えを求めます。
from itertools import product
# Conditional probability tables of the burglary-alarm network
p_burglary, p_earthquake = 0.001, 0.002
p_alarm = {(True, True): 0.95, (True, False): 0.94, (False, True): 0.29, (False, False): 0.001}
p_john = {True: 0.90, False: 0.05} # P(John calls | alarm)
p_mary = {True: 0.70, False: 0.01} # P(Mary calls | alarm)
def bern(p, value):
"""Return the probability of a binary outcome with success probability p."""
return p if value else 1 - p
# Evidence: both neighbors called. Sum the factored joint over the hidden variables.
joint = {True: 0.0, False: 0.0}
for b, e, a in product([True, False], repeat=3):
joint[b] += bern(p_burglary, b) * bern(p_earthquake, e) * bern(p_alarm[b, e], a) * p_john[a] * p_mary[a]
print(f"P(burglary | John and Mary call) = {joint[True] / sum(joint.values()):.3f}")スクリプトは0.284を出力し、教科書と同じ答えになります。2件の電話により、強盗の確率は1,000分の1から約28%に上昇します。残りの72%は、強盗を伴わない説明に割り当てられます。たとえば、地震や故障によって警報が作動したケースです。強盗は非常にまれだからです。
データからベイジアンネットワークを学習する#
ネットワークは専門家の知識から手作業で構築することも、データから学習することも、両方を組み合わせることもできます。パラメーター学習では、観測頻度から条件付き確率表を作成します。まれな組み合わせを平滑化する事前分布や、値が欠損している場合の期待値最大化アルゴリズムも使います。構造学習では、ベイズ情報量基準などの基準で候補グラフを評価する方法や、PCアルゴリズムのように条件付き独立性の検定を実行する方法で、グラフ自体を探索します。学習された矢印は統計的依存関係を示しますが、それを因果関係として解釈するには、因果発見で扱われる追加の仮定が必要です。pgmpyなどのPythonライブラリは、両方の学習方法に加え、厳密推論と近似推論も実装しています。
実際のアプリケーション#
- 医療診断: ネットワークで病気と、それによって生じる症状や検査結果を結び付けます。医師の観察によって各疾患の確率が更新され、すべての結論をグラフ上でたどれるため、説明可能なAIの一形態となります。
- 故障診断: 産業システムやITシステムでは、コンポーネントの故障が警報や測定値にどう波及するかをモデル化します。外観検査では、YOLO26検出器が検出した欠陥クラスを観測された証拠としてネットワークに入力し、摩耗した工具や校正不良の機械など、上流にある根本原因の確率を更新できます。
- リスク評価: 生態学者、保険会社、安全技術者は、限られたデータと専門家の判断をネットワークで組み合わせ、まれな事象の発生可能性を推定します。
ベイジアンネットワークと関連モデルの比較#
- ナイーブベイズ: 1つのクラスノードだけがすべての特徴量の親となるベイジアンネットワークです。クラスを条件とした場合、特徴量同士は独立であると仮定します。
- マルコフ確率場: 無向辺を持つグラフィカルモデルで、画像内の隣接ピクセルなど、対称的な関係に適しています。
- マルコフ決定過程: 状態を変化させる行動と、最大化を目指す報酬を扱う逐次意思決定のモデルであり、強化学習の標準的な枠組みです。ベイジアンネットワークで意思決定と利得を扱うには、意思決定ノードと効用ノードを追加して影響図に拡張する必要があります。
- 隠れマルコフモデル: 各時点で同じ構造を繰り返す動的ベイジアンネットワークで、隠れ状態が各ステップで1つの観測値を出力します。カルマンフィルターも同じ構造を持ちますが、状態は連続値で、遷移と観測には線形ガウス分布を使います。










