From 09df71f348af94584ec953259a258e5327d8ab27 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 17 Jun 2025 18:33:57 +0200 Subject: [PATCH 1/5] Move Tutos in a dedicated directory for more vibility on GitHub --- README.Rmd | 30 +- README.md | 66 +-- ...UDHI-ConfRegions-PersDiag-datapoints.ipynb | 447 ------------------ {Images => Tutos/Images}/CodeCogsEqnRp.gif | Bin {Images => Tutos/Images}/MatchingDiag.png | Bin {Images => Tutos/Images}/Pers14.PNG | Bin .../Images}/Simplex_tree_representation.png | Bin .../Images}/nappe_distance_avec_bruit.png | Bin .../Images}/nappe_distance_sans_bruit.png | Bin .../Images}/nappe_dtm_avec_bruit.png | Bin {Images => Tutos/Images}/pers.png | Bin {Images => Tutos/Images}/persistence.png | Bin .../Images}/sous_niveau_kPDTM2.png | Bin .../Images}/sous_niveau_kPDTM_cov2.png | Bin {Images => Tutos/Images}/sublevf.png | Bin {Images => Tutos/Images}/symbole_infini.png | Bin ...-Barycenters-of-persistence-diagrams.ipynb | 0 ...UDHI-ConfRegions-PersDiag-datapoints.ipynb | 443 +++++++++++++++++ .../Tuto-GUDHI-DTM-filtrations.ipynb | 0 ...-GUDHI-Expected-persistence-diagrams.ipynb | 0 .../Tuto-GUDHI-PyTorch-optimization.ipynb | 0 ...Quantization-of-persistence-diagrams.ipynb | 0 ...to-GUDHI-alpha-complex-visualization.ipynb | 0 .../Tuto-GUDHI-cover-complex.ipynb | 0 .../Tuto-GUDHI-cubical-complexes.ipynb | 0 .../Tuto-GUDHI-extended-persistence.ipynb | 0 .../Tuto-GUDHI-kPDTM-kPLM.ipynb | 0 .../Tuto-GUDHI-optimization.ipynb | 0 .../Tuto-GUDHI-persistence-diagrams.ipynb | 0 .../Tuto-GUDHI-persistent-entropy.ipynb | 0 .../Tuto-GUDHI-perslay-visu.ipynb | 0 .../Tuto-GUDHI-representations.ipynb | 0 .../Tuto-GUDHI-simplex-Trees.ipynb | 0 ...implicial-complexes-from-data-points.ipynb | 0 ...icial-complexes-from-distance-matrix.ipynb | 0 .../Corr_ProteinBinding/1anf.corr_1.txt | 0 .../Corr_ProteinBinding/1ez9.corr_1.txt | 0 .../Corr_ProteinBinding/1fqa.corr_2.txt | 0 .../Corr_ProteinBinding/1fqb.corr_3.txt | 0 .../Corr_ProteinBinding/1fqc.corr_2.txt | 0 .../Corr_ProteinBinding/1fqd.corr_3.txt | 0 .../Corr_ProteinBinding/1jw4.corr_4.txt | 0 .../Corr_ProteinBinding/1jw5.corr_5.txt | 0 .../Corr_ProteinBinding/1lls.corr_6.txt | 0 .../Corr_ProteinBinding/1mpd.corr_4.txt | 0 .../Corr_ProteinBinding/1omp.corr_7.txt | 0 .../Corr_ProteinBinding/3hpi.corr_5.txt | 0 .../Corr_ProteinBinding/3mbp.corr_6.txt | 0 .../Corr_ProteinBinding/4mbp.corr_7.txt | 0 .../datasets}/ElongatedTorus.txt | 0 .../datasets}/NoisyTrefoil180.txt | 0 {datasets => Tutos/datasets}/crater_tuto | Bin {datasets => Tutos/datasets}/data_acc | Bin .../datasets}/diff/mnist_test.csv | 0 {datasets => Tutos/datasets}/human.off | 0 {datasets => Tutos/datasets}/human.txt | 0 {datasets => Tutos/datasets}/mnist_test.csv | 0 {datasets => Tutos/datasets}/tore3D_1307.off | 0 {datasets => Tutos/datasets}/trefoil_dist | Bin .../utils}/KeplerMapperVisuFromTxtFile.py | 0 .../utils}/broken_links_scraper.py | 0 .../utils/persistence_statistics.py | 122 +++-- {utils => Tutos/utils}/utils_dtm.py | 0 {utils => Tutos/utils}/utils_epd.py | 0 {utils => Tutos/utils}/utils_quantization.py | 0 65 files changed, 545 insertions(+), 563 deletions(-) delete mode 100644 Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb rename {Images => Tutos/Images}/CodeCogsEqnRp.gif (100%) rename {Images => Tutos/Images}/MatchingDiag.png (100%) rename {Images => Tutos/Images}/Pers14.PNG (100%) rename {Images => Tutos/Images}/Simplex_tree_representation.png (100%) rename {Images => Tutos/Images}/nappe_distance_avec_bruit.png (100%) rename {Images => Tutos/Images}/nappe_distance_sans_bruit.png (100%) rename {Images => Tutos/Images}/nappe_dtm_avec_bruit.png (100%) rename {Images => Tutos/Images}/pers.png (100%) rename {Images => Tutos/Images}/persistence.png (100%) rename {Images => Tutos/Images}/sous_niveau_kPDTM2.png (100%) rename {Images => Tutos/Images}/sous_niveau_kPDTM_cov2.png (100%) rename {Images => Tutos/Images}/sublevf.png (100%) rename {Images => Tutos/Images}/symbole_infini.png (100%) rename Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb => Tutos/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb (100%) create mode 100644 Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb rename Tuto-GUDHI-DTM-filtrations.ipynb => Tutos/Tuto-GUDHI-DTM-filtrations.ipynb (100%) rename Tuto-GUDHI-Expected-persistence-diagrams.ipynb => Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb (100%) rename Tuto-GUDHI-PyTorch-optimization.ipynb => Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb (100%) rename Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb => Tutos/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb (100%) rename Tuto-GUDHI-alpha-complex-visualization.ipynb => Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb (100%) rename Tuto-GUDHI-cover-complex.ipynb => Tutos/Tuto-GUDHI-cover-complex.ipynb (100%) rename Tuto-GUDHI-cubical-complexes.ipynb => Tutos/Tuto-GUDHI-cubical-complexes.ipynb (100%) rename Tuto-GUDHI-extended-persistence.ipynb => Tutos/Tuto-GUDHI-extended-persistence.ipynb (100%) rename Tuto-GUDHI-kPDTM-kPLM.ipynb => Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb (100%) rename Tuto-GUDHI-optimization.ipynb => Tutos/Tuto-GUDHI-optimization.ipynb (100%) rename Tuto-GUDHI-persistence-diagrams.ipynb => Tutos/Tuto-GUDHI-persistence-diagrams.ipynb (100%) rename Tuto-GUDHI-persistent-entropy.ipynb => Tutos/Tuto-GUDHI-persistent-entropy.ipynb (100%) rename Tuto-GUDHI-perslay-visu.ipynb => Tutos/Tuto-GUDHI-perslay-visu.ipynb (100%) rename Tuto-GUDHI-representations.ipynb => Tutos/Tuto-GUDHI-representations.ipynb (100%) rename Tuto-GUDHI-simplex-Trees.ipynb => Tutos/Tuto-GUDHI-simplex-Trees.ipynb (100%) rename Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb => Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb (100%) rename Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb => Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1anf.corr_1.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1ez9.corr_1.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1fqa.corr_2.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1fqb.corr_3.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1fqc.corr_2.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1fqd.corr_3.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1jw4.corr_4.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1jw5.corr_5.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1lls.corr_6.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1mpd.corr_4.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/1omp.corr_7.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/3hpi.corr_5.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/3mbp.corr_6.txt (100%) rename {datasets => Tutos/datasets}/Corr_ProteinBinding/4mbp.corr_7.txt (100%) rename {datasets => Tutos/datasets}/ElongatedTorus.txt (100%) rename {datasets => Tutos/datasets}/NoisyTrefoil180.txt (100%) rename {datasets => Tutos/datasets}/crater_tuto (100%) rename {datasets => Tutos/datasets}/data_acc (100%) rename {datasets => Tutos/datasets}/diff/mnist_test.csv (100%) rename {datasets => Tutos/datasets}/human.off (100%) rename {datasets => Tutos/datasets}/human.txt (100%) rename {datasets => Tutos/datasets}/mnist_test.csv (100%) rename {datasets => Tutos/datasets}/tore3D_1307.off (100%) rename {datasets => Tutos/datasets}/trefoil_dist (100%) rename {utils => Tutos/utils}/KeplerMapperVisuFromTxtFile.py (100%) rename {utils => Tutos/utils}/broken_links_scraper.py (100%) rename persistence_statistics.py => Tutos/utils/persistence_statistics.py (51%) rename {utils => Tutos/utils}/utils_dtm.py (100%) rename {utils => Tutos/utils}/utils_epd.py (100%) rename {utils => Tutos/utils}/utils_quantization.py (100%) diff --git a/README.Rmd b/README.Rmd index 2ceac7a..dd03197 100644 --- a/README.Rmd +++ b/README.Rmd @@ -1,20 +1,20 @@ --- title: "Tutorials for Topological Data Analysis with the Gudhi Library" -output: +output: github_document: pandoc_args: --webtex --- ```{r setup, include=FALSE} knitr::opts_chunk$set( - echo = FALSE, + echo = FALSE, fig.align = "center" ) ``` Topological Data Analysis (TDA) is a recent and fast growing field providing a set of new topological and geometric tools to infer relevant features for possibly complex data. Here we propose a set of notebooks for the practice of TDA with the Python Gudhi library together with popular machine learning and data sciences libraries. See for instance [this paper](https://arxiv.org/abs/1710.04019) for an introduction to TDA for data science. The complete list of notebooks can also be found at the end of this page. -## Install Python Gudhi Library +## Install Python Gudhi Library See the [installation page](https://gudhi.inria.fr/python/latest/installation.html) or if you have conda you can make a [conda install](https://anaconda.org/conda-forge/gudhi). @@ -22,15 +22,15 @@ See the [installation page](https://gudhi.inria.fr/python/latest/installation.ht ### 01 - Simplex trees and simpicial complexes -TDA typically aims at extracting topological signatures from a point cloud in $\mathbb{R}^d$ or in a general metric space. By studying the topology of a point cloud, we actually mean studying the topology of the unions of balls centered at the point cloud, also called *offsets*. However, non-discrete sets such as offsets, and also continuous mathematical shapes like curves, surfaces and more generally manifolds, cannot easily be encoded as finite discrete structures. [Simplicial complexes](https://en.wikipedia.org/wiki/Simplicial_complex) are therefore used in computational geometry to approximate such shapes. +TDA typically aims at extracting topological signatures from a point cloud in $\mathbb{R}^d$ or in a general metric space. By studying the topology of a point cloud, we actually mean studying the topology of the unions of balls centered at the point cloud, also called *offsets*. However, non-discrete sets such as offsets, and also continuous mathematical shapes like curves, surfaces and more generally manifolds, cannot easily be encoded as finite discrete structures. [Simplicial complexes](https://en.wikipedia.org/wiki/Simplicial_complex) are therefore used in computational geometry to approximate such shapes. A simplicial complex is a set of [simplices](https://en.wikipedia.org/wiki/Simplex), they can be seen as higher dimensional generalization of graphs. These are mathematical objects that are both topological and combinatorial, a property making them particularly useful for TDA. The challenge here is to define such structures that are proven to reflect relevant information about the structure of data and that can be effectively constructed and manipulated in practice. Below is an exemple of simplicial complex: ```{r simplicial-complex-example} -knitr::include_graphics("Images/Pers14.PNG") +knitr::include_graphics("Tutos/Images/Pers14.PNG") ``` - -A filtration is an increasing sequence of sub-complexes of a simplicial complex $\mathcal{K}$. It can be seen as ordering the simplices included in the complex $\mathcal{K}$. Indeed, simpicial complexes often come with a specific order, as for [Vietoris-Rips complexes](https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex), [Cech complexes](https://en.wikipedia.org/wiki/%C4%8Cech_complex) and [alpha complexes](https://en.wikipedia.org/wiki/Alpha_shape#Alpha_complex). + +A filtration is an increasing sequence of sub-complexes of a simplicial complex $\mathcal{K}$. It can be seen as ordering the simplices included in the complex $\mathcal{K}$. Indeed, simpicial complexes often come with a specific order, as for [Vietoris-Rips complexes](https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex), [Cech complexes](https://en.wikipedia.org/wiki/%C4%8Cech_complex) and [alpha complexes](https://en.wikipedia.org/wiki/Alpha_shape#Alpha_complex). [Notebook: Simplex trees](Tuto-GUDHI-simplex-Trees.ipynb). In Gudhi, filtered simplicial complexes are encoded through a data structure called simplex tree. Vertices are represented as integers, edges as pairs of integers, etc. @@ -42,16 +42,16 @@ knitr::include_graphics("https://gudhi.inria.fr/python/latest/_images/Simplex_tr [Notebook: Rips and alpha complexes from pairwise distance](Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb). It is also possible to define Rips complexes in general metric spaces from a matrix of pairwise distances. The definition of the metric on the data is usually given as an input or guided by the application. It is however important to notice that the choice of the metric may be critical to reveal interesting topological and geometric features of the data. We also give in this last notebook a way to define alpha complexes from matrix of pairwise distances by first applying a [multidimensional scaling (MDS)](https://en.wikipedia.org/wiki/Multidimensional_scaling) transformation on the matrix. -TDA signatures can extracted from point clouds but in many cases in data sciences the question is to study the topology of the sublevel sets of a function. +TDA signatures can extracted from point clouds but in many cases in data sciences the question is to study the topology of the sublevel sets of a function. ```{r sublevel-sets-example} -knitr::include_graphics("Images/sublevf.png") +knitr::include_graphics("Tutos/Images/sublevf.png") ``` -Above is an example for a function defined on a subset of $\mathbb{R}$ but in general the function $f$ is defined on a subset of $\mathbb{R}^d$. +Above is an example for a function defined on a subset of $\mathbb{R}$ but in general the function $f$ is defined on a subset of $\mathbb{R}^d$. [Notebook: cubical complexes](Tuto-GUDHI-cubical-complexes.ipynb). One first approach for studying the topology of the sublevel sets of a function is to define a regular grid on $\mathbb{R}^d$ and then to define a filtered complex based on this grid and the function $f$. - + ### 02 - Persistent homology and persistence diagrams Homology is a well-known concept in algebraic topology. It provides a powerful tool to formalize and handle the notion of topological features of a topological space or of a simplicial complex in an algebraic way. For any dimension $k$, the $k$-dimensional *holes* are represented by a vector space $H_k$, whose dimension is intuitively the number of such independent features. For example, the $0$-dimensional homology group $H_0$ represents the connected components of the complex, the $1$-dimensional homology group $H_1$ represents the $1$-dimensional loops, the $2$-dimensional homology group $H_2$ represents the $2$-dimensional cavities and so on. @@ -59,10 +59,10 @@ Homology is a well-known concept in algebraic topology. It provides a powerful t Persistent homology is a powerful tool to compute, study and encode efficiently multiscale topological features of nested families of simplicial complexes and topological spaces. It encodes the evolution of the homology groups of the nested complexes across the scales. The diagram below shows several level sets of the filtration: ```{r persistence} -knitr::include_graphics("Images/pers.png") +knitr::include_graphics("Tutos/Images/pers.png") ``` -[Notebook: persistence diagrams](Tuto-GUDHI-persistence-diagrams.ipynb) In this notebook we show how to compute barcodes and persistence diagrams from a filtration defined on the Protein binding dataset. This tutorial also introduces the bottleneck distance between persistence diagrams. +[Notebook: persistence diagrams](Tuto-GUDHI-persistence-diagrams.ipynb) In this notebook we show how to compute barcodes and persistence diagrams from a filtration defined on the Protein binding dataset. This tutorial also introduces the bottleneck distance between persistence diagrams. ### 03 - Representations of persistence and linearization @@ -82,7 +82,7 @@ C. Oballe and V. Maroulas provide a [tutorial](https://github.com/coballejr/misc ### 06 - Machine learning and deep learning with TDA -Two libraries related to Gudhi: +Two libraries related to Gudhi: - [ATOL](https://github.com/martinroyer/atol): Automatic Topologically-Oriented Learning. See [this tutorial](https://github.com/martinroyer/atol/blob/master/demo/atol-demo.ipynb). - [Perslay](https://github.com/MathieuCarriere/perslay): A Simple and Versatile Neural Network Layer for Persistence Diagrams. See [notebook](Tuto-GUDHI-perslay-visu.ipynb). @@ -97,7 +97,7 @@ This [notebook](Tuto-GUDHI-DTM-filtrations.ipynb) introduces the distance to mea ### 10 - TDA and dimension reduction -### 11 - Inverse problem and optimization with TDA +### 11 - Inverse problem and optimization with TDA In this [notebook](Tuto-GUDHI-optimization.ipynb), we will see how Gudhi and Tensorflow can be combined to perform optimization of persistence diagrams to sove an inverse problem. diff --git a/README.md b/README.md index 6fc941b..a468acb 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ structures that are proven to reflect relevant information about the structure of data and that can be effectively constructed and manipulated in practice. Below is an exemple of simplicial complex: -![simplicial complex example](Images/Pers14.PNG) +![simplicial complex example](Tutos/Images/Pers14.PNG) A filtration is an increasing sequence of sub-complexes of a simplicial complex $\mathcal{K}$. It can be seen as ordering the simplices included in @@ -50,15 +50,15 @@ complexes](https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex), [alpha complexes](https://en.wikipedia.org/wiki/Alpha_shape#Alpha_complex). -[Notebook: Simplex trees](Tuto-GUDHI-simplex-Trees.ipynb). In Gudhi, +[Notebook: Simplex trees](Tutos/Tuto-GUDHI-simplex-Trees.ipynb). In Gudhi, filtered simplicial complexes are encoded through a data structure called simplex tree. Vertices are represented as integers, edges as pairs of integers, etc. -![simplex tree representation](Images/Simplex_tree_representation.png) +![simplex tree representation](Tutos/Images/Simplex_tree_representation.png) [Notebook: Vietoris-Rips complexes and alpha complexes from data -points](https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb). +points](Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb). In practice, the first step of the **TDA Analysis Pipeline** is to define a filtration of simplicial complexes for some data. This notebook explains how to build Vietoris-Rips complexes and alpha complexes (represented as @@ -66,11 +66,11 @@ simplex trees) from data points in $\mathbb{R}^d$, using the simplex tree data structure. -This [Notebook](Tuto-GUDHI-alpha-complex-visualization.ipynb) shows how to visualize simplicial complexes. +This [Notebook](Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb) shows how to visualize simplicial complexes. [Notebook: Rips and alpha complexes from pairwise -distance](Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb). +distance](Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb). It is also possible to define Rips complexes in general metric spaces from a matrix of pairwise distances. The definition of the metric on the data is usually given as an input or guided by the application. It is @@ -85,13 +85,13 @@ TDA signatures can extracted from point clouds but in many cases in data sciences the question is to study the topology of the sublevel sets of a function. -![function exemple](Images/sublevf.png) +![function exemple](Tutos/Images/sublevf.png) Above is an example for a function defined on a subset of $\mathbb{R}$ but in general the function $f$ is defined on a subset of $\mathbb{R}^d$. -[Notebook: cubical complexes](Tuto-GUDHI-cubical-complexes.ipynb). One +[Notebook: cubical complexes](Tutos/Tuto-GUDHI-cubical-complexes.ipynb). One first approach for studying the topology of the sublevel sets of a function is to define a regular grid on $\mathbb{R}^d$ and then to define a filtered complex based on this grid and the @@ -115,9 +115,9 @@ simplicial complexes and topological spaces. It encodes the evolution of the homology groups of the nested complexes across the scales. The diagram below shows several level sets of the filtration: -![persistence](Images/pers.png) +![persistence](Tutos/Images/pers.png) -[Notebook: persistence diagrams](https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-persistence-diagrams.ipynb) +[Notebook: persistence diagrams](Tutos/Tuto-GUDHI-persistence-diagrams.ipynb) In this notebook we show how to compute barcodes and persistence diagrams from a filtration defined on the Protein binding dataset. This tutorial also introduces the bottleneck distance between persistence @@ -125,16 +125,16 @@ diagrams. ### 03 - Representations of persistence and linearization -In this [notebook](Tuto-GUDHI-representations.ipynb), we learn how to +In this [notebook](Tutos/Tuto-GUDHI-representations.ipynb), we learn how to use alternative representations of persistence with the representations module and finally we see a first example of how to efficiently combine machine learning and topological data analysis. -This [notebook](Tuto-GUDHI-Expected-persistence-diagrams.ipynb) +This [notebook](Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb) illustrates the notion of “Expected Persistence Diagram”, which is a way to encode the topology of a random process as a deterministic measure. -This [notebook](Tuto-GUDHI-persistent-entropy.ipynb) shows how to summarize +This [notebook](Tutos/Tuto-GUDHI-persistent-entropy.ipynb) shows how to summarize the information given by persistent homology using persistent entropy (a number) and the ES-function (a curve) and explains in which situations they can be useful. @@ -146,7 +146,7 @@ features close to the diagonal. Since they correspond to topological structures that die very soon after they appear in the filtration, these points are generally considered as “topological noise”. Confidence regions for persistence diagram provide a rigorous framework to this -idea. This [notebook](Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) +idea. This [notebook](Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) introduces the subsampling approach of [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729). @@ -167,15 +167,15 @@ Two libraries related to Gudhi: tutorial](https://github.com/martinroyer/atol/blob/master/demo/atol-demo.ipynb). - [Perslay](https://github.com/MathieuCarriere/perslay): A Simple and Versatile Neural Network Layer for Persistence Diagrams. See [this - notebook](Tuto-GUDHI-perslay-visu.ipynb). + notebook](Tutos/Tuto-GUDHI-perslay-visu.ipynb). ### 07 - Alternative filtrations and robust TDA -This [notebook](Tuto-GUDHI-DTM-filtrations.ipynb) introduces the +This [notebook](Tutos/Tuto-GUDHI-DTM-filtrations.ipynb) introduces the distance to measure (DTM) filtration, as defined in [this paper](https://arxiv.org/abs/1811.04757). This filtration can be used for robust TDA. The DTM can also be used for robust approximations of -compact sets, see this [notebook](Tuto-GUDHI-kPDTM-kPLM.ipynb). +compact sets, see this [notebook](Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb). ### 08 - Topological Data Analysis for Time series @@ -185,49 +185,49 @@ compact sets, see this [notebook](Tuto-GUDHI-kPDTM-kPLM.ipynb). ### 11 - Inverse problem and optimization with TDA -In this [notebook](Tuto-GUDHI-optimization.ipynb), we will see how Gudhi and +In this [notebook](Tutos/Tuto-GUDHI-optimization.ipynb), we will see how Gudhi and Tensorflow can be combined to perform optimization of persistence diagrams to solve an inverse problem. This other, less complete -[notebook](Tuto-GUDHI-PyTorch-optimization.ipynb) shows that this kind of +[notebook](Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb) shows that this kind of optimization works just as well with PyTorch. ## Complete list of notebooks for TDA -[Simplex trees](Tuto-GUDHI-simplex-Trees.ipynb) +[Simplex trees](Tutos/Tuto-GUDHI-simplex-Trees.ipynb) [Vietoris-Rips complexes and alpha complexes from data -points](Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb) +points](Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb) [Visualizing simplicial -complexes](Tuto-GUDHI-alpha-complex-visualization.ipynb) +complexes](Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb) [Rips and alpha complexes from pairwise -distance](Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb) +distance](Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb) -[Cubical complexes](Tuto-GUDHI-cubical-complexes.ipynb) +[Cubical complexes](Tutos/Tuto-GUDHI-cubical-complexes.ipynb) [Persistence diagrams and bottleneck -distance](Tuto-GUDHI-persistence-diagrams.ipynb) +distance](Tutos/Tuto-GUDHI-persistence-diagrams.ipynb) -[Representations of persistence](Tuto-GUDHI-representations.ipynb) +[Representations of persistence](Tutos/Tuto-GUDHI-representations.ipynb) [Expected Persistence -Diagram](Tuto-GUDHI-Expected-persistence-diagrams.ipynb) +Diagram](Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb) [Confidence regions for persistence diagrams - data -points](Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) +points](Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) [ATOL tutorial](https://github.com/martinroyer/atol/blob/master/demo/atol-demo.ipynb) -[Perslay](Tuto-GUDHI-perslay-visu.ipynb) +[Perslay](Tutos/Tuto-GUDHI-perslay-visu.ipynb) -[DTM-filtrations](Tuto-GUDHI-DTM-filtrations.ipynb) +[DTM-filtrations](Tutos/Tuto-GUDHI-DTM-filtrations.ipynb) -[kPDTM-kPLM](Tuto-GUDHI-kPDTM-kPLM.ipynb) +[kPDTM-kPLM](Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb) -[Inverse problem and optimization with TDA](Tuto-GUDHI-optimization.ipynb) +[Inverse problem and optimization with TDA](Tutos/Tuto-GUDHI-optimization.ipynb) -[PyTorch differentiation of diagrams](Tuto-GUDHI-PyTorch-optimization.ipynb) +[PyTorch differentiation of diagrams](Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb) Contact : diff --git a/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb b/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb deleted file mode 100644 index 0aca49a..0000000 --- a/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb +++ /dev/null @@ -1,447 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# TDA with Python using the Gudhi Library \n", - "\n", - "# Confidence regions for persistence diagrams : data points " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import persistence_statistics as ps\n", - "\n", - "import pandas as pd\n", - "import numpy as np\n", - "import pickle as pickle\n", - "import gudhi as gd \n", - "import seaborn as sbs\n", - "from scipy.spatial import distance_matrix\n", - "from pylab import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this tutorial, we introduce confidence regions for persistence diagrams built on a set of data points. We present the subsampling approach of [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729). See [this notebook](https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-persistence-diagrams.ipynb) for an introduction to persistence diagrams with Gudhi." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For many applications of persistent homology, we observe topological features close to the diagonal. Since they correspond to topological structures that die very soon after they appear in the filtration, these points are generally considered as \"topological noise\". Confidence regions for persistence diagram provide a rigorous framework to this idea." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Confidence regions for persistence diagrams provide a rigorous framework for selecting significant topological features in a persistence diagram. We use the bottleneck distance $d_b$ to define confidence regions. We see point clouds as random variables. Under this approach, persistence diagrams are also seen as random quantities." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Confidence regions for persistence diagrams for point cloud data in $\\mathbb R^d$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We introduce the method for a simulated dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "U1 = np.random.uniform(0,2 * pi,size= 1000)\n", - "V1 = np.array([[0.35 * cos(u) +0.02*np.random.uniform(-1,1) ,\n", - " 0.35 *sin(u)+0.02*np.random.uniform(-1,1)] for u in U1])\n", - "U2 = np.random.uniform(0,2 * pi,size= 2000)\n", - "V2 = np.array([[0.7* cos(u) +0.02*np.random.uniform(-1,1) ,\n", - " 0.7*sin(u)+0.02*np.random.uniform(-1,1)] for u in U2])\n", - "W = np.concatenate((V1,V2), axis=0)\n", - "plt.scatter(W[:,0],W[:,1],s=0.1);\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Subsampling approach\n", - "\n", - "Let $\\mathbb X$ and $\\mathbb Y$ be two compact sets.\n", - "For the filtrations given below, persistence homology is stable with respect of Hausdorff perturbations:\n", - "$$\n", - "d_b\\left( Dgm \\left(Filt(\\mathbb X) \\right) , Dgm \\left( Filt(\\mathbb Y) \\right)\\right)\n", - "\\leq C_{Filt}\n", - " Haus \\left(\\mathbb X, \\mathbb Y \\right)\n", - "$$ \n", - "\n", - "The previous inequality is valid for the following Gudhi filtrations: \n", - "- for the Rips complex filtration with $C_{Rips} = 2$, \n", - "- for the $\\sqrt{alpha}$-complexes filtration (see further) with $C_{Alpha}= 1$. \n", - "\n", - "Following [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729) we derive confidence sets for persistence diagrams (for $d_b$) from confidence sets for compact sets (for $Haus$). Let $\\mathbb X_n$ be a sample from a distribution $P$ with compact support $\\mathbb X$. \n", - "The aim is to find a parameter $c_\\alpha$ such that\n", - "\n", - "$$ P ( Hauss(\\mathbb X_n, \\mathbb X) \\leq c_\\alpha) \\geq 1-\\alpha .$$\n", - "\n", - "The confidence set $\\mathcal C$ we consider is a subset of all persistence diagrams whose bottleneck distance to $Dgm \\left(Filt(\\mathbb X_n) \\right) $ is less than $d_\\alpha$:\n", - "$$ \\left\\{ Dgm \\: | \\: d_b \\left( Diag , Dgm \\left(Filt(\\mathbb X_n) \\right) \\right) c\\leq d_\\alpha \\right\\}, $$\n", - "with \n", - "$$ d_\\alpha = C_{Filt} c_\\alpha .$$\n", - "\n", - "The `hausd_interval` function from the `persistence_statistics` module implements the subsampling method of [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729), it outputs an estimation $\\hat c_\\alpha$ of $c_\\alpha$. By default a multiprocessing computation is applied." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.053896359713091466\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "hatc = ps.hausd_interval(data=W,level = 0.90, m = 2500)\n", - "print(hatc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Stability and confidence region for the $\\sqrt{alpha}$-filtration" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When computing confidence regions for alpha complexes, we need to be careful with the scale of values of the filtration because the filtration value of each simplex is computed as the square of the circumradius of the simplex (if the circumsphere is empty)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "Alpha_complex_W = gd.AlphaComplex(points = W)\n", - "Alpha_simplex_tree_W = Alpha_complex_W.create_simplex_tree() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We change the filtration value of each simplex by taking the square root of the filtration values:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "Alpha_simplex_tree_W_list = Alpha_simplex_tree_W.get_filtration()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "for splx in Alpha_simplex_tree_W_list:\n", - " Alpha_simplex_tree_W.assign_filtration(splx[0],filtration= np.sqrt(splx[1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can compute persistence for the rescaled $\\sqrt{alpha}$ complex filtration." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "pers_alpha_W= Alpha_simplex_tree_W.persistence()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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zZvH5ZdfrsxCREIWlkzDWlsL4JSY3N55YF1L651ltzrZxhafZf76kRYcOnSI++67j5EjR5KamkppaSkjR45UwBCRNgnbdRre6yyaLcsKsD6oZXIqay1/+MMfmDFjBkOHDqWkpIRvf/vbkR6WiMQ4XREehz766COmTp3KJ598wn333ceIESOUWYhIu4jqs6ckNN988w133303o0aNIiMjg9WrVzN8+HAFDBFpNwoaccBaS0VFBSkpKbz33nuUlZVx++23062bEkkRaV/aq8S4999/n6lTp7J9+3YeeOABsrOzlVmISIdRphGjDh482HRDwZEjR7Jy5UqysrIUMESkQyloxBhrLaWlpSQnJ1NXV0dFRQW33XabSlEiEhba08SQv//970yZMoUvv/yy6eFIyixEJJyUacSAAwcOMGvWLL773e9yxRVXsGLFCtLT0xUwRCTsFDSimLWWlStXkpyczLZt2ygvLyc3N5euXbtGemgi0kmpPBWlNm3ahMvlYs+ePRQVFTFs2DBlFiIScco0osy+ffuYMWMG48eP56qrrmL58uUMHTpUAUNEooIyjTDZvN3Nmo072Ln3MH179eSG9ItI7ZfYtN5ay/LlyyksLGTcuHFUVFTQq1evCI5YRORUChod7K5lb/Lax3tOWtb33B58vucQeeMvIbVfIm+//TYul4uDBw/y2GOPkZaWpsxCRKKSgkY7+fJf76D+xRehsRG6dKHbVVdxzxV5vPv5gVO23bnvKADlr7zPotdWUlJSgsvl4sYbb6RLly4KGCIStRQ02sGX/3oH9evWnVjQ2Mjxdeu47v0veXfi9FO2t7aRd156jrUvPc1N37uOyspKzj333DCOWESkbRQ02sFJAcPHiM83nbLsm50f8+nzCzj7DFj05ALShw1RZiEiMUNBowMZn+n6wwfY9uLT7PvgVSb/NJ8f3XYLZ3XvpoAhIjFFQaODWdvIro1/4fMXn+byseP5+SPP0qf3uXQxJnBjEZEoE7ag4Tzr2w1kWmuLglkf7LJo9faxY2xePINze3bjqUW/JTU1me5ddWmMiMSusAQNY0wmgLW22hiTZIzJtNbWtrbeuy7QMt9+osXexgbm79/PC/XHcRW6uOWmf6JndyV1IhL7wvW19zY82QFAHZATxPpgl0WNBmtZ/s1Brtr1FSYzg9+/8AL/59abFTBEJG6Ea2+W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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "gd.plot_persistence_diagram(pers_alpha_W);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define the confidence region for this persistence diagram. We have to take a band of width $ d_\\alpha = C_{Filt} c_\\alpha $ $\\hat c_\\alpha$ to compute and plot the confidence band. The `band` parameter is the vertical height of the confidence region, it is thus twice the value of $\\hat c _\\alpha$ (because the bottleneck distance is based on the $\\ell_\\infty$ norm)." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "gd.plot_persistence_diagram(pers_alpha_W, band=2 * hatc);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Only the topological features above the red band are considered as significant. Here we select the main topological features by this way.\n", - "\n", - "Generally speaking, the procedure is very conservative: the band is very large and only very few topological features are seen as significant." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Confidence regions for persistence diagrams of filtrations based on pairwise distances" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The subsampling approach can be also applied when data come has a matrix of pairwise distances." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We illustrate the procedure with the `trefoil_dist` dataset which contains the distances between 1000 points sampled in the neighborhood of a trefoil curve." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "trefoil_dist = pickle.load( open( \"./datasets/trefoil_dist\", \"rb\" ) )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We use again the `hausd_interval` function to infer the Hausdorff distance between the data and the support of the underlying distribution of the data." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.396104059680682\n" - ] - } - ], - "source": [ - "hatc = ps.hausd_interval(trefoil_dist,pairwise_dist=True,level = 0.90, m = 900)\n", - "print(hatc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we define the Rips complex filtration from the matrix of pairwise distances:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "skeleton_trefoil = gd.RipsComplex(distance_matrix = trefoil_dist,max_edge_length=2) \n", - "Rips_simplex_tree_trefoil = skeleton_trefoil.create_simplex_tree(max_dimension=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and we compute persistence on this filtration:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "BarCodes_trefoil = Rips_simplex_tree_trefoil.persistence()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To define a confidence band for the persistence diagram, we have to take a band of width $ \\hat d_\\alpha = 2 \\hat c_\\alpha$.\n", - "\n", - "The `band` parameter being the vertical height of the confidence region, it is twice the value of $\\hat d _\\alpha$ (because the bottleneck distance is based on the $\\ell_\\infty$ norm).\n", - "\n", - "So finally we take this band parameter equal to four times $\\hat c_\\alpha$." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "gd.plot_persistence_diagram(BarCodes_trefoil,band = 4*hatc);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see that only one topological feature of dimension 1 is seen as a significant." - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.3" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Images/CodeCogsEqnRp.gif b/Tutos/Images/CodeCogsEqnRp.gif similarity index 100% rename from Images/CodeCogsEqnRp.gif rename to Tutos/Images/CodeCogsEqnRp.gif diff --git a/Images/MatchingDiag.png b/Tutos/Images/MatchingDiag.png similarity index 100% rename from Images/MatchingDiag.png rename to Tutos/Images/MatchingDiag.png diff --git a/Images/Pers14.PNG b/Tutos/Images/Pers14.PNG similarity index 100% rename from Images/Pers14.PNG rename to Tutos/Images/Pers14.PNG diff --git a/Images/Simplex_tree_representation.png b/Tutos/Images/Simplex_tree_representation.png similarity index 100% rename from Images/Simplex_tree_representation.png rename to Tutos/Images/Simplex_tree_representation.png diff --git a/Images/nappe_distance_avec_bruit.png b/Tutos/Images/nappe_distance_avec_bruit.png similarity index 100% rename from Images/nappe_distance_avec_bruit.png rename to Tutos/Images/nappe_distance_avec_bruit.png diff --git a/Images/nappe_distance_sans_bruit.png b/Tutos/Images/nappe_distance_sans_bruit.png similarity index 100% rename from Images/nappe_distance_sans_bruit.png rename to Tutos/Images/nappe_distance_sans_bruit.png diff --git a/Images/nappe_dtm_avec_bruit.png b/Tutos/Images/nappe_dtm_avec_bruit.png similarity index 100% rename from Images/nappe_dtm_avec_bruit.png rename to Tutos/Images/nappe_dtm_avec_bruit.png diff --git a/Images/pers.png b/Tutos/Images/pers.png similarity index 100% rename from Images/pers.png rename to Tutos/Images/pers.png diff --git a/Images/persistence.png b/Tutos/Images/persistence.png similarity index 100% rename from Images/persistence.png rename to Tutos/Images/persistence.png diff --git a/Images/sous_niveau_kPDTM2.png b/Tutos/Images/sous_niveau_kPDTM2.png similarity index 100% rename from Images/sous_niveau_kPDTM2.png rename to Tutos/Images/sous_niveau_kPDTM2.png diff --git a/Images/sous_niveau_kPDTM_cov2.png b/Tutos/Images/sous_niveau_kPDTM_cov2.png similarity index 100% rename from Images/sous_niveau_kPDTM_cov2.png rename to Tutos/Images/sous_niveau_kPDTM_cov2.png diff --git a/Images/sublevf.png b/Tutos/Images/sublevf.png similarity index 100% rename from Images/sublevf.png rename to Tutos/Images/sublevf.png diff --git a/Images/symbole_infini.png b/Tutos/Images/symbole_infini.png similarity index 100% rename from Images/symbole_infini.png rename to Tutos/Images/symbole_infini.png diff --git a/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb b/Tutos/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb similarity index 100% rename from Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb rename to Tutos/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb diff --git a/Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb b/Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb new file mode 100644 index 0000000..cb8cdd0 --- /dev/null +++ b/Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb @@ -0,0 +1,443 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "source": [ + "# TDA with Python using the Gudhi Library \n", + "\n", + "# Confidence regions for persistence diagrams : data points " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import utils.persistence_statistics as ps\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import pickle as pickle\n", + "import gudhi as gd \n", + "import seaborn as sbs\n", + "from scipy.spatial import distance_matrix\n", + "from pylab import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this tutorial, we introduce confidence regions for persistence diagrams built on a set of data points. We present the subsampling approach of [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729). See [this notebook](https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-persistence-diagrams.ipynb) for an introduction to persistence diagrams with Gudhi." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For many applications of persistent homology, we observe topological features close to the diagonal. Since they correspond to topological structures that die very soon after they appear in the filtration, these points are generally considered as \"topological noise\". Confidence regions for persistence diagram provide a rigorous framework to this idea." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confidence regions for persistence diagrams provide a rigorous framework for selecting significant topological features in a persistence diagram. We use the bottleneck distance $d_b$ to define confidence regions. We see point clouds as random variables. Under this approach, persistence diagrams are also seen as random quantities." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Confidence regions for persistence diagrams for point cloud data in $\\mathbb R^d$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We introduce the method for a simulated dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "U1 = np.random.uniform(0,2 * pi,size= 1000)\n", + "V1 = np.array([[0.35 * cos(u) +0.02*np.random.uniform(-1,1) ,\n", + " 0.35 *sin(u)+0.02*np.random.uniform(-1,1)] for u in U1])\n", + "U2 = np.random.uniform(0,2 * pi,size= 2000)\n", + "V2 = np.array([[0.7* cos(u) +0.02*np.random.uniform(-1,1) ,\n", + " 0.7*sin(u)+0.02*np.random.uniform(-1,1)] for u in U2])\n", + "W = np.concatenate((V1,V2), axis=0)\n", + "plt.scatter(W[:,0],W[:,1],s=0.1);\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Subsampling approach\n", + "\n", + "Let $\\mathbb X$ and $\\mathbb Y$ be two compact sets.\n", + "For the filtrations given below, persistence homology is stable with respect of Hausdorff perturbations:\n", + "$$\n", + "d_b\\left( Dgm \\left(Filt(\\mathbb X) \\right) , Dgm \\left( Filt(\\mathbb Y) \\right)\\right)\n", + "\\leq C_{Filt}\n", + " Haus \\left(\\mathbb X, \\mathbb Y \\right)\n", + "$$ \n", + "\n", + "The previous inequality is valid for the following Gudhi filtrations: \n", + "- for the Rips complex filtration with $C_{Rips} = 2$, \n", + "- for the $\\sqrt{alpha}$-complexes filtration (see further) with $C_{Alpha}= 1$. \n", + "\n", + "Following [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729) we derive confidence sets for persistence diagrams (for $d_b$) from confidence sets for compact sets (for $Haus$). Let $\\mathbb X_n$ be a sample from a distribution $P$ with compact support $\\mathbb X$. \n", + "The aim is to find a parameter $c_\\alpha$ such that\n", + "\n", + "$$ P ( Hauss(\\mathbb X_n, \\mathbb X) \\leq c_\\alpha) \\geq 1-\\alpha .$$\n", + "\n", + "The confidence set $\\mathcal C$ we consider is a subset of all persistence diagrams whose bottleneck distance to $Dgm \\left(Filt(\\mathbb X_n) \\right) $ is less than $d_\\alpha$:\n", + "$$ \\left\\{ Dgm \\: | \\: d_b \\left( Diag , Dgm \\left(Filt(\\mathbb X_n) \\right) \\right) c\\leq d_\\alpha \\right\\}, $$\n", + "with \n", + "$$ d_\\alpha = C_{Filt} c_\\alpha .$$\n", + "\n", + "The `hausd_interval` function from the `persistence_statistics` module implements the subsampling method of [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729), it outputs an estimation $\\hat c_\\alpha$ of $c_\\alpha$. By default a multiprocessing computation is applied." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.05282828169979164\n" + ] + } + ], + "source": [ + "hatc = ps.hausd_interval(data=W,level = 0.90, m = 2500)\n", + "print(hatc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Stability and confidence region for the $\\sqrt{alpha}$-filtration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing confidence regions for alpha complexes, we need to be careful with the scale of values of the filtration because the filtration value of each simplex is computed as the square of the circumradius of the simplex (if the circumsphere is empty)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "Alpha_complex_W = gd.AlphaComplex(points = W)\n", + "Alpha_simplex_tree_W = Alpha_complex_W.create_simplex_tree() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We change the filtration value of each simplex by taking the square root of the filtration values:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "Alpha_simplex_tree_W_list = Alpha_simplex_tree_W.get_filtration()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "for splx in Alpha_simplex_tree_W_list:\n", + " Alpha_simplex_tree_W.assign_filtration(splx[0],filtration= np.sqrt(splx[1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can compute persistence for the rescaled $\\sqrt{alpha}$ complex filtration." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "pers_alpha_W= Alpha_simplex_tree_W.persistence()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zsY111yDyMhIGI1GJCYmMinyACtGREREAWT37t1ISkrC999/j6VLlyI1NRXBwcFyh+U3WDEiIiIKAM3NzXjiiSdw5ZVXoqmpCa+//jrS09OZFHmJFSMiIiI/9/333yM5ORllZWVIT0/HPffcg9DQULnD8ktMjIiIiPyU3W7H888/j+zsbJx//vnYvHkzxo0bJ3dYfo2JERERkR/av38/5s6di/feew933XUX7r33XkRERMgdlt9jYkRERORHJEnCli1bsHjxYgwaNAgFBQWYPHmy3GEFDA6+JiIi8hPHjx/HnXfeieTkZFxzzTXYvn07k6JexooRERGRH/jrX/+KjIwMNDU1Yf369UhISJA7pIDEihEREZEPq62tRWpqKqZPn44xY8Zgx44dTIr6ECtGREREPmrnzp1ITU2FxWLBY489hjvuuIOzV/cxVoyIiIh8zOnTp7FkyRJMmzYNI0eORElJCaZPn86kqB+wYkRERORDPv/8c+j1euzbtw8GgwF33303goJYx+gvPNJEREQ+oLGxEQ8++CAmT56M0NBQbNu2DUlJSUyK+hkrRkRERDL7+uuvkZSUhK+++gpZWVmYN28eH+khE6ahREREMmlpacG6desQGxuL+vp6bNmyhc85kxkrRkRERDIQRREpKSn4+OOPkZycjMWLFyM8PFzusAY8JkZERET9SJIkbNy4EcuXL4cgCHjppZcQFxcnd1jUhokRERFRPzl8+DDS0tLwz3/+EzNnzsTKlSsxZMgQucOiszAxIiIi6gdFRUVYsGABgoOD8dxzz+Haa6+VOyRyg4OviYiI+pDFYsFdd92Fu+66C3FxcSgpKWFS5MNYMSIiIuojb7/9NtLS0nDmzBnk5eXhd7/7HWev9nGsGBEREfWykydPIjMzEzfffDNiYmKwfft23HzzzUyK/AArRkRERL3oo48+QnJyMo4ePYoHH3wQOp2OCZEfYcWIiIioFzQ0NGDlypW49tprIQgCjEYjZs2axaTIz7BiRERE1EO7du1CUlIS9uzZg2XLliElJQXBwcFyh0XdwIoRERFRNzU3N+Oxxx7DlVdeiZaWFrz++utIS0tjUuTHWDEiIiLqhu+++w56vR4VFRVIT0/nM84CBCtGREREXrDb7Xj22Wcxfvx4HDt2DK+++iqWLFnCpChAsGJERETkoR9//BGpqal4//33MXv2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gd.plot_persistence_diagram(pers_alpha_W);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now define the confidence region for this persistence diagram. We have to take a band of width $ d_\\alpha = C_{Filt} c_\\alpha $ $\\hat c_\\alpha$ to compute and plot the confidence band. The `band` parameter is the vertical height of the confidence region, it is thus twice the value of $\\hat c _\\alpha$ (because the bottleneck distance is based on the $\\ell_\\infty$ norm)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gd.plot_persistence_diagram(pers_alpha_W, band=2 * hatc);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Only the topological features above the red band are considered as significant. Here we select the main topological features by this way.\n", + "\n", + "Generally speaking, the procedure is very conservative: the band is very large and only very few topological features are seen as significant." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Confidence regions for persistence diagrams of filtrations based on pairwise distances" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The subsampling approach can be also applied when data come has a matrix of pairwise distances." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We illustrate the procedure with the `trefoil_dist` dataset which contains the distances between 1000 points sampled in the neighborhood of a trefoil curve." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "trefoil_dist = pickle.load( open( \"./datasets/trefoil_dist\", \"rb\" ) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use again the `hausd_interval` function to infer the Hausdorff distance between the data and the support of the underlying distribution of the data." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.396104059680682\n" + ] + } + ], + "source": [ + "hatc = ps.hausd_interval(trefoil_dist,pairwise_dist=True,level = 0.90, m = 900)\n", + "print(hatc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we define the Rips complex filtration from the matrix of pairwise distances:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "skeleton_trefoil = gd.RipsComplex(distance_matrix = trefoil_dist,max_edge_length=2) \n", + "Rips_simplex_tree_trefoil = skeleton_trefoil.create_simplex_tree(max_dimension=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and we compute persistence on this filtration:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "BarCodes_trefoil = Rips_simplex_tree_trefoil.persistence()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To define a confidence band for the persistence diagram, we have to take a band of width $ \\hat d_\\alpha = 2 \\hat c_\\alpha$.\n", + "\n", + "The `band` parameter being the vertical height of the confidence region, it is twice the value of $\\hat d _\\alpha$ (because the bottleneck distance is based on the $\\ell_\\infty$ norm).\n", + "\n", + "So finally we take this band parameter equal to four times $\\hat c_\\alpha$." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gd.plot_persistence_diagram(BarCodes_trefoil,band = 4*hatc);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that only one topological feature of dimension 1 is seen as a significant." + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Tuto-GUDHI-DTM-filtrations.ipynb b/Tutos/Tuto-GUDHI-DTM-filtrations.ipynb similarity index 100% rename from Tuto-GUDHI-DTM-filtrations.ipynb rename to Tutos/Tuto-GUDHI-DTM-filtrations.ipynb diff --git a/Tuto-GUDHI-Expected-persistence-diagrams.ipynb b/Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb similarity index 100% rename from Tuto-GUDHI-Expected-persistence-diagrams.ipynb rename to Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb diff --git a/Tuto-GUDHI-PyTorch-optimization.ipynb b/Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb similarity index 100% rename from Tuto-GUDHI-PyTorch-optimization.ipynb rename to Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb diff --git a/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb b/Tutos/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb similarity index 100% rename from Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb rename to Tutos/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb diff --git a/Tuto-GUDHI-alpha-complex-visualization.ipynb b/Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb similarity index 100% rename from Tuto-GUDHI-alpha-complex-visualization.ipynb rename to Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb diff --git a/Tuto-GUDHI-cover-complex.ipynb b/Tutos/Tuto-GUDHI-cover-complex.ipynb similarity index 100% rename from Tuto-GUDHI-cover-complex.ipynb rename to Tutos/Tuto-GUDHI-cover-complex.ipynb diff --git a/Tuto-GUDHI-cubical-complexes.ipynb b/Tutos/Tuto-GUDHI-cubical-complexes.ipynb similarity index 100% rename from Tuto-GUDHI-cubical-complexes.ipynb rename to Tutos/Tuto-GUDHI-cubical-complexes.ipynb diff --git a/Tuto-GUDHI-extended-persistence.ipynb b/Tutos/Tuto-GUDHI-extended-persistence.ipynb similarity index 100% rename from Tuto-GUDHI-extended-persistence.ipynb rename to Tutos/Tuto-GUDHI-extended-persistence.ipynb diff --git a/Tuto-GUDHI-kPDTM-kPLM.ipynb b/Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb similarity index 100% rename from Tuto-GUDHI-kPDTM-kPLM.ipynb rename to Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb diff --git a/Tuto-GUDHI-optimization.ipynb b/Tutos/Tuto-GUDHI-optimization.ipynb similarity index 100% rename from Tuto-GUDHI-optimization.ipynb rename to Tutos/Tuto-GUDHI-optimization.ipynb diff --git a/Tuto-GUDHI-persistence-diagrams.ipynb b/Tutos/Tuto-GUDHI-persistence-diagrams.ipynb similarity index 100% rename from Tuto-GUDHI-persistence-diagrams.ipynb rename to Tutos/Tuto-GUDHI-persistence-diagrams.ipynb diff --git a/Tuto-GUDHI-persistent-entropy.ipynb b/Tutos/Tuto-GUDHI-persistent-entropy.ipynb similarity index 100% rename from Tuto-GUDHI-persistent-entropy.ipynb rename to Tutos/Tuto-GUDHI-persistent-entropy.ipynb diff --git a/Tuto-GUDHI-perslay-visu.ipynb b/Tutos/Tuto-GUDHI-perslay-visu.ipynb similarity index 100% rename from Tuto-GUDHI-perslay-visu.ipynb rename to Tutos/Tuto-GUDHI-perslay-visu.ipynb diff --git a/Tuto-GUDHI-representations.ipynb b/Tutos/Tuto-GUDHI-representations.ipynb similarity index 100% rename from Tuto-GUDHI-representations.ipynb rename to Tutos/Tuto-GUDHI-representations.ipynb diff --git a/Tuto-GUDHI-simplex-Trees.ipynb b/Tutos/Tuto-GUDHI-simplex-Trees.ipynb similarity index 100% rename from Tuto-GUDHI-simplex-Trees.ipynb rename to Tutos/Tuto-GUDHI-simplex-Trees.ipynb diff --git a/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb b/Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb similarity index 100% rename from Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb rename to Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb diff --git a/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb b/Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb similarity index 100% rename from Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb rename to Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb diff --git a/datasets/Corr_ProteinBinding/1anf.corr_1.txt b/Tutos/datasets/Corr_ProteinBinding/1anf.corr_1.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1anf.corr_1.txt rename to Tutos/datasets/Corr_ProteinBinding/1anf.corr_1.txt diff --git a/datasets/Corr_ProteinBinding/1ez9.corr_1.txt b/Tutos/datasets/Corr_ProteinBinding/1ez9.corr_1.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1ez9.corr_1.txt rename to Tutos/datasets/Corr_ProteinBinding/1ez9.corr_1.txt diff --git a/datasets/Corr_ProteinBinding/1fqa.corr_2.txt b/Tutos/datasets/Corr_ProteinBinding/1fqa.corr_2.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1fqa.corr_2.txt rename to Tutos/datasets/Corr_ProteinBinding/1fqa.corr_2.txt diff --git a/datasets/Corr_ProteinBinding/1fqb.corr_3.txt b/Tutos/datasets/Corr_ProteinBinding/1fqb.corr_3.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1fqb.corr_3.txt rename to Tutos/datasets/Corr_ProteinBinding/1fqb.corr_3.txt diff --git a/datasets/Corr_ProteinBinding/1fqc.corr_2.txt b/Tutos/datasets/Corr_ProteinBinding/1fqc.corr_2.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1fqc.corr_2.txt rename to Tutos/datasets/Corr_ProteinBinding/1fqc.corr_2.txt diff --git a/datasets/Corr_ProteinBinding/1fqd.corr_3.txt b/Tutos/datasets/Corr_ProteinBinding/1fqd.corr_3.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1fqd.corr_3.txt rename to Tutos/datasets/Corr_ProteinBinding/1fqd.corr_3.txt diff --git a/datasets/Corr_ProteinBinding/1jw4.corr_4.txt b/Tutos/datasets/Corr_ProteinBinding/1jw4.corr_4.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1jw4.corr_4.txt rename to Tutos/datasets/Corr_ProteinBinding/1jw4.corr_4.txt diff --git a/datasets/Corr_ProteinBinding/1jw5.corr_5.txt b/Tutos/datasets/Corr_ProteinBinding/1jw5.corr_5.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1jw5.corr_5.txt rename to Tutos/datasets/Corr_ProteinBinding/1jw5.corr_5.txt diff --git a/datasets/Corr_ProteinBinding/1lls.corr_6.txt b/Tutos/datasets/Corr_ProteinBinding/1lls.corr_6.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1lls.corr_6.txt rename to Tutos/datasets/Corr_ProteinBinding/1lls.corr_6.txt diff --git a/datasets/Corr_ProteinBinding/1mpd.corr_4.txt b/Tutos/datasets/Corr_ProteinBinding/1mpd.corr_4.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1mpd.corr_4.txt rename to Tutos/datasets/Corr_ProteinBinding/1mpd.corr_4.txt diff --git a/datasets/Corr_ProteinBinding/1omp.corr_7.txt b/Tutos/datasets/Corr_ProteinBinding/1omp.corr_7.txt similarity index 100% rename from datasets/Corr_ProteinBinding/1omp.corr_7.txt rename to Tutos/datasets/Corr_ProteinBinding/1omp.corr_7.txt diff --git a/datasets/Corr_ProteinBinding/3hpi.corr_5.txt b/Tutos/datasets/Corr_ProteinBinding/3hpi.corr_5.txt similarity index 100% rename from datasets/Corr_ProteinBinding/3hpi.corr_5.txt rename to Tutos/datasets/Corr_ProteinBinding/3hpi.corr_5.txt diff --git a/datasets/Corr_ProteinBinding/3mbp.corr_6.txt b/Tutos/datasets/Corr_ProteinBinding/3mbp.corr_6.txt similarity index 100% rename from datasets/Corr_ProteinBinding/3mbp.corr_6.txt rename to Tutos/datasets/Corr_ProteinBinding/3mbp.corr_6.txt diff --git a/datasets/Corr_ProteinBinding/4mbp.corr_7.txt b/Tutos/datasets/Corr_ProteinBinding/4mbp.corr_7.txt similarity index 100% rename from datasets/Corr_ProteinBinding/4mbp.corr_7.txt rename to Tutos/datasets/Corr_ProteinBinding/4mbp.corr_7.txt diff --git a/datasets/ElongatedTorus.txt b/Tutos/datasets/ElongatedTorus.txt similarity index 100% rename from datasets/ElongatedTorus.txt rename to Tutos/datasets/ElongatedTorus.txt diff --git a/datasets/NoisyTrefoil180.txt b/Tutos/datasets/NoisyTrefoil180.txt similarity index 100% rename from datasets/NoisyTrefoil180.txt rename to Tutos/datasets/NoisyTrefoil180.txt diff --git a/datasets/crater_tuto b/Tutos/datasets/crater_tuto similarity index 100% rename from datasets/crater_tuto rename to Tutos/datasets/crater_tuto diff --git a/datasets/data_acc b/Tutos/datasets/data_acc similarity index 100% rename from datasets/data_acc rename to Tutos/datasets/data_acc diff --git a/datasets/diff/mnist_test.csv b/Tutos/datasets/diff/mnist_test.csv similarity index 100% rename from datasets/diff/mnist_test.csv rename to Tutos/datasets/diff/mnist_test.csv diff --git a/datasets/human.off b/Tutos/datasets/human.off similarity index 100% rename from datasets/human.off rename to Tutos/datasets/human.off diff --git a/datasets/human.txt b/Tutos/datasets/human.txt similarity index 100% rename from datasets/human.txt rename to Tutos/datasets/human.txt diff --git a/datasets/mnist_test.csv b/Tutos/datasets/mnist_test.csv similarity index 100% rename from datasets/mnist_test.csv rename to Tutos/datasets/mnist_test.csv diff --git a/datasets/tore3D_1307.off b/Tutos/datasets/tore3D_1307.off similarity index 100% rename from datasets/tore3D_1307.off rename to Tutos/datasets/tore3D_1307.off diff --git a/datasets/trefoil_dist b/Tutos/datasets/trefoil_dist similarity index 100% rename from datasets/trefoil_dist rename to Tutos/datasets/trefoil_dist diff --git a/utils/KeplerMapperVisuFromTxtFile.py b/Tutos/utils/KeplerMapperVisuFromTxtFile.py similarity index 100% rename from utils/KeplerMapperVisuFromTxtFile.py rename to Tutos/utils/KeplerMapperVisuFromTxtFile.py diff --git a/utils/broken_links_scraper.py b/Tutos/utils/broken_links_scraper.py similarity index 100% rename from utils/broken_links_scraper.py rename to Tutos/utils/broken_links_scraper.py diff --git a/persistence_statistics.py b/Tutos/utils/persistence_statistics.py similarity index 51% rename from persistence_statistics.py rename to Tutos/utils/persistence_statistics.py index 16e867b..60e8301 100644 --- a/persistence_statistics.py +++ b/Tutos/utils/persistence_statistics.py @@ -1,118 +1,104 @@ -def hausd_interval(data, level = 0.95, m=-1, B =1000,pairwise_dist = False, - leaf_size = 2,ncores = None): - - ''' - Subsampling Confidence Interval for the Hausdorff Distance between a +def hausd_interval(data, level=0.95, m=-1, B=1000, pairwise_dist=False, leaf_size=2, ncores=None): + """ + Subsampling Confidence Interval for the Hausdorff Distance between a Manifold and a Sample Fasy et al AOS 2014 - + Input: data : a nxd numpy array representing n points in R^d, or a nxn matrix of pairwise distances - m : size of each subsample. If m=-1 then m = n / np.log(n) - B : number of subsamples + m : size of each subsample. If m=-1 then m = n / np.log(n) + B : number of subsamples level : confidence level pairwise_dist : if pairwise_dist = True then data is a nxn matrix of pairwise distances leaf_size : leaf size for KDTree ncores : number of cores for multiprocessing (if None then the maximum number of cores is used) - - Output: + + Output: quantile for the Hausdorff distance - - - ''' - - + + + """ + import numpy as np from multiprocessing import Pool from sklearn.neighbors import KDTree - - # sample size - n = np.size(data,0) - + n = np.size(data, 0) + # subsample size if m == -1: - m = int (n / np.log(n)) - - + m = int(n / np.log(n)) + # Data is an array if pairwise_dist == False: - + # for subsampling - # a reprendre sans shuffle slit + # a reprendre sans shuffle slit - global hauss_dist + def hauss_dist(m): - ''' + """ Distances between the points of data and a random subsample of data of size m - ''' - I = np.random.choice(n,m) + """ + I = np.random.choice(n, m) Icomp = [item for item in np.arange(n) if item not in I] - tree = KDTree(data[I,],leaf_size=leaf_size) - dist, ind = tree.query(data[Icomp,],k=1) + tree = KDTree(data[I,], leaf_size=leaf_size) + dist, ind = tree.query(data[Icomp,], k=1) hdist = max(dist) - return(hdist) - + return hdist + # parrallel computing with Pool(ncores) as p: - dist_vec = p.map(hauss_dist,[m]*B) + dist_vec = p.map(hauss_dist, [m] * B) p.close() - dist_vec = [a[0] for a in dist_vec] - - - # Data is a matrix of pairwise distances + dist_vec = [a[0] for a in dist_vec] + + # Data is a matrix of pairwise distances else: + def hauss_dist(m): - ''' + """ Distances between the points of data and a random subsample of data of size m - ''' - I = np.random.choice(n,m) - hdist= np.max([np.min(data[I,j]) for j in np.arange(n) if j not in I]) - return(hdist) - + """ + I = np.random.choice(n, m) + hdist = np.max([np.min(data[I, j]) for j in np.arange(n) if j not in I]) + return hdist + # parrallel computing with Pool(ncores) as p: - dist_vec = p.map(hauss_dist, [m]*B) + dist_vec = p.map(hauss_dist, [m] * B) p.close() - - + # quantile and confidence band myquantile = np.quantile(dist_vec, level) - c = 2 * myquantile - - return(c) - - + c = 2 * myquantile + return c +def truncated_simplex_tree(st, int_trunc=100): + """ + This function return a truncated simplex tree - -def truncated_simplex_tree(st,int_trunc=100): - ''' - This function return a truncated simplex tree - Input: st : a simplex tree int_trunc : number of persistent interval keept per dimension (the largest) - + Ouptut: - st_trunc_pers : truncated simplex tree - ''' - - st.persistence() + st_trunc_pers : truncated simplex tree + """ + + st.persistence() dim = st.dimension() - st_trunc_pers = []; + st_trunc_pers = [] for d in range(dim): pers_d = st.persistence_intervals_in_dimension(d) - d_l= len(pers_d) + d_l = len(pers_d) if d_l > int_trunc: - pers_d_trunc = [pers_d[i] for i in range(d_l-int_trunc,d_l)] + pers_d_trunc = [pers_d[i] for i in range(d_l - int_trunc, d_l)] else: pers_d_trunc = pers_d - st_trunc_pers = st_trunc_pers + [(d,(l[0],l[1])) for l in pers_d_trunc] - return(st_trunc_pers) - - + st_trunc_pers = st_trunc_pers + [(d, (l[0], l[1])) for l in pers_d_trunc] + return st_trunc_pers diff --git a/utils/utils_dtm.py b/Tutos/utils/utils_dtm.py similarity index 100% rename from utils/utils_dtm.py rename to Tutos/utils/utils_dtm.py diff --git a/utils/utils_epd.py b/Tutos/utils/utils_epd.py similarity index 100% rename from utils/utils_epd.py rename to Tutos/utils/utils_epd.py diff --git a/utils/utils_quantization.py b/Tutos/utils/utils_quantization.py similarity index 100% rename from utils/utils_quantization.py rename to Tutos/utils/utils_quantization.py From 01956ff23274a6243cf30242e0f5e3645f6770db Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 17 Jun 2025 18:49:11 +0200 Subject: [PATCH 2/5] Fix broken link --- Tutos/Tuto-GUDHI-optimization.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tutos/Tuto-GUDHI-optimization.ipynb b/Tutos/Tuto-GUDHI-optimization.ipynb index 298e74b..a969c37 100644 --- a/Tutos/Tuto-GUDHI-optimization.ipynb +++ b/Tutos/Tuto-GUDHI-optimization.ipynb @@ -363,7 +363,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can actually play the same game with images! Indeed, Gudhi contains code for computing [cubical persistence](http://www2.im.uj.edu.pl/mpd/publications/Wagner_persistence.pdf), which is very well-suited for handling images. For instance, it can be used to filter a 2D image with its pixel values. Overall, the optimization follows the exact same steps as before, except that we use pixel filtration instead of Rips filtration. This means that the parameters $\\theta$ that we are now going to optimize are the pixel values themselves, and that the gradients for positive simplex $\\nabla_\\theta f_\\theta(\\sigma_+(p))$ and negative simplex $\\nabla_\\theta f_\\theta(\\sigma_-(p))$ now simply equal $1$ for the pixels associated to $\\sigma_+(p)$ and $\\sigma_-(p)$ and $0$ for all other pixels. All of that is implemented in `CubicalLayer`." + "We can actually play the same game with images! Indeed, Gudhi contains code for computing [cubical persistence](https://www.vrvis.at/publications/pdfs/PB-VRVis-2011-010.pdf), which is very well-suited for handling images. For instance, it can be used to filter a 2D image with its pixel values. Overall, the optimization follows the exact same steps as before, except that we use pixel filtration instead of Rips filtration. This means that the parameters $\\theta$ that we are now going to optimize are the pixel values themselves, and that the gradients for positive simplex $\\nabla_\\theta f_\\theta(\\sigma_+(p))$ and negative simplex $\\nabla_\\theta f_\\theta(\\sigma_-(p))$ now simply equal $1$ for the pixels associated to $\\sigma_+(p)$ and $\\sigma_-(p)$ and $0$ for all other pixels. All of that is implemented in `CubicalLayer`." ] }, { From 963023b25f37a0c16c61089ba5046220612e26ad Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 17 Jun 2025 19:06:19 +0200 Subject: [PATCH 3/5] modify tutos directory for the CI --- .github/workflows/test_notebooks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_notebooks.yml b/.github/workflows/test_notebooks.yml index d117b72..569c580 100644 --- a/.github/workflows/test_notebooks.yml +++ b/.github/workflows/test_notebooks.yml @@ -22,4 +22,4 @@ jobs: pip install jupyter - name: Execute notebooks run: | - for f in *.ipynb; do echo "Processing $f file.."; time jupyter nbconvert --TagRemovePreprocessor.enabled=True --TagRemovePreprocessor.remove_cell_tags="['do_not_execute']" --to notebook --ExecutePreprocessor.timeout=600 --inplace --execute $f;done; + for f in Tutos/*.ipynb; do echo "Processing $f file.."; time jupyter nbconvert --TagRemovePreprocessor.enabled=True --TagRemovePreprocessor.remove_cell_tags="['do_not_execute']" --to notebook --ExecutePreprocessor.timeout=600 --inplace --execute $f;done; From 12edec4f0df2e72b032ba3b96dc2e34cff636fef Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Mon, 23 Jun 2025 13:46:13 +0200 Subject: [PATCH 4/5] Rename Tutos as tutorials --- .github/workflows/test_notebooks.yml | 2 +- {Tutos => tutorials}/Images/CodeCogsEqnRp.gif | Bin {Tutos => tutorials}/Images/MatchingDiag.png | Bin {Tutos => tutorials}/Images/Pers14.PNG | Bin .../Images/Simplex_tree_representation.png | Bin .../Images/nappe_distance_avec_bruit.png | Bin .../Images/nappe_distance_sans_bruit.png | Bin .../Images/nappe_dtm_avec_bruit.png | Bin {Tutos => tutorials}/Images/pers.png | Bin {Tutos => tutorials}/Images/persistence.png | Bin {Tutos => tutorials}/Images/sous_niveau_kPDTM2.png | Bin .../Images/sous_niveau_kPDTM_cov2.png | Bin {Tutos => tutorials}/Images/sublevf.png | Bin {Tutos => tutorials}/Images/symbole_infini.png | Bin ...-GUDHI-Barycenters-of-persistence-diagrams.ipynb | 0 ...Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb | 0 .../Tuto-GUDHI-DTM-filtrations.ipynb | 0 .../Tuto-GUDHI-Expected-persistence-diagrams.ipynb | 0 .../Tuto-GUDHI-PyTorch-optimization.ipynb | 0 ...GUDHI-Quantization-of-persistence-diagrams.ipynb | 0 .../Tuto-GUDHI-alpha-complex-visualization.ipynb | 0 {Tutos => tutorials}/Tuto-GUDHI-cover-complex.ipynb | 0 .../Tuto-GUDHI-cubical-complexes.ipynb | 0 .../Tuto-GUDHI-extended-persistence.ipynb | 0 {Tutos => tutorials}/Tuto-GUDHI-kPDTM-kPLM.ipynb | 0 {Tutos => tutorials}/Tuto-GUDHI-optimization.ipynb | 0 .../Tuto-GUDHI-persistence-diagrams.ipynb | 0 .../Tuto-GUDHI-persistent-entropy.ipynb | 0 {Tutos => tutorials}/Tuto-GUDHI-perslay-visu.ipynb | 0 .../Tuto-GUDHI-representations.ipynb | 0 {Tutos => tutorials}/Tuto-GUDHI-simplex-Trees.ipynb | 0 ...UDHI-simplicial-complexes-from-data-points.ipynb | 0 ...-simplicial-complexes-from-distance-matrix.ipynb | 0 .../datasets/Corr_ProteinBinding/1anf.corr_1.txt | 0 .../datasets/Corr_ProteinBinding/1ez9.corr_1.txt | 0 .../datasets/Corr_ProteinBinding/1fqa.corr_2.txt | 0 .../datasets/Corr_ProteinBinding/1fqb.corr_3.txt | 0 .../datasets/Corr_ProteinBinding/1fqc.corr_2.txt | 0 .../datasets/Corr_ProteinBinding/1fqd.corr_3.txt | 0 .../datasets/Corr_ProteinBinding/1jw4.corr_4.txt | 0 .../datasets/Corr_ProteinBinding/1jw5.corr_5.txt | 0 .../datasets/Corr_ProteinBinding/1lls.corr_6.txt | 0 .../datasets/Corr_ProteinBinding/1mpd.corr_4.txt | 0 .../datasets/Corr_ProteinBinding/1omp.corr_7.txt | 0 .../datasets/Corr_ProteinBinding/3hpi.corr_5.txt | 0 .../datasets/Corr_ProteinBinding/3mbp.corr_6.txt | 0 .../datasets/Corr_ProteinBinding/4mbp.corr_7.txt | 0 {Tutos => tutorials}/datasets/ElongatedTorus.txt | 0 {Tutos => tutorials}/datasets/NoisyTrefoil180.txt | 0 {Tutos => tutorials}/datasets/crater_tuto | Bin {Tutos => tutorials}/datasets/data_acc | Bin {Tutos => tutorials}/datasets/diff/mnist_test.csv | 0 {Tutos => tutorials}/datasets/human.off | 0 {Tutos => tutorials}/datasets/human.txt | 0 {Tutos => tutorials}/datasets/mnist_test.csv | 0 {Tutos => tutorials}/datasets/tore3D_1307.off | 0 {Tutos => tutorials}/datasets/trefoil_dist | Bin .../utils/KeplerMapperVisuFromTxtFile.py | 0 {Tutos => tutorials}/utils/broken_links_scraper.py | 0 .../utils/persistence_statistics.py | 0 {Tutos => tutorials}/utils/utils_dtm.py | 0 {Tutos => tutorials}/utils/utils_epd.py | 0 {Tutos => tutorials}/utils/utils_quantization.py | 0 63 files changed, 1 insertion(+), 1 deletion(-) rename {Tutos => tutorials}/Images/CodeCogsEqnRp.gif (100%) rename {Tutos => tutorials}/Images/MatchingDiag.png (100%) rename {Tutos => tutorials}/Images/Pers14.PNG (100%) rename {Tutos => tutorials}/Images/Simplex_tree_representation.png (100%) rename {Tutos => tutorials}/Images/nappe_distance_avec_bruit.png (100%) rename {Tutos => tutorials}/Images/nappe_distance_sans_bruit.png (100%) rename {Tutos => tutorials}/Images/nappe_dtm_avec_bruit.png (100%) rename {Tutos => tutorials}/Images/pers.png (100%) rename {Tutos => tutorials}/Images/persistence.png (100%) rename {Tutos => tutorials}/Images/sous_niveau_kPDTM2.png (100%) rename {Tutos => tutorials}/Images/sous_niveau_kPDTM_cov2.png (100%) rename {Tutos => tutorials}/Images/sublevf.png (100%) rename {Tutos => tutorials}/Images/symbole_infini.png (100%) rename {Tutos => tutorials}/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-DTM-filtrations.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-Expected-persistence-diagrams.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-PyTorch-optimization.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-alpha-complex-visualization.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-cover-complex.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-cubical-complexes.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-extended-persistence.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-kPDTM-kPLM.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-optimization.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-persistence-diagrams.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-persistent-entropy.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-perslay-visu.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-representations.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-simplex-Trees.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb (100%) rename {Tutos => tutorials}/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1anf.corr_1.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1ez9.corr_1.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1fqa.corr_2.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1fqb.corr_3.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1fqc.corr_2.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1fqd.corr_3.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1jw4.corr_4.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1jw5.corr_5.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1lls.corr_6.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1mpd.corr_4.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/1omp.corr_7.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/3hpi.corr_5.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/3mbp.corr_6.txt (100%) rename {Tutos => tutorials}/datasets/Corr_ProteinBinding/4mbp.corr_7.txt (100%) rename {Tutos => tutorials}/datasets/ElongatedTorus.txt (100%) rename {Tutos => tutorials}/datasets/NoisyTrefoil180.txt (100%) rename {Tutos => tutorials}/datasets/crater_tuto (100%) rename {Tutos => tutorials}/datasets/data_acc (100%) rename {Tutos => tutorials}/datasets/diff/mnist_test.csv (100%) rename {Tutos => tutorials}/datasets/human.off (100%) rename {Tutos => tutorials}/datasets/human.txt (100%) rename {Tutos => tutorials}/datasets/mnist_test.csv (100%) rename {Tutos => tutorials}/datasets/tore3D_1307.off (100%) rename {Tutos => tutorials}/datasets/trefoil_dist (100%) rename {Tutos => tutorials}/utils/KeplerMapperVisuFromTxtFile.py (100%) rename {Tutos => tutorials}/utils/broken_links_scraper.py (100%) rename {Tutos => tutorials}/utils/persistence_statistics.py (100%) rename {Tutos => tutorials}/utils/utils_dtm.py (100%) rename {Tutos => tutorials}/utils/utils_epd.py (100%) rename {Tutos => tutorials}/utils/utils_quantization.py (100%) diff --git a/.github/workflows/test_notebooks.yml b/.github/workflows/test_notebooks.yml index 569c580..06cf1e9 100644 --- a/.github/workflows/test_notebooks.yml +++ b/.github/workflows/test_notebooks.yml @@ -22,4 +22,4 @@ jobs: pip install jupyter - name: Execute notebooks run: | - for f in Tutos/*.ipynb; do echo "Processing $f file.."; time jupyter nbconvert --TagRemovePreprocessor.enabled=True --TagRemovePreprocessor.remove_cell_tags="['do_not_execute']" --to notebook --ExecutePreprocessor.timeout=600 --inplace --execute $f;done; + for f in tutorials/*.ipynb; do echo "Processing $f file.."; time jupyter nbconvert --TagRemovePreprocessor.enabled=True --TagRemovePreprocessor.remove_cell_tags="['do_not_execute']" --to notebook --ExecutePreprocessor.timeout=600 --inplace --execute $f;done; diff --git a/Tutos/Images/CodeCogsEqnRp.gif b/tutorials/Images/CodeCogsEqnRp.gif similarity index 100% rename from Tutos/Images/CodeCogsEqnRp.gif rename to tutorials/Images/CodeCogsEqnRp.gif diff --git a/Tutos/Images/MatchingDiag.png b/tutorials/Images/MatchingDiag.png similarity index 100% rename from Tutos/Images/MatchingDiag.png rename to tutorials/Images/MatchingDiag.png diff --git a/Tutos/Images/Pers14.PNG b/tutorials/Images/Pers14.PNG similarity index 100% rename from Tutos/Images/Pers14.PNG rename to tutorials/Images/Pers14.PNG diff --git a/Tutos/Images/Simplex_tree_representation.png b/tutorials/Images/Simplex_tree_representation.png similarity index 100% rename from Tutos/Images/Simplex_tree_representation.png rename to tutorials/Images/Simplex_tree_representation.png diff --git a/Tutos/Images/nappe_distance_avec_bruit.png b/tutorials/Images/nappe_distance_avec_bruit.png similarity index 100% rename from Tutos/Images/nappe_distance_avec_bruit.png rename to tutorials/Images/nappe_distance_avec_bruit.png diff --git a/Tutos/Images/nappe_distance_sans_bruit.png b/tutorials/Images/nappe_distance_sans_bruit.png similarity index 100% rename from Tutos/Images/nappe_distance_sans_bruit.png rename to tutorials/Images/nappe_distance_sans_bruit.png diff --git a/Tutos/Images/nappe_dtm_avec_bruit.png b/tutorials/Images/nappe_dtm_avec_bruit.png similarity index 100% rename from Tutos/Images/nappe_dtm_avec_bruit.png rename to tutorials/Images/nappe_dtm_avec_bruit.png diff --git a/Tutos/Images/pers.png b/tutorials/Images/pers.png similarity index 100% rename from Tutos/Images/pers.png rename to tutorials/Images/pers.png diff --git a/Tutos/Images/persistence.png b/tutorials/Images/persistence.png similarity index 100% rename from Tutos/Images/persistence.png rename to tutorials/Images/persistence.png diff --git a/Tutos/Images/sous_niveau_kPDTM2.png b/tutorials/Images/sous_niveau_kPDTM2.png similarity index 100% rename from Tutos/Images/sous_niveau_kPDTM2.png rename to tutorials/Images/sous_niveau_kPDTM2.png diff --git a/Tutos/Images/sous_niveau_kPDTM_cov2.png b/tutorials/Images/sous_niveau_kPDTM_cov2.png similarity index 100% rename from Tutos/Images/sous_niveau_kPDTM_cov2.png rename to tutorials/Images/sous_niveau_kPDTM_cov2.png diff --git a/Tutos/Images/sublevf.png b/tutorials/Images/sublevf.png similarity index 100% rename from Tutos/Images/sublevf.png rename to tutorials/Images/sublevf.png diff --git a/Tutos/Images/symbole_infini.png b/tutorials/Images/symbole_infini.png similarity index 100% rename from Tutos/Images/symbole_infini.png rename to tutorials/Images/symbole_infini.png diff --git a/Tutos/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb b/tutorials/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb rename to tutorials/Tuto-GUDHI-Barycenters-of-persistence-diagrams.ipynb diff --git a/Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb b/tutorials/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb rename to tutorials/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb diff --git a/Tutos/Tuto-GUDHI-DTM-filtrations.ipynb b/tutorials/Tuto-GUDHI-DTM-filtrations.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-DTM-filtrations.ipynb rename to tutorials/Tuto-GUDHI-DTM-filtrations.ipynb diff --git a/Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb b/tutorials/Tuto-GUDHI-Expected-persistence-diagrams.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb rename to tutorials/Tuto-GUDHI-Expected-persistence-diagrams.ipynb diff --git a/Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb b/tutorials/Tuto-GUDHI-PyTorch-optimization.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb rename to tutorials/Tuto-GUDHI-PyTorch-optimization.ipynb diff --git a/Tutos/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb b/tutorials/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb rename to tutorials/Tuto-GUDHI-Quantization-of-persistence-diagrams.ipynb diff --git a/Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb b/tutorials/Tuto-GUDHI-alpha-complex-visualization.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb rename to tutorials/Tuto-GUDHI-alpha-complex-visualization.ipynb diff --git a/Tutos/Tuto-GUDHI-cover-complex.ipynb b/tutorials/Tuto-GUDHI-cover-complex.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-cover-complex.ipynb rename to tutorials/Tuto-GUDHI-cover-complex.ipynb diff --git a/Tutos/Tuto-GUDHI-cubical-complexes.ipynb b/tutorials/Tuto-GUDHI-cubical-complexes.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-cubical-complexes.ipynb rename to tutorials/Tuto-GUDHI-cubical-complexes.ipynb diff --git a/Tutos/Tuto-GUDHI-extended-persistence.ipynb b/tutorials/Tuto-GUDHI-extended-persistence.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-extended-persistence.ipynb rename to tutorials/Tuto-GUDHI-extended-persistence.ipynb diff --git a/Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb b/tutorials/Tuto-GUDHI-kPDTM-kPLM.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb rename to tutorials/Tuto-GUDHI-kPDTM-kPLM.ipynb diff --git a/Tutos/Tuto-GUDHI-optimization.ipynb b/tutorials/Tuto-GUDHI-optimization.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-optimization.ipynb rename to tutorials/Tuto-GUDHI-optimization.ipynb diff --git a/Tutos/Tuto-GUDHI-persistence-diagrams.ipynb b/tutorials/Tuto-GUDHI-persistence-diagrams.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-persistence-diagrams.ipynb rename to tutorials/Tuto-GUDHI-persistence-diagrams.ipynb diff --git a/Tutos/Tuto-GUDHI-persistent-entropy.ipynb b/tutorials/Tuto-GUDHI-persistent-entropy.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-persistent-entropy.ipynb rename to tutorials/Tuto-GUDHI-persistent-entropy.ipynb diff --git a/Tutos/Tuto-GUDHI-perslay-visu.ipynb b/tutorials/Tuto-GUDHI-perslay-visu.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-perslay-visu.ipynb rename to tutorials/Tuto-GUDHI-perslay-visu.ipynb diff --git a/Tutos/Tuto-GUDHI-representations.ipynb b/tutorials/Tuto-GUDHI-representations.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-representations.ipynb rename to tutorials/Tuto-GUDHI-representations.ipynb diff --git a/Tutos/Tuto-GUDHI-simplex-Trees.ipynb b/tutorials/Tuto-GUDHI-simplex-Trees.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-simplex-Trees.ipynb rename to tutorials/Tuto-GUDHI-simplex-Trees.ipynb diff --git a/Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb b/tutorials/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb rename to tutorials/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb diff --git a/Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb b/tutorials/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb similarity index 100% rename from Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb rename to tutorials/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb diff --git a/Tutos/datasets/Corr_ProteinBinding/1anf.corr_1.txt b/tutorials/datasets/Corr_ProteinBinding/1anf.corr_1.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1anf.corr_1.txt rename to tutorials/datasets/Corr_ProteinBinding/1anf.corr_1.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1ez9.corr_1.txt b/tutorials/datasets/Corr_ProteinBinding/1ez9.corr_1.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1ez9.corr_1.txt rename to tutorials/datasets/Corr_ProteinBinding/1ez9.corr_1.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1fqa.corr_2.txt b/tutorials/datasets/Corr_ProteinBinding/1fqa.corr_2.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1fqa.corr_2.txt rename to tutorials/datasets/Corr_ProteinBinding/1fqa.corr_2.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1fqb.corr_3.txt b/tutorials/datasets/Corr_ProteinBinding/1fqb.corr_3.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1fqb.corr_3.txt rename to tutorials/datasets/Corr_ProteinBinding/1fqb.corr_3.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1fqc.corr_2.txt b/tutorials/datasets/Corr_ProteinBinding/1fqc.corr_2.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1fqc.corr_2.txt rename to tutorials/datasets/Corr_ProteinBinding/1fqc.corr_2.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1fqd.corr_3.txt b/tutorials/datasets/Corr_ProteinBinding/1fqd.corr_3.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1fqd.corr_3.txt rename to tutorials/datasets/Corr_ProteinBinding/1fqd.corr_3.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1jw4.corr_4.txt b/tutorials/datasets/Corr_ProteinBinding/1jw4.corr_4.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1jw4.corr_4.txt rename to tutorials/datasets/Corr_ProteinBinding/1jw4.corr_4.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1jw5.corr_5.txt b/tutorials/datasets/Corr_ProteinBinding/1jw5.corr_5.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1jw5.corr_5.txt rename to tutorials/datasets/Corr_ProteinBinding/1jw5.corr_5.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1lls.corr_6.txt b/tutorials/datasets/Corr_ProteinBinding/1lls.corr_6.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1lls.corr_6.txt rename to tutorials/datasets/Corr_ProteinBinding/1lls.corr_6.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1mpd.corr_4.txt b/tutorials/datasets/Corr_ProteinBinding/1mpd.corr_4.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1mpd.corr_4.txt rename to tutorials/datasets/Corr_ProteinBinding/1mpd.corr_4.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/1omp.corr_7.txt b/tutorials/datasets/Corr_ProteinBinding/1omp.corr_7.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/1omp.corr_7.txt rename to tutorials/datasets/Corr_ProteinBinding/1omp.corr_7.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/3hpi.corr_5.txt b/tutorials/datasets/Corr_ProteinBinding/3hpi.corr_5.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/3hpi.corr_5.txt rename to tutorials/datasets/Corr_ProteinBinding/3hpi.corr_5.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/3mbp.corr_6.txt b/tutorials/datasets/Corr_ProteinBinding/3mbp.corr_6.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/3mbp.corr_6.txt rename to tutorials/datasets/Corr_ProteinBinding/3mbp.corr_6.txt diff --git a/Tutos/datasets/Corr_ProteinBinding/4mbp.corr_7.txt b/tutorials/datasets/Corr_ProteinBinding/4mbp.corr_7.txt similarity index 100% rename from Tutos/datasets/Corr_ProteinBinding/4mbp.corr_7.txt rename to tutorials/datasets/Corr_ProteinBinding/4mbp.corr_7.txt diff --git a/Tutos/datasets/ElongatedTorus.txt b/tutorials/datasets/ElongatedTorus.txt similarity index 100% rename from Tutos/datasets/ElongatedTorus.txt rename to tutorials/datasets/ElongatedTorus.txt diff --git a/Tutos/datasets/NoisyTrefoil180.txt b/tutorials/datasets/NoisyTrefoil180.txt similarity index 100% rename from Tutos/datasets/NoisyTrefoil180.txt rename to tutorials/datasets/NoisyTrefoil180.txt diff --git a/Tutos/datasets/crater_tuto b/tutorials/datasets/crater_tuto similarity index 100% rename from Tutos/datasets/crater_tuto rename to tutorials/datasets/crater_tuto diff --git a/Tutos/datasets/data_acc b/tutorials/datasets/data_acc similarity index 100% rename from Tutos/datasets/data_acc rename to tutorials/datasets/data_acc diff --git a/Tutos/datasets/diff/mnist_test.csv b/tutorials/datasets/diff/mnist_test.csv similarity index 100% rename from Tutos/datasets/diff/mnist_test.csv rename to tutorials/datasets/diff/mnist_test.csv diff --git a/Tutos/datasets/human.off b/tutorials/datasets/human.off similarity index 100% rename from Tutos/datasets/human.off rename to tutorials/datasets/human.off diff --git a/Tutos/datasets/human.txt b/tutorials/datasets/human.txt similarity index 100% rename from Tutos/datasets/human.txt rename to tutorials/datasets/human.txt diff --git a/Tutos/datasets/mnist_test.csv b/tutorials/datasets/mnist_test.csv similarity index 100% rename from Tutos/datasets/mnist_test.csv rename to tutorials/datasets/mnist_test.csv diff --git a/Tutos/datasets/tore3D_1307.off b/tutorials/datasets/tore3D_1307.off similarity index 100% rename from Tutos/datasets/tore3D_1307.off rename to tutorials/datasets/tore3D_1307.off diff --git a/Tutos/datasets/trefoil_dist b/tutorials/datasets/trefoil_dist similarity index 100% rename from Tutos/datasets/trefoil_dist rename to tutorials/datasets/trefoil_dist diff --git a/Tutos/utils/KeplerMapperVisuFromTxtFile.py b/tutorials/utils/KeplerMapperVisuFromTxtFile.py similarity index 100% rename from Tutos/utils/KeplerMapperVisuFromTxtFile.py rename to tutorials/utils/KeplerMapperVisuFromTxtFile.py diff --git a/Tutos/utils/broken_links_scraper.py b/tutorials/utils/broken_links_scraper.py similarity index 100% rename from Tutos/utils/broken_links_scraper.py rename to tutorials/utils/broken_links_scraper.py diff --git a/Tutos/utils/persistence_statistics.py b/tutorials/utils/persistence_statistics.py similarity index 100% rename from Tutos/utils/persistence_statistics.py rename to tutorials/utils/persistence_statistics.py diff --git a/Tutos/utils/utils_dtm.py b/tutorials/utils/utils_dtm.py similarity index 100% rename from Tutos/utils/utils_dtm.py rename to tutorials/utils/utils_dtm.py diff --git a/Tutos/utils/utils_epd.py b/tutorials/utils/utils_epd.py similarity index 100% rename from Tutos/utils/utils_epd.py rename to tutorials/utils/utils_epd.py diff --git a/Tutos/utils/utils_quantization.py b/tutorials/utils/utils_quantization.py similarity index 100% rename from Tutos/utils/utils_quantization.py rename to tutorials/utils/utils_quantization.py From e2911a2a923d9c6d4ffee1c00a4280b34fd80ccc Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Mon, 23 Jun 2025 13:49:21 +0200 Subject: [PATCH 5/5] Rename Tutos as tutorials --- README.Rmd | 6 ++--- README.md | 66 +++++++++++++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/README.Rmd b/README.Rmd index dd03197..0badcfb 100644 --- a/README.Rmd +++ b/README.Rmd @@ -27,7 +27,7 @@ TDA typically aims at extracting topological signatures from a point cloud in $\ A simplicial complex is a set of [simplices](https://en.wikipedia.org/wiki/Simplex), they can be seen as higher dimensional generalization of graphs. These are mathematical objects that are both topological and combinatorial, a property making them particularly useful for TDA. The challenge here is to define such structures that are proven to reflect relevant information about the structure of data and that can be effectively constructed and manipulated in practice. Below is an exemple of simplicial complex: ```{r simplicial-complex-example} -knitr::include_graphics("Tutos/Images/Pers14.PNG") +knitr::include_graphics("tutorials/Images/Pers14.PNG") ``` A filtration is an increasing sequence of sub-complexes of a simplicial complex $\mathcal{K}$. It can be seen as ordering the simplices included in the complex $\mathcal{K}$. Indeed, simpicial complexes often come with a specific order, as for [Vietoris-Rips complexes](https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex), [Cech complexes](https://en.wikipedia.org/wiki/%C4%8Cech_complex) and [alpha complexes](https://en.wikipedia.org/wiki/Alpha_shape#Alpha_complex). @@ -45,7 +45,7 @@ knitr::include_graphics("https://gudhi.inria.fr/python/latest/_images/Simplex_tr TDA signatures can extracted from point clouds but in many cases in data sciences the question is to study the topology of the sublevel sets of a function. ```{r sublevel-sets-example} -knitr::include_graphics("Tutos/Images/sublevf.png") +knitr::include_graphics("tutorials/Images/sublevf.png") ``` Above is an example for a function defined on a subset of $\mathbb{R}$ but in general the function $f$ is defined on a subset of $\mathbb{R}^d$. @@ -59,7 +59,7 @@ Homology is a well-known concept in algebraic topology. It provides a powerful t Persistent homology is a powerful tool to compute, study and encode efficiently multiscale topological features of nested families of simplicial complexes and topological spaces. It encodes the evolution of the homology groups of the nested complexes across the scales. The diagram below shows several level sets of the filtration: ```{r persistence} -knitr::include_graphics("Tutos/Images/pers.png") +knitr::include_graphics("tutorials/Images/pers.png") ``` [Notebook: persistence diagrams](Tuto-GUDHI-persistence-diagrams.ipynb) In this notebook we show how to compute barcodes and persistence diagrams from a filtration defined on the Protein binding dataset. This tutorial also introduces the bottleneck distance between persistence diagrams. diff --git a/README.md b/README.md index a468acb..3a32b94 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ structures that are proven to reflect relevant information about the structure of data and that can be effectively constructed and manipulated in practice. Below is an exemple of simplicial complex: -![simplicial complex example](Tutos/Images/Pers14.PNG) +![simplicial complex example](tutorials/Images/Pers14.PNG) A filtration is an increasing sequence of sub-complexes of a simplicial complex $\mathcal{K}$. It can be seen as ordering the simplices included in @@ -50,15 +50,15 @@ complexes](https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex), [alpha complexes](https://en.wikipedia.org/wiki/Alpha_shape#Alpha_complex). -[Notebook: Simplex trees](Tutos/Tuto-GUDHI-simplex-Trees.ipynb). In Gudhi, +[Notebook: Simplex trees](tutorials/Tuto-GUDHI-simplex-Trees.ipynb). In Gudhi, filtered simplicial complexes are encoded through a data structure called simplex tree. Vertices are represented as integers, edges as pairs of integers, etc. -![simplex tree representation](Tutos/Images/Simplex_tree_representation.png) +![simplex tree representation](tutorials/Images/Simplex_tree_representation.png) [Notebook: Vietoris-Rips complexes and alpha complexes from data -points](Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb). +points](tutorials/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb). In practice, the first step of the **TDA Analysis Pipeline** is to define a filtration of simplicial complexes for some data. This notebook explains how to build Vietoris-Rips complexes and alpha complexes (represented as @@ -66,11 +66,11 @@ simplex trees) from data points in $\mathbb{R}^d$, using the simplex tree data structure. -This [Notebook](Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb) shows how to visualize simplicial complexes. +This [Notebook](tutorials/Tuto-GUDHI-alpha-complex-visualization.ipynb) shows how to visualize simplicial complexes. [Notebook: Rips and alpha complexes from pairwise -distance](Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb). +distance](tutorials/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb). It is also possible to define Rips complexes in general metric spaces from a matrix of pairwise distances. The definition of the metric on the data is usually given as an input or guided by the application. It is @@ -85,13 +85,13 @@ TDA signatures can extracted from point clouds but in many cases in data sciences the question is to study the topology of the sublevel sets of a function. -![function exemple](Tutos/Images/sublevf.png) +![function exemple](tutorials/Images/sublevf.png) Above is an example for a function defined on a subset of $\mathbb{R}$ but in general the function $f$ is defined on a subset of $\mathbb{R}^d$. -[Notebook: cubical complexes](Tutos/Tuto-GUDHI-cubical-complexes.ipynb). One +[Notebook: cubical complexes](tutorials/Tuto-GUDHI-cubical-complexes.ipynb). One first approach for studying the topology of the sublevel sets of a function is to define a regular grid on $\mathbb{R}^d$ and then to define a filtered complex based on this grid and the @@ -115,9 +115,9 @@ simplicial complexes and topological spaces. It encodes the evolution of the homology groups of the nested complexes across the scales. The diagram below shows several level sets of the filtration: -![persistence](Tutos/Images/pers.png) +![persistence](tutorials/Images/pers.png) -[Notebook: persistence diagrams](Tutos/Tuto-GUDHI-persistence-diagrams.ipynb) +[Notebook: persistence diagrams](tutorials/Tuto-GUDHI-persistence-diagrams.ipynb) In this notebook we show how to compute barcodes and persistence diagrams from a filtration defined on the Protein binding dataset. This tutorial also introduces the bottleneck distance between persistence @@ -125,16 +125,16 @@ diagrams. ### 03 - Representations of persistence and linearization -In this [notebook](Tutos/Tuto-GUDHI-representations.ipynb), we learn how to +In this [notebook](tutorials/Tuto-GUDHI-representations.ipynb), we learn how to use alternative representations of persistence with the representations module and finally we see a first example of how to efficiently combine machine learning and topological data analysis. -This [notebook](Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb) +This [notebook](tutorials/Tuto-GUDHI-Expected-persistence-diagrams.ipynb) illustrates the notion of “Expected Persistence Diagram”, which is a way to encode the topology of a random process as a deterministic measure. -This [notebook](Tutos/Tuto-GUDHI-persistent-entropy.ipynb) shows how to summarize +This [notebook](tutorials/Tuto-GUDHI-persistent-entropy.ipynb) shows how to summarize the information given by persistent homology using persistent entropy (a number) and the ES-function (a curve) and explains in which situations they can be useful. @@ -146,7 +146,7 @@ features close to the diagonal. Since they correspond to topological structures that die very soon after they appear in the filtration, these points are generally considered as “topological noise”. Confidence regions for persistence diagram provide a rigorous framework to this -idea. This [notebook](Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) +idea. This [notebook](tutorials/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) introduces the subsampling approach of [Fasy et al. 2014 AoS](https://projecteuclid.org/download/pdfview_1/euclid.aos/1413810729). @@ -167,15 +167,15 @@ Two libraries related to Gudhi: tutorial](https://github.com/martinroyer/atol/blob/master/demo/atol-demo.ipynb). - [Perslay](https://github.com/MathieuCarriere/perslay): A Simple and Versatile Neural Network Layer for Persistence Diagrams. See [this - notebook](Tutos/Tuto-GUDHI-perslay-visu.ipynb). + notebook](tutorials/Tuto-GUDHI-perslay-visu.ipynb). ### 07 - Alternative filtrations and robust TDA -This [notebook](Tutos/Tuto-GUDHI-DTM-filtrations.ipynb) introduces the +This [notebook](tutorials/Tuto-GUDHI-DTM-filtrations.ipynb) introduces the distance to measure (DTM) filtration, as defined in [this paper](https://arxiv.org/abs/1811.04757). This filtration can be used for robust TDA. The DTM can also be used for robust approximations of -compact sets, see this [notebook](Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb). +compact sets, see this [notebook](tutorials/Tuto-GUDHI-kPDTM-kPLM.ipynb). ### 08 - Topological Data Analysis for Time series @@ -185,49 +185,49 @@ compact sets, see this [notebook](Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb). ### 11 - Inverse problem and optimization with TDA -In this [notebook](Tutos/Tuto-GUDHI-optimization.ipynb), we will see how Gudhi and +In this [notebook](tutorials/Tuto-GUDHI-optimization.ipynb), we will see how Gudhi and Tensorflow can be combined to perform optimization of persistence diagrams to solve an inverse problem. This other, less complete -[notebook](Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb) shows that this kind of +[notebook](tutorials/Tuto-GUDHI-PyTorch-optimization.ipynb) shows that this kind of optimization works just as well with PyTorch. ## Complete list of notebooks for TDA -[Simplex trees](Tutos/Tuto-GUDHI-simplex-Trees.ipynb) +[Simplex trees](tutorials/Tuto-GUDHI-simplex-Trees.ipynb) [Vietoris-Rips complexes and alpha complexes from data -points](Tutos/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb) +points](tutorials/Tuto-GUDHI-simplicial-complexes-from-data-points.ipynb) [Visualizing simplicial -complexes](Tutos/Tuto-GUDHI-alpha-complex-visualization.ipynb) +complexes](tutorials/Tuto-GUDHI-alpha-complex-visualization.ipynb) [Rips and alpha complexes from pairwise -distance](Tutos/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb) +distance](tutorials/Tuto-GUDHI-simplicial-complexes-from-distance-matrix.ipynb) -[Cubical complexes](Tutos/Tuto-GUDHI-cubical-complexes.ipynb) +[Cubical complexes](tutorials/Tuto-GUDHI-cubical-complexes.ipynb) [Persistence diagrams and bottleneck -distance](Tutos/Tuto-GUDHI-persistence-diagrams.ipynb) +distance](tutorials/Tuto-GUDHI-persistence-diagrams.ipynb) -[Representations of persistence](Tutos/Tuto-GUDHI-representations.ipynb) +[Representations of persistence](tutorials/Tuto-GUDHI-representations.ipynb) [Expected Persistence -Diagram](Tutos/Tuto-GUDHI-Expected-persistence-diagrams.ipynb) +Diagram](tutorials/Tuto-GUDHI-Expected-persistence-diagrams.ipynb) [Confidence regions for persistence diagrams - data -points](Tutos/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) +points](tutorials/Tuto-GUDHI-ConfRegions-PersDiag-datapoints.ipynb) [ATOL tutorial](https://github.com/martinroyer/atol/blob/master/demo/atol-demo.ipynb) -[Perslay](Tutos/Tuto-GUDHI-perslay-visu.ipynb) +[Perslay](tutorials/Tuto-GUDHI-perslay-visu.ipynb) -[DTM-filtrations](Tutos/Tuto-GUDHI-DTM-filtrations.ipynb) +[DTM-filtrations](tutorials/Tuto-GUDHI-DTM-filtrations.ipynb) -[kPDTM-kPLM](Tutos/Tuto-GUDHI-kPDTM-kPLM.ipynb) +[kPDTM-kPLM](tutorials/Tuto-GUDHI-kPDTM-kPLM.ipynb) -[Inverse problem and optimization with TDA](Tutos/Tuto-GUDHI-optimization.ipynb) +[Inverse problem and optimization with TDA](tutorials/Tuto-GUDHI-optimization.ipynb) -[PyTorch differentiation of diagrams](Tutos/Tuto-GUDHI-PyTorch-optimization.ipynb) +[PyTorch differentiation of diagrams](tutorials/Tuto-GUDHI-PyTorch-optimization.ipynb) Contact :