🦆

tikz-bayesnet 入門

2024/07/06に公開

tikz-bayesnet 入門

PyMC のようなベイズモデリングをやりだすと、ベイズモデルの plate notation を作図したくなります。

作図ツールとしては、LaTeX 経由になりますが、tikz-bayesnet というライブラリが便利です。

以下は Wikipedia から引用した LDA モデルの plate notation です。この図を書くことを目標にします。(なお、LaTeX 環境が手元にあることを前提にしています。)

LDA

ソースコードは下記のようになります。

¥documentclass[10pt,dvipdfm]{article}
¥usepackage{tikz}
¥usetikzlibrary{bayesnet}
¥begin{document}
¥begin{tikzpicture}
% Nodes
¥node[latent](alpha){$¥alpha$};
¥node[latent, right = of alpha](theta){$¥theta$};
¥node[latent, right = of theta](z){$z$};
¥node[obs, right = of z](w){$w$};
¥node[latent, above = of z](beta){$¥beta$};

% edge
¥edge{alpha}{theta};
¥edge{theta}{z};
¥edge{z, beta}{w};

% Plates
¥plate{p1}{(z)(w)}{$N$};
¥plate{p2}{(theta)(p1)}{$M$};

¥end{tikzpicture}
¥end{document}

最初の ¥documentclass[10pt,dvipdfm]{article} は latex で PDF を作成するときのいつものやつです。
次の

¥usepackage{tikz}
¥usetikzlibrary{bayesnet}

は、必要なライブラリを呼び出しています。
次の ¥begin{document} と最後の ¥end{document} は latex の文章を括ってる部分です。

作図の本体は ¥begin{tikzpicture}¥end{tikzpicture} に囲まれた部分です。

まず node を定義します。node の記述方法は

¥node{名前}[オプション]{表示内容};

の形式です。オプションには latent (白丸:未観測の変数)と、obs (黒丸:観測された変数)の区別、他にも const, det などがあるようです。
位置指定には left, right, above などの他に yshift=0.8cm のように細かく数値指定も出来ます。

次に node 間の edge を指定します。

¥edge{入力リスト}{出力};

みたいに指定します。

最後に plate を指定します。

¥plate{名前}{(アイテム1)(アイテム2)...}{繰り返し要素};

とか書きます。

サンプルのようにネストした plate の場合、先に内側の plate に名前をつけて定義し、外側の plate に内側の plate を含めるようにします。

こんな感じで簡単に plate notation が作図できます。

Discussion