"""ex01circlehello.py — 第 1 章 TDA 的 Hello World 目标:构造一个圆环点云,计算 H0/H1 持久同调,画出第一张持久图。 对应教程:tutorials/01-environment.md 1.4 节。 预期: H0:一个长条(最后合并的连通分量),其余靠近对角线 H1:一个明显远离对角线的点(圆环的洞) 运行: python ex01circlehello.py """ import numpy as np from ripser import ripser from persim import plotdiagrams import matplotlib.
"""ex01_circle_hello.py — 第 1 章 TDA 的 Hello World
目标:构造一个圆环点云,计算 H0/H1 持久同调,画出第一张持久图。
对应教程:tutorials/01-environment.md 1.4 节。
预期:
运行:
python ex01_circle_hello.py
"""
import numpy as np
from ripser import ripser
from persim import plot_diagrams
import matplotlib.pyplot as plt
from common import sample_circle, print_diagram_summary, top_features
def main():
data = sample_circle(n=120, noise=0.08, seed=42)
# maxdim=1:计算 H0 与 H1 result = ripser(data, maxdim=1) dgms = result['dgms'] print_diagram_summary(dgms, "圆环点云持久同调") # 找 H1 最显著的特征 top, pers = top_features(dgms[1], k=1) print(f"\nH1 最显著特征:birth={top[0,0]:.3f} " f"death={top[0,1]:.3f} persistence={pers[0]:.3f}") # 可视化:散点 + 持久图 并排 fig, axes = plt.subplots(1, 2, figsize=(11, 4.5)) axes[0].scatter(data[:, 0], data[:, 1], s=15, alpha=0.7) axes[0].set_aspect('equal') axes[0].set_title('圆环点云') axes[0].grid(alpha=0.3) plot_diagrams(dgms, ax=axes[1], labels=['H0', 'H1'], show=False) axes[1].set_title('持久图') plt.tight_layout() plt.show()
if name == "main":
main()