概率图模型:机器学习的结构化概率之道
<p>当复杂世界的不确定性遇上图的结构化表达,<strong>概率图模型</strong>应运而生。</p><p>它可以帮助我们理解和建模<strong>变量之间的复杂关系</strong>。</p>
<p>想象一下,你正在尝试预测明天的天气,你需要考虑温度、湿度、气压等多种因素,这些因素之间存在着复杂的相互作用。</p>
<p><strong>概率图模型</strong>就像是一张“关系网”,能够清晰地表示这些因素之间的依赖关系,并帮助我们进行推理和预测。</p>
<h1 id="1-定义">1. 定义</h1>
<p><strong>概率图模型</strong>是一种通过图形化的方式来表示变量之间概率关系的模型。</p>
<p>它将变量表示为图中的节点,而变量之间的关系则通过边来表示。</p>
<p>这种模型的<strong>核心思想</strong>是利用<strong>图的结构</strong>来简化复杂的概率计算,使得我们可以更直观地理解和分析变量之间的相互作用。</p>
<p><strong>概率图模型</strong>是概率论与图论的完美结合。</p>
<p>它主要分为两类:有向无环图(DAG)模型,也就是<strong>贝叶斯网络</strong>;以及无向图模型,也就是<strong>马尔可夫网</strong>。</p>
<p>接下来,我们来详细了解一下这两种模型。</p>
<h1 id="2-贝叶斯网络有向无环图模型">2. 贝叶斯网络:有向无环图模型</h1>
<p><strong>贝叶斯网络</strong>是一种有向无环图模型,它通过有向边来表示变量之间的因果关系。</p>
<p>在<strong>贝叶斯网络</strong>中,每个节点代表一个随机变量,而有向边则表示一个变量对另一个变量的直接影响。</p>
<p>例如,我们可以通过贝叶斯网络来表示“下雨”和“地面潮湿”之间的关系,“下雨”会导致“地面潮湿”,这种因果关系在图中通过一条有向边来表示。</p>
<p><strong>贝叶斯网络</strong>的原理基于贝叶斯定理,它允许我们通过已知的概率分布来计算未知的概率分布。</p>
<p>具体来说,给定一个贝叶斯网络,我们可以通过联合概率分布来计算任意变量的概率,同时也可以利用条件概率来进行推理。</p>
<p>例如,如果我们知道“下雨”的概率,以及“下雨”导致“地面潮湿”的条件概率,那么我们就可以计算出“地面潮湿”的概率。</p>
<p>在<code>Python</code>中,我们可以使用<code>pgmpy</code>库来构建和使用贝叶斯网络。</p>
<p>虽然<code>scikit-learn</code>库本身不直接支持贝叶斯网络,但<code>pgmpy</code>是一个很好的补充。</p>
<p>以下是一个简单的示例,展示如何构建一个贝叶斯网络并进行推理:</p>
<pre><code class="language-python">from pgmpy.models import DiscreteBayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
# 构建贝叶斯网络
model = DiscreteBayesianNetwork([("下雨", "地面潮湿"), ("洒水装置", "地面潮湿")])
# 定义条件概率分布
cpd_rain = TabularCPD(variable="下雨", variable_card=2, values=[, ])
cpd_sprinkler = TabularCPD(variable="洒水装置", variable_card=2, values=[, ])
cpd_wetground = TabularCPD(
variable="地面潮湿",
variable_card=2,
values=[, ],
evidence=["下雨", "洒水装置"],
evidence_card=,
)
# 添加条件概率分布到模型
model.add_cpds(cpd_rain, cpd_sprinkler, cpd_wetground)
# 检查模型是否有效
assert model.check_model()
# 进行推理
inference = VariableElimination(model)
result = inference.query(variables=["地面潮湿"], evidence={"下雨": 1, "洒水装置": 0})
print(result)
## 运行结果:
'''
+------------+-----------------+
| 地面潮湿 | phi(地面潮湿) |
+============+=================+
| 地面潮湿(0) | 0.1000 |
+------------+----------------+
| 地面潮湿(1) | 0.9000 |
+------------+----------------+
'''
</code></pre>
<p>在这个例子中,我们定义了一个简单的<strong>贝叶斯网络</strong>,包含三个变量:“下雨”、”洒水装置”和”地面湿”。</p>
<p>我们通过条件概率分布来描述这些变量之间的关系,并使用<code>VariableElimination</code>类来进行推理。</p>
<p>通过指定证据(例如“下雨”为1,“洒水装置”为0),我们可以计算出“地面湿”为真的概率。</p>
<h1 id="3-马尔可夫网无向图模型">3. 马尔可夫网:无向图模型</h1>
<p>与<strong>贝叶斯网络</strong>不同,<strong>马尔可夫网</strong>是一种无向图模型。</p>
<p>在<strong>马尔可夫网</strong>中,变量之间的关系通过无向边来表示,这些边表示变量之间的相互依赖关系,但不表示因果关系。</p>
<p><strong>马尔可夫网</strong>的<strong>核心原理</strong>是马尔可夫性,即一个变量的值只依赖于与它直接相连的变量,而与图中的其他变量无关。</p>
<p><strong>马尔可夫网</strong>通常用于表示变量之间的软约束关系,例如在图像分割中,相邻像素的颜色通常相似,这种相似性可以通过马尔可夫网来建模。</p>
<p>在<code>Python</code>中,我们同样可以使用<code>pgmpy</code>库来构建马尔可夫网。</p>
<p>以下是一个简单的示例,展示如何构建一个<strong>马尔可夫网</strong>并进行推理:</p>
<pre><code class="language-python">from pgmpy.models import MarkovNetwork
from pgmpy.factors.discrete import DiscreteFactor
from pgmpy.inference import BeliefPropagation
# 构建马尔可夫网
model = MarkovNetwork()
# 添加边
model.add_edges_from([("A", "B"), ("B", "C"), ("C", "A")])
# 定义因子
factor_ab = DiscreteFactor(
variables=["A", "B"], cardinality=, values=[, ]
)
factor_bc = DiscreteFactor(
variables=["B", "C"], cardinality=, values=[, ]
)
factor_ca = DiscreteFactor(
variables=["C", "A"], cardinality=, values=[, ]
)
# 添加因子到模型
model.add_factors(factor_ab, factor_bc, factor_ca)
# 检查模型是否有效
assert model.check_model()
# 进行推理
inference = BeliefPropagation(model)
result = inference.query(variables=["A"], evidence={"B": 1, "C": 0})
print(result)
## 运行结果:
'''
+------+----------+
| A | phi(A) |
+======+==========+
| A(0) | 0.9901 |
+------+----------+
| A(1) | 0.0099 |
+------+----------+
'''
</code></pre>
<p>在这个例子中,我们定义了一个简单的<strong>马尔可夫网</strong>,包含三个变量:“A”、“B”和“C”。</p>
<p>我们通过因子来描述这些变量之间的关系,并使用<code>BeliefPropagation</code>类来进行推理。</p>
<p>通过指定证据(例如“B”为1,“C”为0),我们可以计算出“A”为真的概率。</p>
<h1 id="4-两者比较">4. 两者比较</h1>
<p><strong>贝叶斯网络</strong>和<strong>马尔可夫网</strong>虽然都是概率图模型,但它们在表示和推理上有很大的不同。</p>
<p>它们的主要区别在于:</p>
<table>
<thead>
<tr>
<th>特性</th>
<th>贝叶斯网络</th>
<th>马尔可夫网络</th>
</tr>
</thead>
<tbody>
<tr>
<td>图类型</td>
<td>有向无环图</td>
<td>无向图</td>
</tr>
<tr>
<td>依赖关系</td>
<td>因果方向性</td>
<td>对称相关关系</td>
</tr>
<tr>
<td>参数化</td>
<td>条件概率表(CPT)</td>
<td>势函数(Potentials)</td>
</tr>
<tr>
<td>归一化</td>
<td>自动归一化</td>
<td>需要计算配分函数Z</td>
</tr>
<tr>
<td>典型应用</td>
<td>诊断系统、基因分析</td>
<td>图像分割、社交网络分析</td>
</tr>
</tbody>
</table>
<p>从应用场景来看,贝叶斯网络常用于:</p>
<ul>
<li><strong>医疗诊断</strong>:根据症状和检查结果推断疾病的可能性。</li>
<li><strong>风险评估</strong>:根据各种因素评估项目或投资的风险。</li>
<li><strong>自然语言处理</strong>:用于语言模型中,表示词之间的依赖关系。</li>
</ul>
<p>而马尔可夫网常用于:</p>
<ul>
<li><strong>图像处理</strong>:用于图像分割和目标识别,表示像素之间的相似性。</li>
<li><strong>社交网络分析</strong>:表示用户之间的相互影响和关系。</li>
<li><strong>生物信息学</strong>:用于蛋白质结构预测,表示氨基酸之间的相互作用。</li>
</ul>
<p>总得来说,<strong>概率图模型</strong>是处理不确定性的瑞士军刀。</p>
<p><strong>贝叶斯网络</strong>擅长捕捉因果关系,<strong>马尔可夫网络</strong>则精于表达相关约束。</p>
<p>实际应用中常将二者结合(如链图模型),让图结构成为我们理解复杂概率关系的导航图。</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/18920426
頁:
[1]