07 Lower-Star 过滤


文档摘要

第 7 章 Lower-Star 过滤 VR 过滤适合点云。对图像像素网格或时间序列,更自然的是 Lower-Star(下星)过滤:函数值随过滤参数单调上升,像素/时刻按灰度或数值「从低到高」加入。本章讲原理与 Ripser.py 中的实现思路。 7.1 Lower-Star 与 VR 的区别 | Vietoris-Rips | Lower-Star 输入 | 点云 / 距离矩阵 | 网格 + 函数值(灰度、高程、时序值) 过滤参数 | 距离半径 ε | 函数阈值 t 单纯形何时出现 | 边长 ≤ ε | 顶点函数值 ≤ t,且满足下星条件 典型应用 | 形状、聚类 | 图像拓扑、时序峰值结构 7.2 下星条件(直觉) 把每个网格点 v 配上函数值 f(v)。

第 7 章 Lower-Star 过滤

VR 过滤适合点云。对图像像素网格时间序列,更自然的是 Lower-Star(下星)过滤:函数值随过滤参数单调上升,像素/时刻按灰度或数值「从低到高」加入。本章讲原理与 Ripser.py 中的实现思路。

7.1 Lower-Star 与 VR 的区别

Vietoris-Rips Lower-Star
输入 点云 / 距离矩阵 网格 + 函数值(灰度、高程、时序值)
过滤参数 距离半径 ε 函数阈值 t
单纯形何时出现 边长 ≤ ε 顶点函数值 ≤ t,且满足下星条件
典型应用 形状、聚类 图像拓扑、时序峰值结构

7.2 下星条件(直觉)

把每个网格点 v 配上函数值 f(v)。在阈值 t 时,允许出现的 k-单纯形 σ 需满足:

  • 每个顶点函数值 ≤ t
  • σ 的 上星(upper star) 在过滤中合法——等价于 σ 是「当前已激活顶点」诱导复形中的极大合法单纯形

Sublevel set(下水平集) 视角:({x : f(x) \leq t}) 随 t 增大而扩张,在其上构造复形。

灰度图像像素 (i,j) 值 f(i,j) t 小:只有暗像素(低值)活跃 → 少量 H0 分量 t 中:亮区连通 → H0 合并;出现「环状」亮斑 → H1 t 大:全图连通,高维特征 death

7.3 图像 Lower-Star 工作流

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 解读

特征 可能含义
H0 长条 不同亮度区域合并
H1 高持久 亮/暗区域中的环状结构(洞、孔)
噪声 大量短 bar,靠近对角线

7.4 时间序列 Lower-Star

一维时间序列 (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 常用于:周期性检测异常段(持久图突变)、与滑动窗口结合。

7.5 与 VR 点云的衔接

Lower-Star 本质仍是 单纯形过滤 + 持久同调——第 2 章 birth/death 含义不变,只是过滤参数从「距离」变为「函数值」。

图像/时序 + 函数 f │ ▼ Lower-Star 距离矩阵(或专用构造) │ ▼ ripser(..., distance_matrix=True) │ ▼ 持久图(解读方式同第 5 章)

7.6 预处理建议

步骤 原因
高斯平滑 抑制像素级噪声短 bar
归一化 f 稳定 birth/death 尺度
下采样 大图降低 n
掩膜 ROI 去掉背景干扰

7.7 案例直觉:带孔亮斑

暗背景上的亮环: t 低 → 只有背景连通(H0) t 到环亮度 → 环状亮区形成 H1 birth t 继续升 → 环内填满或环与外部合并 → H1 death

与第 1 章圆环点云 H1 类似,但 birth/death 是灰度阈值 而非欧氏半径。

7.8 动手实验

  1. 对简单合成图(黑底白环)做 lower-star,看 H1 是否显著。
  2. 对同一图加椒盐噪声,比较 H1 最大 persistence 变化。
  3. 对正弦时间序列做 lower-star,观察周期数与 H0 bar 数量的关系。
  4. 回顾第 3 章:说明 Lower-Star 为何不需要点对距离矩阵的「全连接 VR」。

本章小结

  • Lower-Star 在网格/序列上按函数值从低到高过滤,适合图像与时序。
  • Ripser.py 提供图像与时序辅助构造,再接入 ripser 引擎。
  • 解读仍用 birth/death;预处理(平滑、归一化)对降噪很重要。
  • 与 VR 共享持久同调框架,过滤构造不同。

下一章:代表上循环与系数域——do_cocyclescoeff 的深度用法。


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