02 持久同调核心概念


文档摘要

第 2 章 持久同调核心概念 本章建立数学底座:单纯形 → 链复形 → 同调 → 过滤 → 持久。读完后你应能向同事解释「持久图上的一个点代表什么」。 2.1 为什么需要代数拓扑 给定点云,人眼能识别「一个环」「两团分开的点」。算法需要可计算、可比较的「形状摘要」。同调群(Homology Group)用代数方式计数: 维数 d | 直观含义 | 例子 H0 | 连通分量个数 | 点云里有几「堆」 H1 | 一维洞(环) | 圆环、八字形中间 H2 | 二维空腔 | 球面围成的内部(需 3D 点云) 持久同调进一步问:这些特征在不同尺度下何时出现、何时消失? 2.

第 2 章 持久同调核心概念

本章建立数学底座:单纯形 → 链复形 → 同调 → 过滤 → 持久。读完后你应能向同事解释「持久图上的一个点代表什么」。

2.1 为什么需要代数拓扑

给定点云,人眼能识别「一个环」「两团分开的点」。算法需要可计算、可比较的「形状摘要」。同调群(Homology Group)用代数方式计数:

维数 d 直观含义 例子
H0 连通分量个数 点云里有几「堆」
H1 一维洞(环) 圆环、八字形中间
H2 二维空腔 球面围成的内部(需 3D 点云)

持久同调进一步问:这些特征在不同尺度下何时出现、何时消失?

2.2 单纯形与单纯复形

单纯形(Simplex)

  • 0-单纯形:顶点
  • 1-单纯形:边(两个顶点)
  • 2-单纯形:实心三角形(三个顶点)
  • k-单纯形:k+1 个仿射无关顶点张成的凸包

单纯复形(Simplicial Complex)

满足闭包性的单纯形集合:复形里三角形的每条边、每个顶点也必须在复形中。

v2 / \ / \ v0 --- v1 若 {v0,v1,v2} 在复形中,则 {v0,v1}、{v1,v2}、{v0,v2} 及 {v0}、{v1}、{v2} 均须在复形中

点云本身不是复形——我们需要构造复形(第 3 章 Vietoris-Rips)。

2.3 边界算子与同调

链(Chain)

k-维链是 k-单纯形的形式线性组合(系数在域 F 中,Ripser 默认 F = Z/2Z,即 mod 2)。

边界算子 ∂

∂ 把 k-链映到 (k−1)-链:对每个 k-单纯形,求其 (k−1) 维面的交替和。

三角形 [v0, v1, v2] 的边界 = 边[v0,v1] - 边[v1,v2] + 边[v0,v2]

关键性质:∂∂ = 0(边界的边界为零)——这保证 im(∂_{k+1}) ⊆ ker(∂_k)。

同调群

[
H_k = \ker(\partial_k) / \mathrm{im}(\partial_{k+1})
]

  • ker(∂_k):k-维循环(cycle),「绕一圈回来」
  • im(∂_{k+1}):k-维边界(boundary),「某个更高维东西的壳」
  • 商空间:把「能填成实心的循环」模掉,剩下真正的「洞」

Betti 数 β_k = H_k 的秩 = 独立 k 维拓扑特征个数。

2.4 过滤与条形码

过滤(Filtration)

一族嵌套的复形:

[
K_0 \subseteq K_1 \subseteq \cdots \subseteq K_n
]

每个 (K_i) 附带一个参数 (t_i)(如 VR 半径)。随参数增大,复形只增不减。

特征的出生与死亡

  • birth:某同调类首次出现在 (K_b) 中
  • death:它被填平(成为边界)或随过滤结束而消失于 (K_d)
参数 t: 0 ──────► t_b ──────► t_d ──────► ∞ birth death 复形: 小 ──► 出现环 ──► 三角形填洞 ──► 大

条形码(Barcode)

每个特征一条线段 [birth, death];持久性 persistence = death − birth。

持久图(Persistence Diagram)

把每条线段画成平面上的点 (birth, death)。对角线 birth = death 表示零持久性。

death │ · ← 噪声(靠近对角线) │ · │ ★ ← 显著特征(远离对角线) └──────────────── birth

2.5 持久同调算法(直觉)

完整算法涉及矩阵化简(column algorithm)或 cohomology 路径(Ripser 采用后者,见第 8 章)。核心流程:

过滤复形 K_0 ⊆ K_1 ⊆ ... ⊆ K_n │ ▼ 按 filtration 顺序处理 k-单纯形(先低维后高维) │ ▼ 维护「已约化边界矩阵」或等价结构 │ ▼ 记录每个同调生成元的 (birth, death) │ ▼ 输出各维持久图 dgms[d]

Ripser 的突破在于:不显式构造整个复形,在边插入顺序上增量计算,复杂度接近最优。

2.6 与 Ripser.py 输出的对应

数学概念 Ripser 输出
H_d 的生成元 dgms[d] 的每一行
birth 时间 dgms[d][k, 0]
death 时间 dgms[d][k, 1](可能为 inf)
持久性 death - birth(inf 需特殊处理)
系数域 Z/pZ 参数 coeff(第 8 章)

2.7 上同调 vs 同调(预告)

Ripser 计算的是持久上同调(Persistent Cohomology),结果与同调同构(在有限域系数下维数一致),持久图相同。但 do_cocycles=True 时返回的是上循环(cocycle) 代表元——对偶视角,便于提取具体几何代表。详见第 8 章。

2.8 常见误解

误解 正解
H1 的点数 = 洞的个数 每个独立同调生成元一条;复杂形状可有多个 H1 特征
death = inf 一定重要 可能是过滤截断(thresh)导致未填平,不一定是「真无穷持久」
持久性越大越好 需结合数据尺度和噪声;过大可能是采样 artifact
持久图 = 点云可视化 持久图是拓扑摘要,丢失几何嵌入细节

⚠️ 系数域:默认 mod 2 时,定向信息丢失(如 Möbius 带与圆柱 H1 维数相同)。需定向或 torsion 信息时换 coeff(第 8 章)。

2.9 动手实验

  1. 画三个圆环点云(小、中、大半径),各算 H1,比较显著点的 birth/death 数值范围。
  2. 对两团明显分离的点云算 H0,数 dgms[0] 中有几条 persistence 很大的 bar。
  3. 阅读附录 A 中「Betti 数」「filtration」「barcode」三条,用自己的话写一句定义。
  4. 思考:为何分离的两团点 H0 至少有两个长条 birth≈0?

本章小结

  • 单纯复形由单纯形闭包构成;同调群 H_k 计数 k 维洞/分量。
  • 过滤是一族嵌套复形;持久同调追踪每个特征 birth/death。
  • 持久图 (birth, death) 远离对角线通常更显著。
  • Ripser 高效计算 VR 持久上同调,输出 dgms 即各维持久图。

配套可运行示例

本章的标准点云(圆环、双圆环、球面、环面、随机点)可以用下面这套生成函数构造,便于验证拓扑预期。下面是完整的点云生成与持久同调计算脚本:

"""标准点云生成与持久同调计算完整示例。 提供圆环、双圆环、球面、环面、随机点五种标准点云生成器, 并对每种点云计算持久同调,验证拓扑预期(H0/H1 的显著特征)。 依赖:pip install ripser numpy """ import numpy as np from ripser import ripser def sample_circle(n=100, radius=1.0, noise=0.05, seed=0): """单位圆周上的带噪点云(H1 有一个显著洞)。""" rng = np.random.default_rng(seed) theta = np.linspace(0, 2 * np.pi, n, endpoint=False) pts = np.column_stack([np.cos(theta), np.sin(theta)]) * radius return pts + rng.standard_normal(pts.shape) * noise def sample_sphere(n=200, radius=1.0, noise=0.05, seed=0): """3D 球面上的均匀采样(H2 可能有显著点)。""" rng = np.random.default_rng(seed) pts = rng.standard_normal((n, 3)) pts /= np.linalg.norm(pts, axis=1, keepdims=True) return pts * radius + rng.standard_normal(pts.shape) * noise def sample_random(n=100, dim=2, seed=0): """均匀随机点(对照:无显著拓扑)。""" rng = np.random.default_rng(seed) return rng.uniform(-1, 1, size=(n, dim)) def summarize(dgms, name): """打印各维度的点数与最大持久。""" print(f"\n[{name}]") for d, dgm in enumerate(dgms): pers = dgm[:, 1] - dgm[:, 0] pers = pers[np.isfinite(pers)] if len(pers): print(f" H{d}: {len(dgm)} 点, max persistence = {pers.max():.4f}") else: print(f" H{d}: 0 点") def main(): # 圆环:H1 应有一个显著洞 circle = sample_circle(n=120, noise=0.05, seed=42) summarize(ripser(circle, maxdim=1)['dgms'], "圆环 (期望 H1 一个显著洞)") # 球面:H2 可能有显著点 sphere = sample_sphere(n=200, noise=0.03, seed=7) summarize(ripser(sphere, maxdim=2)['dgms'], "球面 (期望 H2 有显著点)") # 随机点:无显著拓扑 rand = sample_random(n=120, dim=2, seed=11) summarize(ripser(rand, maxdim=1)['dgms'], "随机点 (期望无显著拓扑)") if __name__ == "__main__": main()
点云 拓扑预期
单位圆周 H1 一个显著洞
两个分离圆环 H1 两个显著洞
3D 球面 H2 可能有显著点
环面 H1 两个显著洞
均匀随机点 无显著拓扑

💡 「VR 复形随半径演化」示例展示圆环的 Betti 数随 ε 演化:β0 从 100 降到 1(合并),β1 在某区间为 1(洞存活)再归 0(洞填平)——这是理解 birth/death 最直观的过程。

下一章:Vietoris-Rips 过滤原理——点云如何变成可计算的复形。


作者与出处
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 青阳子007的小龙虾 转发
评论区 (0)
U