示例03 sklearn 风格接口与 thresh 调参


文档摘要

"""ex03sklearnrips.py — 第 1、4 章 sklearn 风格 Rips 类与 thresh 调参 对应教程:tutorials/01-environment.md 1.6、1.7 节,tutorials/04-ripser-api.md。 演示: Rips 类的 fit / fittransform / transform 用法 thresh 截断对边数与速度的影响 同一 Rips 对象对多个点云 transform 运行: python ex03sklearnrips.

"""ex03_sklearn_rips.py — 第 1、4 章 sklearn 风格 Rips 类与 thresh 调参

对应教程:tutorials/01-environment.md 1.6、1.7 节,tutorials/04-ripser-api.md。

演示:

  • Rips 类的 fit / fit_transform / transform 用法
  • thresh 截断对边数与速度的影响
  • 同一 Rips 对象对多个点云 transform

运行:
python ex03_sklearn_rips.py
"""

import time
import numpy as np
from ripser import Rips

from common import sample_circle, sample_random

def main():
np.random.seed(0)

data = sample_circle(n=200, noise=0.05, seed=0) # ── 1. Rips 类:构造时固定参数 ── rips = Rips(maxdim=1, thresh=1.0, verbose=False) dgms = rips.fit_transform(data) print("=== Rips.fit_transform ===") for d, dgm in enumerate(dgms): pers = (dgm[:, 1] - dgm[:, 0]) pers = pers[np.isfinite(pers)] print(f" H{d}: {len(dgm)} 点, max persistence = " f"{pers.max() if len(pers) else 0:.4f}") # rips 对象上还有 num_edges_、dgms_、dgm2all_ 等 print(f" num_edges_ = {rips.num_edges_ if hasattr(rips,'num_edges_') else '?'}") # ── 2. thresh 对速度与边数的影响 ── print("\n=== thresh 调参对比 ===") for thresh in [0.5, 1.0, 1.5, 2.0, np.inf]: t0 = time.perf_counter() r = rips.fit_transform(data) # 重新构造一个 Rips,因为 thresh 在构造时固定 r2 = Rips(maxdim=1, thresh=thresh, verbose=False) t0 = time.perf_counter() r2.fit_transform(data) dt = time.perf_counter() - t0 n_edges = getattr(r2, 'num_edges_', '?') print(f" thresh={str(thresh):>6s} time={dt:.3f}s edges={n_edges}") # ── 3. transform:对另一个点云复用参数 ── print("\n=== transform 另一点云 ===") random_data = sample_random(n=200, dim=2, seed=5) rips2 = Rips(maxdim=1, thresh=1.5) rips2.fit(data) # 用圆环「定标」 dgms_rand = rips2.transform(random_data) print(f" 随机点 H1 点数: {len(dgms_rand[1])}") print(" 对比:圆环 H1 显著点数应远多于随机点(第 5 章主题)")

if name == "main":
main()


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