"""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()