第 8 章 代表上循环与系数域 Ripser 计算 持久上同调 而非同调本身——持久图相同,但可额外输出 代表上循环(cocycles)。本章还讲解 系数域 Z/pZ 的选择,以及 Möbius 带等需要定向信息的案例。 8.1 同调 vs 上同调(对偶视角) | 同调 Homology | 上同调 Cohomology 链 | k-链 on k-单纯形 | k-上链 on k-单纯形 算子 | 边界 ∂ | 上边界 δ(∂ 的转置) 群 | Hk = ker ∂ / im ∂ | H^k = ker δ / im δ 持久图 | 相同(有限域系数下维数一致) | Ripser 实际计算路径 为什么 Ripser 用上同调:算法实现更高效(cohomology algorithm),且
Ripser 计算 持久上同调 而非同调本身——持久图相同,但可额外输出 代表上循环(cocycles)。本章还讲解 系数域 Z/pZ 的选择,以及 Möbius 带等需要定向信息的案例。
| 同调 Homology | 上同调 Cohomology | |
|---|---|---|
| 链 | k-链 on k-单纯形 | k-上链 on k-单纯形 |
| 算子 | 边界 ∂ | 上边界 δ(∂ 的转置) |
| 群 | H_k = ker ∂ / im ∂ | H^k = ker δ / im δ |
| 持久图 | 相同(有限域系数下维数一致) | Ripser 实际计算路径 |
为什么 Ripser 用上同调:算法实现更高效(cohomology algorithm),且 cocycle 代表元 便于提取具体几何信息。
import numpy as np from ripser import ripser # Möbius 带或圆环点云 data = ... # 适当采样 result = ripser(data, maxdim=1, coeff=17, do_cocycles=True) dgms = result['dgms'] cocycles = result['cocycles'] # cocycles[d][k] 与 dgms[d][k] 一一对应 print(len(dgms[1]), len(cocycles[1]))
cocycles[d][k] 是 ndarray,形状 (m, d+1):
dim=1 时每行 [i, j, value] 表示边 (i,j) 上的 cocycle 值
索引指向 原始点云,即使用 n_perm 子采样也映射回原索引。
对 H1 生成元,非零 cocycle 值所在的边往往形成 近似代表环:
import numpy as np def cocycle_support_edges(cocycle_1d): """提取 1-cocycle 非零边 (i,j)""" edges = [] for row in cocycle_1d: i, j, val = int(row[0]), int(row[1]), row[2] if val % 17 != 0: # 系数域 mod 17 示例 edges.append((min(i,j), max(i,j))) return edges cyc = cocycles[1][0] # 第一个 H1 特征 edges = cocycle_support_edges(cyc)
可视化:在点云上 高亮这些边,可看到「洞」绕哪一圈。
💡 对偶约定:文献中 cohomological birth 与 homological death 可对调;Ripser 输出仍采用 同调惯例 的 birth/death 标注持久图,与
dgms一致。
result = ripser(data, coeff=2) # 默认 Z/2Z result = ripser(data, coeff=17) # Z/17Z result = ripser(data, coeff=3) # Z/3Z
coeff 必须是素数 p,计算在 Z/pZ 上进行。
| coeff | 特点 |
|---|---|
| 2(默认) | 最快;无定向;torsion 信息丢失 |
| 奇素数 | 可检测某些 torsion 现象 |
| 大素数 | 更接近整数系数行为,计算更慢 |
官方教程「Moebius Strip And The Field of Coefficients」演示了换 coeff 对比持久图。
from ripser import Rips rips = Rips(maxdim=1, do_cocycles=True, coeff=3) rips.fit_transform(data) # transform 后 rips.cocycles_ # 与 result['cocycles'] 相同结构
| 需求 | 是否开启 |
|---|---|
| 只要持久图做分类 | 否(省内存与时间) |
| 解释「洞在哪」 | 是 |
| 映射回原始数据(边、三角形) | 是 |
| 与 cup product 等高级 TDA | 是(超出本教程范围) |
do_cocycles=False 时 cocycles 仍存在于 dict 中但为空列表。
cocycles 存储每个生成元的稀疏表示,维数高、特征多时 内存显著增加。建议:
maxdim 开启n_perm 或 thresh 缩小复形do_cocycles=True,画 cocycle 支撑边叠加在散点上。coeff=2 vs coeff=17,对比 H1 持久图是否一致(圆环通常一致)。dgms[1][k] 与 cocycles[1][k] 索引 k 一一对应。do_cocycles=True 得代表上循环,格式为 (索引..., 系数)。coeff 选择素数 p,默认 2 最快;定向/torsion 需更大 p 或不同域。下一章:工程实践要点——参数、性能、可复现与落地清单。