第 7 章 Lower-Star 过滤 VR 过滤适合点云。对图像像素网格或时间序列,更自然的是 Lower-Star(下星)过滤:函数值随过滤参数单调上升,像素/时刻按灰度或数值「从低到高」加入。本章讲原理与 Ripser.py 中的实现思路。 7.1 Lower-Star 与 VR 的区别 | Vietoris-Rips | Lower-Star 输入 | 点云 / 距离矩阵 | 网格 + 函数值(灰度、高程、时序值) 过滤参数 | 距离半径 ε | 函数阈值 t 单纯形何时出现 | 边长 ≤ ε | 顶点函数值 ≤ t,且满足下星条件 典型应用 | 形状、聚类 | 图像拓扑、时序峰值结构 7.2 下星条件(直觉) 把每个网格点 v 配上函数值 f(v)。
VR 过滤适合点云。对图像像素网格或时间序列,更自然的是 Lower-Star(下星)过滤:函数值随过滤参数单调上升,像素/时刻按灰度或数值「从低到高」加入。本章讲原理与 Ripser.py 中的实现思路。
| Vietoris-Rips | Lower-Star | |
|---|---|---|
| 输入 | 点云 / 距离矩阵 | 网格 + 函数值(灰度、高程、时序值) |
| 过滤参数 | 距离半径 ε | 函数阈值 t |
| 单纯形何时出现 | 边长 ≤ ε | 顶点函数值 ≤ t,且满足下星条件 |
| 典型应用 | 形状、聚类 | 图像拓扑、时序峰值结构 |
把每个网格点 v 配上函数值 f(v)。在阈值 t 时,允许出现的 k-单纯形 σ 需满足:
Sublevel set(下水平集) 视角:({x : f(x) \leq t}) 随 t 增大而扩张,在其上构造复形。
灰度图像像素 (i,j) 值 f(i,j) t 小:只有暗像素(低值)活跃 → 少量 H0 分量 t 中:亮区连通 → H0 合并;出现「环状」亮斑 → H1 t 大:全图连通,高维特征 death
Ripser.py 文档教程中的典型流程(概念性代码):
import numpy as np from ripser import lower_star_img from persim import plot_diagrams # 灰度图 (H, W),float ndarray image = ... # 例如 ndimage 读入后转 float # lower_star_img 内部构造稀疏 Lower-Star 距离矩阵并调用 ripser # 默认只算 H0(0 维持久图),返回 ndarray (n_pairs, 2) dgm_h0 = lower_star_img(image) plot_diagrams([dgm_h0], labels=['H0'], show=True) # 找局部极大(上水平集):传入负图像 dgm_super = lower_star_img(-image)
💡
lower_star_img把每个像素当顶点、8 邻域连边,边权为两端像素值的 max(下星条件)。这是 Ripser.py 对外的公开 API 之一。
| 特征 | 可能含义 |
|---|---|
| H0 长条 | 不同亮度区域合并 |
| H1 高持久 | 亮/暗区域中的环状结构(洞、孔) |
| 噪声 | 大量短 bar,靠近对角线 |
一维时间序列 (f(t_0), \ldots, f(t_{n-1})) 可视为 路径图 上的函数:
顶点:时刻 0, 1, ..., n-1 边:相邻时刻 过滤:按 f 值从低到高激活顶点,边在两端都激活时出现
import numpy as np from scipy import sparse from ripser import ripser signal = np.sin(np.linspace(0, 4*np.pi, 200)) + 0.1*np.random.randn(200) n = len(signal) # 时序 Lower-Star:顶点=时刻,相邻时刻连边,边权=max(f[i], f[j]) rows, cols, vals = [], [], [] for i in range(n): rows.append(i); cols.append(i); vals.append(signal[i]) # 顶点 for i in range(n - 1): w = max(signal[i], signal[i + 1]) rows.extend([i, i + 1]); cols.extend([i + 1, i]); vals.extend([w, w]) D = sparse.coo_matrix((vals, (rows, cols)), shape=(n, n)) result = ripser(D, distance_matrix=True, maxdim=0) dgm_h0 = result['dgms'][0]
官方 Notebook「Lower Star Time Series」给出类似构造;核心仍是 稀疏距离矩阵 + ripser。
时序 TDA 常用于:周期性检测、异常段(持久图突变)、与滑动窗口结合。
Lower-Star 本质仍是 单纯形过滤 + 持久同调——第 2 章 birth/death 含义不变,只是过滤参数从「距离」变为「函数值」。
图像/时序 + 函数 f │ ▼ Lower-Star 距离矩阵(或专用构造) │ ▼ ripser(..., distance_matrix=True) │ ▼ 持久图(解读方式同第 5 章)
| 步骤 | 原因 |
|---|---|
| 高斯平滑 | 抑制像素级噪声短 bar |
| 归一化 f | 稳定 birth/death 尺度 |
| 下采样 | 大图降低 n |
| 掩膜 ROI | 去掉背景干扰 |
暗背景上的亮环: t 低 → 只有背景连通(H0) t 到环亮度 → 环状亮区形成 H1 birth t 继续升 → 环内填满或环与外部合并 → H1 death
与第 1 章圆环点云 H1 类似,但 birth/death 是灰度阈值 而非欧氏半径。
ripser 引擎。下一章:代表上循环与系数域——do_cocycles 与 coeff 的深度用法。