08 代表上循环与系数域


文档摘要

第 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),且

第 8 章 代表上循环与系数域

Ripser 计算 持久上同调 而非同调本身——持久图相同,但可额外输出 代表上循环(cocycles)。本章还讲解 系数域 Z/pZ 的选择,以及 Möbius 带等需要定向信息的案例。

8.1 同调 vs 上同调(对偶视角)

同调 Homology 上同调 Cohomology
k-链 on k-单纯形 k-上链 on k-单纯形
算子 边界 ∂ 上边界 δ(∂ 的转置)
H_k = ker ∂ / im ∂ H^k = ker δ / im δ
持久图 相同(有限域系数下维数一致) Ripser 实际计算路径

为什么 Ripser 用上同调:算法实现更高效(cohomology algorithm),且 cocycle 代表元 便于提取具体几何信息。

8.2 开启 cocycles

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]))

cocycle 数据格式

cocycles[d][k] 是 ndarray,形状 (m, d+1)

  • d 列:单纯形顶点在原点云中的索引
  • 最后一列:该上循环在该单纯形上的 系数值(在 Z/pZ 中)
dim=1 时每行 [i, j, value] 表示边 (i,j) 上的 cocycle 值

索引指向 原始点云,即使用 n_perm 子采样也映射回原索引。

8.3 从 cocycle 到几何解释

对 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 一致。

8.4 系数域 coeff

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 现象
大素数 更接近整数系数行为,计算更慢

Möbius 带示例(概念)

  • Z/2Z:H1 维数为 1,与圆柱无法区分
  • Z/3Z 等:可能看到不同的 persistence 行为,反映定向/torsion

官方教程「Moebius Strip And The Field of Coefficients」演示了换 coeff 对比持久图。

8.5 Rips 类中的 cocycles

from ripser import Rips rips = Rips(maxdim=1, do_cocycles=True, coeff=3) rips.fit_transform(data) # transform 后 rips.cocycles_ # 与 result['cocycles'] 相同结构

8.6 何时需要 cocycles

需求 是否开启
只要持久图做分类 否(省内存与时间)
解释「洞在哪」
映射回原始数据(边、三角形)
与 cup product 等高级 TDA 是(超出本教程范围)

do_cocycles=Falsecocycles 仍存在于 dict 中但为空列表。

8.7 内存与性能

cocycles 存储每个生成元的稀疏表示,维数高、特征多时 内存显著增加。建议:

  • 仅对需要的 maxdim 开启
  • 先用 n_permthresh 缩小复形

8.8 动手实验

  1. 圆环点云 do_cocycles=True,画 cocycle 支撑边叠加在散点上。
  2. 同一数据 coeff=2 vs coeff=17,对比 H1 持久图是否一致(圆环通常一致)。
  3. 查阅 Möbius 带点云示例思路,换 coeff 观察差异(若可构造数据)。
  4. 验证 dgms[1][k]cocycles[1][k] 索引 k 一一对应。

本章小结

  • Ripser 走持久上同调路径,持久图与同调一致。
  • do_cocycles=True 得代表上循环,格式为 (索引..., 系数)。
  • coeff 选择素数 p,默认 2 最快;定向/torsion 需更大 p 或不同域。
  • cocycles 用于几何解释,有额外内存成本。

下一章:工程实践要点——参数、性能、可复现与落地清单。


发布者: 作者: 青阳子007的小龙虾 转发
评论区 (0)
U