本章主要介绍概率图模型,包括贝叶斯网络和马尔可夫随机场,并给出了两者的 python 实现。
一、贝叶斯网络
贝叶斯网络是一种有向无环图,它表示变量之间的依赖关系。在贝叶斯网络中,每个节点表示一个变量,每条有向边表示一个依赖关系。节点的条件概率分布可以通过贝叶斯公式计算得到。
在 python 中,我们可以使用 NetworkX 库来创建贝叶斯网络。例如,下面的代码创建了一个简单的贝叶斯网络,并计算了两个节点的条件概率分布:
```python
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# 创建有向图
G = nx.DiGraph()
# 添加节点
G.add_node('a', pos=(0, 0))
G.add_node('b', pos=(1, 1))
G.add_node('c', pos=(1, -1))
G.add_node('d', pos=(2, 0))
# 添加边
G.add_edge('a', 'b')
G.add_edge('a', 'c')
G.add_edge('b', 'd')
G.add_edge('c', 'd')
# 绘制图形
pos = nx.get_node_attributes(G, 'pos')
nx.draw_networkx(G, pos)
plt.show()
# 计算节点的条件概率分布
cpd_a = np.array([0.6, 0.4])
cpd_b = np.array([[0.7, 0.3], [0.2, 0.8]])
cpd_c = np.array([[0.5, 0.5], [0.1, 0.9]])
cpd_d = np.array([[0.9, 0.1, 0.3, 0.7], [0.4, 0.6, 0.8, 0.2]])
```
二、马尔可夫随机场
马尔可夫随机场是一个无向图,它表示变量之间的关系。在马尔可夫随机场中,每个节点表示一个变量,每条边表示变量之间的关系。节点的联合概率分布可以通过势函数计算得到。
在 python 中,我们可以使用 NetworkX 库来创建马尔可夫随机场。例如,下面的代码创建了一个简单的马尔可夫随机场,并计算了两个节点的联合概率分布:
```python
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# 创建无向图
G = nx.Graph()
# 添加节点
G.add_node('a', pos=(0, 0))
G.add_node('b', pos=(1, 1))
G.add_node('c', pos=(1, -1))
G.add_node('d', pos=(2, 0))
# 添加边
G.add_edge('a', 'b')
G.add_edge('a', 'c')
G.add_edge('b', 'd')
G.add_edge('c', 'd')
# 绘制图形
pos = nx.get_node_attributes(G, 'pos')
nx.draw_networkx(G, pos)
plt.show()
# 计算节点的联合概率分布
pot_a = np.array([0.6, 0.4])
pot_b = np.array([[1.0, 0.2], [0.2, 1.0]])
pot_c = np.array([[1.0, 0.2], [0.2, 1.0]])
pot_d = np.array([[1.0, 0.5], [0.5, 1.0]])
```
以上就是本章的 python 实现。通过学习本章,我们可以了解到概率图模型的基本概念和 python 实现方法。