绘制贝叶斯网络的软件(图形模型)

机器算法验证 图形模型 软件
2022-02-06 06:32:27

我正在寻找可以生成漂亮图形模型的 [免费] 软件,例如

在此处输入图像描述

任何建议,将不胜感激。

4个回答

我目前有一个类似的问题(为我的论文绘制多个路径图),所以我已经检查了这里列出的许多选项来绘制类似的图表。许多列出的用于绘制此类矢量图形的资源(例如在 microsoft office 或 google 绘图中)可以生成非常漂亮的路径图,而且工作量非常小。但是,我对这样的程序不满意的部分原因是我需要制作许多图表,每个图表之间只有相当小的更改(例如添加另一个节点,更改标签)。指向和单击矢量图形工具不太适合这种情况,并且需要花费更多的精力来进行如此小的更改。此外,在许多图纸之间维护模板也变得困难。因此,我决定检查以编程方式生成此类图形的选项。

正如 thias 已经提到的,Graphviz 非常接近于拥有我想要的所有花里胡哨的图形(以及生成它们的非常简单的代码),但它在两个方面未能满足我的需求;1) 缺少数学字体(例如,我不确定您是否可以在 Graphviz 中用符号标记节点,2)很难绘制曲线(请参阅@Stask 网站上使用 Graphviz绘制路径图的这篇文章) . 由于这些限制,我目前(非常高兴地)决定在 Latex 中使用Tikz/pgf绘图库。下面是我尝试复制您的图形的一个示例(最大的痛苦是框右下角的标签!);β

在此处输入图像描述

\documentclass[11pt]{report}
\usepackage{tikz}
\usetikzlibrary{fit,positioning}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\tikzstyle{main}=[circle, minimum size = 10mm, thick, draw =black!80, node distance = 16mm]
\tikzstyle{connect}=[-latex, thick]
\tikzstyle{box}=[rectangle, draw=black!100]
  \node[main, fill = white!100] (alpha) [label=below:$\alpha$] { };
  \node[main] (theta) [right=of alpha,label=below:$\theta$] { };
  \node[main] (z) [right=of theta,label=below:z] {};
  \node[main] (beta) [above=of z,label=below:$\beta$] { };
  \node[main, fill = black!10] (w) [right=of z,label=below:w] { };
  \path (alpha) edge [connect] (theta)
        (theta) edge [connect] (z)
		(z) edge [connect] (w)
		(beta) edge [connect] (w);
  \node[rectangle, inner sep=0mm, fit= (z) (w),label=below right:N, xshift=13mm] {};
  \node[rectangle, inner sep=4.4mm,draw=black!100, fit= (z) (w)] {};
  \node[rectangle, inner sep=4.6mm, fit= (z) (w),label=below right:M, xshift=12.5mm] {};
  \node[rectangle, inner sep=9mm, draw=black!100, fit = (theta) (z) (w)] {};
\end{tikzpicture}
\end{figure}
\end{document}
%note - compiled with pdflatex

现在,我已经在 Latex 中写了我的论文,所以如果你只想要图像而不必编译整个 Latex 文档,这有点不方便,但是有一些相当小的解决方法可以更直接地生成图像(参见这个问题在stackoverflow上)。不过,将 Tikz 用于此类项目还有许多其他好处


目前我还没有考虑直接从指定模型中绘制统计包R中的一些图表的库,但将来我可能会更大程度地考虑它们。qgraph 库中有一些很好的示例,用于证明 R 中可以完成的工作。

Laura Dietz为 tikz编写了一个非常好的,它可以在 Latex 中绘制贝叶斯网络,而无需直接实际使用 tikz。

要演示此包,请参阅以下示例以了解此问题:

\documentclass[11pt]{report}
\usepackage{tikz}
\usetikzlibrary{bayesnet}
\begin{document}
\begin{figure}
  \centering
  \tikz{ %
    \node[latent] (alpha) {$\alpha$} ; %
    \node[latent, right=of alpha] (theta) {$\theta$} ; %
    \node[latent, right=of theta] (z) {z} ; %
    \node[latent, above=of z] (beta) {$\beta$} ; %
    \node[obs, right=of z] (w) {w} ; %
    \plate[inner sep=0.25cm, xshift=-0.12cm, yshift=0.12cm] {plate1} {(z) (w)} {N}; %
    \plate[inner sep=0.25cm, xshift=-0.12cm, yshift=0.12cm] {plate2} {(theta) (plate1)} {M}; %
    \edge {alpha} {theta} ; %
    \edge {theta} {z} ; %
    \edge {z,beta} {w} ; %
  }
\end{figure}
\end{document}
%note - compiled with pdflatex

在此处输入图像描述

虽然不完全相同,但它确实传达了相同的信息,并且可以进行调整以更好地满足特定要求。这个包生成非常可接受的数字,而无需学习完整的 tikz 包。

你不能打败http://daft-pgm.org/

Daft 是一个 Python 包,它使用 matplotlib 呈现像素完美的概率图形模型,以便在期刊或互联网上发表。使用简短的 Python 脚本和直观的模型构建语法,您可以设计有向(贝叶斯网络、有向无环图)和无向(马尔可夫随机场)模型,并将它们保存为 matplotlib 支持的任何格式(包括 PDF、PNG、EPS 和 SVG )。

你可以试试GraphViz

这允许您在文本文件中指定图形,它将自动绘制(避免重叠箭头等)。转到此处(pdf) 以获取最小示例和手册。