
拓扑数据分析(Topological Data Analysis,简称TDA)是一种基于拓扑学的数据分析方法,它可以在不同的数据表示下捕捉数据的结构和形状(主要是从拓扑的结构出发),帮助研究者更好地理解和分析数据中所蕴藏的拓扑特征,从而达到对数据所展现出特殊性质的刻画。
传统的数据分析方法通常基于欧氏空间中的距离度量,例如聚类、降维和分类等方法。但这些方法通常不能很好地处理具有复杂结构和形状的数据,如曲线、具有规律的时间序列、流形和网络等。TDA则利用拓扑学的思想,将数据转换为一个代数结构(如单纯复形),并利用其拓扑特性来描述数据的结构和形状。
TDA的核心是持续同调(Persistent Homology),它是一种计算数据拓扑特征的方法,可以在不同尺度下捕捉数据的拓扑结构,生成一个称为条形码(Barcodes)的数据结构,该结构可以帮助研究者确定数据中的主要拓扑特征。其主要的数学思想源自代数拓扑,持续同调提供了一种可量化且稳定的方法来研究数据的形状 (Shape of Data)。持续同调主要关注 k 维洞(k-Dimensional Holes)的生成、消亡及持续时间等,通过对 k 维洞的研究进而反映拓扑空间的重要信息。
TDA在实际应用中具有广泛的应用,例如在生物学、材料科学、图像处理、机器学习等领域中,可以帮助研究者理解和分析不同类型的数据,为问题提供新的解决方法和思路。同时,随着计算机技术的发展和持久同调计算算法的优化,TDA也变得越来越成熟和实用。近年来,已经有大量使用持续同调的论文关注其在深度学习,人工智能的问题,解决人工神经网络构建的拓扑特征的问题。
持续同调(Persistent Homology)是拓扑数据分析(TDA)中的一个重要方法,它能够从数据中提取出拓扑特征,并将这些特征表示为一种称为同调群的代数结构。而单纯复形(Simplicial Complex)则是构建持续同调的基本数据结构之一。
单纯复形是一种基于点、线、面等基本构件的拓扑空间,其中基本构件称为单纯形(simplex)。一个k维单纯形是由k+1个不共面的点组成的凸包,其中0维-单纯形为点,1维-单纯形为线段,2维-单纯形为三角形,依此类推。
在持续同调的计算中,我们需要将数据中的点集构建成一个单纯复形,并计算其持久同调。具体来说,我们可以通过滤流(Filtration)【不理解?没关系。看下面的链接。】对数据进行处理,得到一系列的阈值,然后在每个阈值下构建一个单纯复形,计算出其同调群和同调环等拓扑特征,并将这些特征表示为一系列称为条形码Barcodes的线段(持续性图与条形码等价)。Barcodes中每个线段表示一个同调类在一定范围内存在的时间长度,因此可以表示数据中拓扑特征的持续性质。
除了单纯复形之外,还有其他一些用于构建拓扑空间的数据结构,如Alpha复形,Witness复形和Rips复形等。这些数据结构可以更好地处理非线性数据和噪声数据,同时还可以提高持续同调计算的效率和精度。但总的来说,单纯复形仍是最常用和基础的拓扑数据结构之一。
需要注意的是,构建单纯复形和计算持久同调需要一定的计算资源和算法支持。通常情况下,我们可以使用一些拓扑数据分析工具库,如GUDHI、JavaPlex,Ripser,Giotto-tda,Scikit-tda等,来方便地进行拓扑数据分析。
简单地说,使用这些工具库或者软件包,扔给它你需要判断的数据(可以为点云,也可以为距离矩阵,也可以是图片等等),通过计算就可以返回各个对象的生成、消亡、持续时间,最终以条形码的形式直观的告诉你各个对象的拓扑特征。如果需要对各个拓扑特征进行数值分析,包括持续性景观图(persistent landsccape、Wasserstein距离,Bottleneck距离等等)即可通过下一步的计算实现。
主要尝试过3种计算工具,JavaPlex,GUDHI、Ripser。前两个的简单教程可链接:
(ChatGPT帮忙写的,大差不差)GUDHI(The Geometric Understanding of Data through Topological Inference)是一个C++编写的开源软件库,旨在提供拓扑数据分析的计算和可视化工具,支持各种拓扑空间的构建、拓扑特征的计算和持续同调的分析。
GUDHI的主要功能包括:
GUDHI的优点包括:
总的来说,GUDHI是一个功能强大的拓扑数据分析软件库,并且已经在python中可以直接调用,Pip即可,非常方便。适用于各种规模的数据处理任务,特别是对于需要计算持续同调的应用场景。由于其丰富的拓扑分析工具和算法,GUDHI也被广泛应用于生物学、材料科学、图像处理、机器学习等领域。
对于普通计算持续同调的Betti数,各维条形码,持续性图,持续时间我还是更推荐用Python库,对于Javaplex,有兴趣,有条件可以一试。
以6个点云数据构成的数据进行单纯复形的构建以及持续同调计算演示,构建的单纯复形的滤值选取为2.
由于滤值选取为2,因此距离不超过2的点之间形成连接,单纯复形(VR)构建完成,其中:
0维单形:[0], [1], [2], [3], [4], [5],滤值为0。
1维单形:[0,4], [1,4], [1,5], [2,5], [0,1], [0,3], [1,2], [2,3],滤值为 或2。
2维单形:[0,1,4], [1,2,5],滤值为2。
上述复形构建及可视化在Matlab中完成,各单形的顶点及其滤值均可获得。计算所得条形码信息如下所示,即出现单连通特征,并且出现1个1维洞,其持续时间为[0,inf)。
此外,计算了1维单形的边界矩阵,其中的行索引为低维单形及[0]~[5],而列索引分别为1维单形,其顺序由滤值、顶点索引决定。矩阵第一列说明第一个1-维单形的边界为[0]和[4]。
铺垫了这么多,终于进入正题。
Gudhi工具箱官网:https://gudhi.inria.fr/
Gudhi的python接口地址:https://github.com/GUDHI
本文参考的GUDHI的python计算包Tutorial:https://gudhi.inria.fr/python/latest/
GUDHI的Python模块首先给使用者介绍了与持续同调相关的基础知识,并且按模块提供了相应的用户手册,非常友好!主要可分为:
我们主要关注VR复形的构建,对于其他复形,可参照相同的方法对应用户手册进行。用户可以自己手动自定义单纯复形,例如以下代码由ChatGPT给出,构建了包含3个0维单形及两个1维单形的1维复形:
至此便完成了单纯复形的构建,可以看出GUDHI是通过RipsComplex(parameters, max_edge_length, sparse )方法由simplex_tree的形式来构建单纯复形的。parameters是构建单纯复形的点云数据((List[List[float]]) – A list of points in d-Dimension)或者距离矩阵((List[List[float]]) – A distance matrix (full square or lower triangular)),max_edge_length是构建单纯复形的最大滤值,sparse可构建一个稀疏复形来近似单纯复形,通常在数据量较大需要过多计算资源时考虑。可参考稀疏近似(Sparse approximation)方法
构建完复形之后,结果保存到rips对象中,接下来调用create_simplex_tree(max_dimension)方法来构建VR滤流,参数max_dimension为复形构建的最大维数。最终所计算得到的单纯复形保存为simplex_tree。
注意,到目前为止,只进行了单纯复形的构建,还未计算其持续同调结果。调用simplex_tree的方法有很多,具体内容可参见官网,下面给出常见的方法及输出结果:
获取所得复形中的所有单形及其对应的滤值:
也可通过调用get_skeleton(dim)方法获取所得复形中0 到 dim 维的所有单形及其对应的滤值:
此外,gudhi还提供了多个针对于单形(simplex)本身结构的调用函数:
以上计算到目前为止,只能获取到滤流中各个单形的性质,还无法获得该点云数据具体的拓扑特征,为获取条形码等,先对单纯复形simplex_tree进行持续同调的计算:
接下来获取持续同调的各种信息:
继续计算k维特征的条形码:
完成了持续同调的计算,可获取到给定数据在各维空间上的持续时间。GUDHI提供了与深度学习结合的模块,如在simplex_tree中的tensor_flow相结合,便可判断所给定的数据是否满足相应的拓扑特征(例如:是否出现类似8字型的2个圈,以此来达到后续深度学习的延伸)。详细的叙述内容,可以参考:
