如何使用 Python 在贝叶斯网络中进行隐藏变量学习?

数据挖掘 机器学习 社会网络分析 贝叶斯 贝叶斯网络 pgm
2022-03-14 02:51:17

我学习了一般如何使用libpgm进行贝叶斯推理和学习,但我不明白是否可以使用它来学习隐藏变量。更准确地说,我正在尝试从这篇论文中实现社交网络分析的方法:在线社交网络中的关系强度建模他们建议使用以下架构 论文提出的BN

这里

  • S(ij) 表示用户 i 和 j 之间的相似度向量 -观察到
  • z(ij) 是一个隐藏变量 - 关系强度(由W正则化的正态分布- 权重和相似度向量)-隐藏
  • yt(ij) 是用户交互(1,2…n -> 某种类型的交互,例如 1=I 转推 j)(z 和 a 的函数,涉及Theta参数)-观察到
  • at(ij) 是辅助变量,表示某些交互发生的频率 -观察到

论文中描述的训练方法非常困难,并且涉及上升优化的编码。我想知道是否可以使用 libpgm 来学习WTheta参数。如果是,该怎么做?如果没有,我可以使用哪些库来做到这一点。

1个回答

虽然这个模型可以在libpgm库中实现(不过,它似乎有为几个特殊模型量身定制的非常严格的接口),但它不允许您重现本文的结果。在论文中,作者实际上做了一些比贝叶斯推理更简单的事情——他们只执行最大后验 (MAP) 推理,这要容易得多,但确实告诉你模型有多自信。

您不必自己编写 MAP 推理的优化算法,现在有强大且通用的软件包可以为您完成几乎所有事情。您可以使用TensorFlow / PyTorch的自动微分功能——它们将为您计算梯度并运行优化算法。您还可以使用numpy.autograd免费获取渐变,然后运行您喜欢的任何优化器(查看scipy.optimize)。如果您想使用更高级的优化方法,例如二阶优化方法,则 autograd + scipy.optimize 对特别简洁。

所有这些方法都会给你的值(点估计)w,θ,z你可以用来做推论。但是,如果您想要的不仅仅是点估计,并且想要找到所有可能的值(以及它们的概率),也许还有贝叶斯模型平均,您将需要更强大的库来支持概率编程Edward(基于 TensorFlow)、Pyro(基于 PyTorch)、Stan等。

如果您对这些选择感到不知所措,我建议您使用 PyTorch。