PRML Chapter 8. Graphical Models - 8.2.1 Three example graphs

本文解析了三种基本条件独立性的图示结构:tail-to-tail、head-to-tail及head-to-head,并讨论了在这些结构中,当观察到变量c时,变量a与b是否独立的问题。

8.2.1 Three example graphs

书中说明了三种基本条件独立的结构

(1) tail-to-tail   (从a,b的角度看,a和b都是c的tail)

如图 Figure 8.15


整个图表示abc的联合概率 p(a,b,c),此时可以根据图8.15的结构推出 p(a,b,c) = p(a|c)p(b|c)p(c)

如果同时两边对c取边缘概率(marginalizing both sides with respect to c),则可以得到式8.24

通常情况下,式8.24右边那部分是不会等于p(a)*p(b)的,所以a,b是不相互独立的。

但是如果c是作为输入而被已观察到了,情况就变成了图Figure 8.16


此时,整个图如果要关心a,b之间的联合概率的话,就要表示成 p(a,b|c)了,因为c已被观察到,所以a,b之间的联合概率是基于c的条件概率。

所以      因此由这个式子可以看出a,b是关于c条件独立的

(2) head-to-tail  (从a,b的角度看,a是c的head,b是c的tail)

如图 Figure 8.17  变化至  8.18

   ->        

对于图8.17,

两边对c取边缘概率得    所以a,b不独立。

而对于图8.18,可知:

,因此图8.18中a与b相互独立。


(3) head-to-head (从a,b的角度看,a和b都是c的head)

如图8.19变化至8.20

 ->

        对于图8.19,p(a,b,c)=p(a)p(b)p(c|a,b),两边对c取边缘直接可以得到 p(a,b)=p(a)p(b),因此这个时候没有观察到c反而倒是a,b相互独立,而如果观察到c呢?就变成了图8.20中的p(a,b|c)=p(a,b,c)/p(c)=p(a)p(b)p(a,b|c)/p(c),不等于p(a|c)p(b|c),因此a和b反而不独立。

        由以上三个基本图可以看出,三个随机变量a,b,c的联合概率的分解方法实际上是和它们之间的依存关系有关的,不能随便分解,如果分解成p(a,b,c)=p(a,b|c)p(c),那么就默认了tail-to-tail这种结构,如果分解成其他,则有其他相应的结构。同样关于a,b,c三者之间的概率,不同结构下,观察到c的情况下,a与b可能独立,也可能不独立!

P377

提供了一个例子,说明head-to-head的情况下,两个图8.20中a,b是如何在已知c的情况下相互影响的。


这个路径 `/home/datasets/prml/computervision/re-id/sysu-mm01/ori_data` 是一个 **Linux 风格的绝对路径**,但在 Windows 系统上直接使用会导致 `FileNotFoundError`,因为 Windows 的路径格式为 `C:\path\to\file` 或 `D:\data\sets`。以下是解决方案: --- ### **问题分析** 1. **路径格式不兼容**: - Linux 使用 `/` 作为路径分隔符,Windows 默认使用 `\`(尽管 Python 会自动转换 `/` 为 `\`,但盘符 `C:` 等缺失会导致问题)。 - Windows 没有 `/home` 目录,这是 Linux 的默认用户目录。 2. **数据集位置问题**: - 如果数据集实际存储在 Windows 的某个目录(如 `D:\datasets\...`),需修改路径为正确的 Windows 路径。 --- ### **解决方案** #### **方法 1:修改为 Windows 路径** 将路径改为 Windows 实际存储位置,例如: ```python data_path = r"D:\datasets\prml\computervision\re-id\sysu-mm01\ori_data" # 使用原始字符串避免转义 ``` 或使用双反斜杠: ```python data_path = "D:\\datasets\\prml\\computervision\\re-id\\sysu-mm01\\ori_data" ``` #### **方法 2:动态适配不同操作系统** 使用 `os.path` 或 `pathlib` 自动处理路径分隔符,并根据操作系统选择根目录: ```python import os # 定义不同系统的根目录 if os.name == "nt": # Windows base_dir = r"D:\datasets" else: # Linux/macOS base_dir = "/home/datasets" data_path = os.path.join(base_dir, "prml", "computervision", "re-id", "sysu-mm01", "ori_data") ``` #### **方法 3:使用环境变量或配置文件** 将路径存储在环境变量或配置文件中,避免硬编码: ```python import os data_path = os.getenv("DATASET_PATH", default=r"D:\default\path\if\env\missing") ``` 或在配置文件中定义: ```json // config.json { "dataset_path": "D:/datasets/prml/..." } ``` #### **方法 4:检查路径是否存在** 在代码中添加校验逻辑,提示用户输入正确路径: ```python import os data_path = input("请输入数据集路径(如 D:\\datasets\\...): ").strip() while not os.path.isdir(data_path): data_path = input("路径无效!请重新输入: ").strip() ``` --- ### **调试建议** 1. **打印路径**: 在代码中添加 `print(f"数据集路径: {data_path}")`,确认路径是否符合预期。 2. **检查路径是否存在**: ```python if not os.path.exists(data_path): print(f"错误:路径 {data_path} 不存在!") ``` 3. **跨平台测试**: 在 Linux 和 Windows 上分别运行脚本,验证路径兼容性。 --- ### **常见问题** #### **Q1: 为什么 Python 在 Windows 上能识别 `/` 但路径仍报错?** - Python 会自动将 `/` 转换为 `\`,但如果路径缺少盘符(如 `C:`),Windows 无法定位文件。 #### **Q2: 如何将 Linux 路径快速转换为 Windows 路径?** - 手动替换 `/home` 为 Windows 的实际盘符(如 `D:\`)。 - 使用脚本动态替换: ```python linux_path = "/home/datasets/prml/..." windows_path = linux_path.replace("/home/datasets", r"D:\datasets") ``` #### **Q3: 数据集路径应该放在哪里?** - 推荐统一存放路径(如 `D:\datasets` 或 `C:\data`),避免硬编码到用户目录(如 `/home/ubuntu`)。 --- ### **总结** - **优先修改为 Windows 实际路径**(如 `D:\datasets\...`)。 - **使用 `os.path` 或 `pathlib` 处理跨平台路径**。 - **添加路径校验逻辑**,避免程序因路径错误崩溃。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值