{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Documentation for the latest version of Gudhi: http://gudhi.gforge.inria.fr/python/latest/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Simplicial complexes and simplex trees" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Gudhi, (filtered) simplicial complexes are encoded through a data structure called simplex tree. Here is a very simple example illustrating the use of simplex tree to represent simplicial complexes. See the Gudhi documentation for a complete list of functionalities. Try the following code and a few other functionalities from the documentation to get used to the Simplex Tree data structure." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import gudhi as gd\n", "import random as rd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First simplex inserted!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st = gd.SimplexTree() # Create an empty simplicial complex\n", "\n", "# Simplicies can be inserted 1 by 1\n", "# Vertices are indexed by integers\n", "if st.insert([0,1]):\n", " print(\"First simplex inserted!\")\n", "st.insert([1,2])\n", "st.insert([2,3])\n", "st.insert([3,0])\n", "st.insert([0,2])\n", "st.insert([3,1])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "([0], 0.0)\n", "([1], 0.0)\n", "([0, 1], 0.0)\n", "([2], 0.0)\n", "([0, 2], 0.0)\n", "([1, 2], 0.0)\n", "([3], 0.0)\n", "([0, 3], 0.0)\n", "([1, 3], 0.0)\n", "([2, 3], 0.0)\n" ] } ], "source": [ "L = st.get_filtration() # Get a list with all simplices\n", "# Notice that inserting an edge automatically inserts its vertices, if they were not already in the complex\n", "for simplex in L:\n", " print(simplex)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[([0], 0.0),\n", " ([1], 0.0),\n", " ([0, 1], 0.0),\n", " ([2], 0.0),\n", " ([0, 2], 0.0),\n", " ([1, 2], 0.0),\n", " ([3], 0.0),\n", " ([0, 3], 0.0),\n", " ([1, 3], 0.0),\n", " ([2, 3], 0.0),\n", " ([0, 1, 2], 0.1),\n", " ([1, 2, 3], 0.2),\n", " ([0, 2, 3], 0.3),\n", " ([0, 1, 3], 0.4),\n", " ([4], 0.7),\n", " ([2, 4], 0.7),\n", " ([3, 4], 0.7),\n", " ([2, 3, 4], 0.7)]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Insert the 2-skeleton, giving some filtration values to the faces\n", "st.insert([0,1,2],filtration=0.1)\n", "st.insert([1,2,3],filtration=0.2)\n", "st.insert([0,2,3],filtration=0.3)\n", "st.insert([0,1,3],filtration=0.4)\n", "\n", "# If you add a new simplex with a given filtration value, all its faces that \n", "# were not in the complex are inserted with the same filtration value\n", "st.insert([2,3,4],filtration=0.7)\n", "st.get_filtration()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dimension= 2\n", "filtration[1,2]= 0.0\n", "filtration[4,2]= 0.7\n", "num_simplices= 18\n", "num_vertices= 5\n", "skeleton[2]= [([0, 1, 2], 0.1), ([0, 1, 3], 0.4), ([0, 1], 0.0), ([0, 2, 3], 0.3), ([0, 2], 0.0), ([0, 3], 0.0), ([0], 0.0), ([1, 2, 3], 0.2), ([1, 2], 0.0), ([1, 3], 0.0), ([1], 0.0), ([2, 3, 4], 0.7), ([2, 3], 0.0), ([2, 4], 0.7), ([2], 0.0), ([3, 4], 0.7), ([3], 0.0), ([4], 0.7)]\n", "skeleton[1]= [([0, 1], 0.0), ([0, 2], 0.0), ([0, 3], 0.0), ([0], 0.0), ([1, 2], 0.0), ([1, 3], 0.0), ([1], 0.0), ([2, 3], 0.0), ([2, 4], 0.7), ([2], 0.0), ([3, 4], 0.7), ([3], 0.0), ([4], 0.7)]\n", "skeleton[0]= [([0], 0.0), ([1], 0.0), ([2], 0.0), ([3], 0.0), ([4], 0.7)]\n" ] } ], "source": [ "# Many operations can be done on simplicial complexes, see also the Gudhi documentation and examples\n", "print(\"dimension=\",st.dimension())\n", "print(\"filtration[1,2]=\",st.filtration([1,2]))\n", "print(\"filtration[4,2]=\",st.filtration([4,2]))\n", "print(\"num_simplices=\", st.num_simplices())\n", "print(\"num_vertices=\", st.num_vertices())\n", "print(\"skeleton[2]=\", st.get_skeleton(2))\n", "print(\"skeleton[1]=\", st.get_skeleton(1))\n", "print(\"skeleton[0]=\", st.get_skeleton(0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Filtrations and persistence diagrams" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[([0], 0.0),\n", " ([1], 0.0),\n", " ([2], 0.0),\n", " ([3], 0.0),\n", " ([4], 0.0),\n", " ([0, 1], 1.0),\n", " ([0, 2], 1.0),\n", " ([1, 2], 1.0),\n", " ([0, 3], 1.0),\n", " ([1, 3], 1.0),\n", " ([2, 3], 1.0),\n", " ([2, 4], 1.0),\n", " ([3, 4], 1.0),\n", " ([0, 1, 2], 2.0),\n", " ([0, 1, 3], 2.0),\n", " ([0, 2, 3], 2.0),\n", " ([1, 2, 3], 2.0),\n", " ([2, 3, 4], 2.0)]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# As an example, we assign to each simplex its dimension as filtration value\n", "for splx in st.get_filtration():\n", " st.assign_filtration(splx[0],len(splx[0])-1)\n", "# Let the structure know that we have messed with it and an old filtration cache may be invalid.\n", "# This is redundant here because get_filtration() does it anyway, but not all functions do.\n", "st.initialize_filtration()\n", "st.get_filtration()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(2, (2.0, inf)), (1, (1.0, 2.0)), (1, (1.0, 2.0)), (1, (1.0, 2.0)), (1, (1.0, 2.0)), (0, (0.0, inf)), (0, (0.0, 1.0)), (0, (0.0, 1.0)), (0, (0.0, 1.0)), (0, (0.0, 1.0))]\n" ] } ], "source": [ "# To compute the persistence diagram of the filtered complex\n", "# By default it stops at dimension-1, use persistence_dim_max=True\n", "# to compute homology in all dimensions\n", "diag = st.persistence(persistence_dim_max=True)\n", "# Display each interval as (dimension, (birth, death))\n", "print(diag)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot a persistence diagram\n", "gd.plot_persistence_diagram(diag)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "gd.plot_persistence_barcode(diag)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# To compute the bottleneck distance between diagrams\n", "st2 = gd.SimplexTree()\n", "st2.insert([0,1],filtration=0.0)\n", "st2.insert([1,2],filtration=0.1)\n", "st2.insert([2,0],filtration=0.2)\n", "st2.insert([0,1,2],filtration=0.5)\n", "diag2 = st2.persistence()\n", "gd.plot_persistence_diagram(diag2)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "bottleneck distance in dimension 0: 0.5\n", "bottleneck distance in dimension 1: 0.5\n" ] } ], "source": [ "diag_0 = st.persistence_intervals_in_dimension(0)\n", "diag2_0 = st2.persistence_intervals_in_dimension(0)\n", "dB0 = gd.bottleneck_distance(diag_0, diag2_0)\n", "\n", "diag_1 = st.persistence_intervals_in_dimension(1)\n", "diag2_1 = st2.persistence_intervals_in_dimension(1)\n", "dB1 = gd.bottleneck_distance(diag_1, diag2_1)\n", "\n", "print(\"bottleneck distance in dimension 0:\", dB0)\n", "print(\"bottleneck distance in dimension 1:\", dB1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise\n", "1. Recall the torus is homeomorphic to the surface obtained by identifying the opposite sides of a square as illustrated below. ![Figure 1](TorusTriangle.png) Using Gudhi, construct a triangulation (2-dimensional simplicial complex) of the Torus. Define a filtration on it, compute its persistence and use it to deduce the Betti numbers of the torus (check that you get the correct result using the function betti_numbers()).\n", "2. Use Gudhi to compute the Betti numbers of a sphere of dimension 2 and of a sphere of dimension 3 (hint: the k -dimensional sphere is homeomorphic to the boundary of a (k+1)-dimensional simplex." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "([0, 2, 3], 0.0)\n", "([0, 1, 4], 0.0)\n", "([0, 3, 4], 0.0)\n", "([1, 2, 5], 0.0)\n", "([2, 3, 5], 0.0)\n", "([1, 4, 5], 0.0)\n", "([0, 1, 6], 0.0)\n", "([3, 5, 6], 0.0)\n", "([1, 2, 7], 0.0)\n", "([3, 4, 7], 0.0)\n", "([1, 6, 7], 0.0)\n", "([3, 6, 7], 0.0)\n", "([0, 2, 8], 0.0)\n", "([4, 5, 8], 0.0)\n", "([0, 6, 8], 0.0)\n", "([5, 6, 8], 0.0)\n", "([2, 7, 8], 0.0)\n", "([4, 7, 8], 0.0)\n" ] }, { "data": { "text/plain": [ "[1, 2, 1]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torus=gd.SimplexTree()\n", "for i in range(3):\n", " for j in range(3):\n", " torus.insert([i+3*j, (i+1)%3+3*j, (i+1)%3+3*((j+1)%3)])\n", " torus.insert([i+3*j, i+3*((j+1)%3), (i+1)%3+3*((j+1)%3)])\n", "for s in torus.get_filtration():\n", " if len(s[0])==3:\n", " print(s)\n", "\n", "# Usually we only compute persistence up to dimension dim-1\n", "# Special request that we also want dimension 2\n", "diagTorus=torus.persistence(persistence_dim_max=True)\n", "# Even if we do not use diagTorus directly, persistence() has to be called first\n", "torus.betti_numbers()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 0, 1]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The simplest version, insert also inserts the boundary, but remove only removes the simplex itself\n", "sphere2=gd.SimplexTree()\n", "tetrahedron=range(4)\n", "sphere2.insert(tetrahedron)\n", "sphere2.remove_maximal_simplex(tetrahedron)\n", "diagSphere2=sphere2.persistence(persistence_dim_max=True)\n", "sphere2.betti_numbers()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 0, 0, 1]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Alternative, inserting the faces of a simplex one by one\n", "sphere3=gd.SimplexTree()\n", "for vertex in range(5):\n", " sphere3.insert([v for v in range(5) if v!=vertex])\n", "diagSphere3=sphere3.persistence(persistence_dim_max=True)\n", "sphere3.betti_numbers()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Stability of persistence for functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The goal of this exercise is to illustrate the persistence stability theorem for functions on a very simple example. The code below allows to define a simplicial complex (the so-called α-complex) triangulating a set of random points in the unit square in the plane. Although we are not using it for this course, note that gudhi also provides the grid-like CubicalComplex, which may be a more natural choice to represent a function on a square." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "n_pts=1000\n", "# Build a random set of points in the unit square\n", "X = np.random.rand(n_pts, 2)\n", "# Compute the alpha-complex filtration\n", "alpha_complex = gd.AlphaComplex(points=X)\n", "st = alpha_complex.create_simplex_tree()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $p_0=(0.25, 0.25)$ and $p_1=(0.75, 0.75)$ be 2 points in the plane $\\mathbb{R}^2$ and $\\sigma=0.05$.\n", "1. Build on such a complex the sublevelset filtration of the function $$f(p)=\\exp(-\\frac{\\|p-p_0\\|^2}{\\sigma})+3\\exp(-\\frac{\\|p-p_1\\|^2}{\\sigma})$$ and compute its persistence diagrams in dimensions 0 and 1.\n", "2. Compute the persistence diagrams of random perturbations of f and compute the Bottleneck distance between these persistence diagrams and the perturbated ones. Verify that the persistence stability theorem for functions is satisfied." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def f(x,y):\n", " sigma=0.05\n", " T1 = np.exp(-(np.square(x-0.25)+np.square(y-0.25))/sigma)\n", " T2 = np.exp(-(np.square(x-0.75)+np.square(y-0.75))/sigma)\n", " return T1 + 3*T2\n", "values = f(X[:,0],X[:,1])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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eORe1w3BYptg0v2vIiJJLNQxBYt8O9U8Il/G8Yq7z47T7ILgm5yesuCbq+Ls5wozKzWz0urq6jBDFhFp1UJNCu6+3d37E3mkb66Z9Y5p8jzQzd37AjOA4gb2c6+757h7TqdOjd5RJSIiu6lF7j5y93XA60S+MjB6/RfuXvcUx/uAY1oiHhERiS/Mu486mVlGML8fcCqwKKZN9KOSzyHyzVciIpIgYd59dAhQbGZ7E0k+T7j7C2Y2ASh192lAoZmdQ+R7atcS+W5eERFJkJR7IF5OTo7rE80iIrvGzN5z95zG2ukTzSIiUk9JQURE6qXcA/HqLFy4kJdeeonu3btz1FFH8fzzz9O1a1cuvPDC5jlASQkUF0NVFWRlwahRkJvbPPsWEUlSKdtTWLRoEWPHjmXfffdlxowZjBkzhi5durBq1ao933lJCYwfD2vWQGZm5Of48ZH1IiJpLGWTQt0Aedu2bdm6dStff/017k6zDJwXF0OHDpCRAXvtFfnZoUNkvYhIipkzZ06T26bc3UedOnXy888/n7Vr17J8+XLatWvHAQccwKeffkrbtm3p3r37nh9k+nRo23bH9Rs3whln7Pn+RURawJYtWygpKWHJkiVs3ry5SXcfpdyYQteuXbnnnnvCPUheXqRklJHxn3Xr1kHHjvCXv4R7bBGRPbR9+3buv/9+xo8fz8iRI7n55pvZf//9m/TalEsKLWLUqMgYAkD79lBbCzU1MHZsYuMSEWlESUkJeXl57Lvvvrz88sv069dvl16fsmMKocrNhQkTIj2DFSsiPydM0N1HIpK01qxZwxVXXMG5555LYWEhM2fO3OWEAOopNCw3V0lARJJeXanod7/7HZdccgmVlZV06NBht/enpCAikqJKSkq4+uqr2W+//ZgxYwZ9+/bd432qfCQikmLWrFnDL3/5S84991yKioqYOXNmsyQEUFIQEUkZ27dv5+6776Znz560bduWyspKLrvsMsys2Y6h8pGISAqYPXs2V199Nd/5znearVQUj3oKIiJJrLq6ml/84hecd955jBkzpllLRfEoKYiIJKHt27dz11130atXL7773e9SWVnJT37yk2YtFcWj8pGISJJ59913ycvLo23btvzrX/+iT58+LXZsJQURkSRRXV3NDTfcwPTp0/nzn//MJZdcEnrPIJbKRyIiCbZ9+3buvPNOevXqRYcOHVi0aBGXXnppiycECLGnYGb7AjOBbwfHecrdb4xp823gIeAY4AvgInf/NKyYpGWUUEIxxVRRRRZZjGIUuejT4SLx1JWK2rVr1+KlonjC7ClsBU52935Af+B0Mxsc0+bnwL/dvTswBfhTiPFICyihhPGMZw1ryCSTNaxhPOMpQV9QJBKturqan//851xwwQWMHTuW119/PeEJAUJMCh6xIVhsE0yxX94wHKj75pqngFMsEf0laTbFFNOBDmSQwV7sRQYZdKADxegLikTgm6WijIwMKisrEzJ20JBQB5rNbG/gPaA78Bd3nx3TJBNYBuDu28ysBjgAWBOznyuAKwAOO+ywMEOWPVRFFZlkfmNde9pTRVWCIhJJHrNmzSIvL4/27dvz6quv0rt370SHtINQB5rdfbu79wc6A7lmFnsG4qXGHb4Kzt3vdfccd8/p1KlTGKFKM8kii1pqv7GullqyyEpQRCKJt3r1an72s58xYsQIrr32Wl577bWkTAjQQncfufs64HXg9JhNy4EuAGa2D9ABWNsSMUk4RjGKGmpYxzq+5mvWsY4aahjFqESHJtLitm/fzl/+8hd69+7N/vvvn3SlonhCSwpm1snMMoL5/YBTgUUxzaZB/dViBPCqp9qXRss35JLLBCbQkY6sYAUd6cgEJujuI2l1Zs2axcCBA3nyySd59dVXmTRpEu3bt090WI0Kc0zhEKA4GFfYC3jC3V8wswlAqbtPAx4AHjazxUR6CCNDjEdaSG7wn0hrtHr1am644QZeeuklJk6cyMiRI5O6ZxArtKTg7guAo+OsHx81vwW4MKwYRERaSt1jrW+66SZGjRpFZWVlSvQMYukxFyIie+idd94hLy+PjIwMXn/9dXr16pXokHabkoKIyG5avXo1119/Pa+88goTJ07koosuSqlSUTx69pGIyC7atm0bd9xxB7169aJjx45UVlam3NhBQ9RTEBHZBW+//TZ5eXl873vf44033qBnz56JDqlZKSmIiDTB559/zvXXX8+MGTPSplQUj8pHIiI7sW3bNm6//XZ69+5Np06d0qpUFI96CiIiDUj3UlE8SgoiIjGiS0WTJk3ixz/+cdr2DGKpfCQiEoguFR144IFUVlam7dhBQ9RTEBEB3nrrLfLy8ujYsWOrKRXFo6QgIq3a559/zrhx43j11VeZOHFiqyoVxaPy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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for s in st.get_filtration():\n", " st.assign_filtration(s[0],max(values[s[0]]))\n", "# We have messed with the filtration\n", "st.initialize_filtration()\n", "diag = st.persistence()\n", "diag_0 = st.persistence_intervals_in_dimension(0)\n", "diag_1 = st.persistence_intervals_in_dimension(1)\n", "gd.plot_persistence_diagram(diag)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAADIJJREFUeJzt3WuMXHUdxvHnsRVrKxSwg0HKsm2CROCNsuEi0RdUEm7SGnlRCASNycaoiEaiNcZQfIXGqBhMSINojdy0oBIFhaBIjKSyW9rQUpBSK5RWu0hSRa1I/Plij3S73cvMOWdmdn7z/SSTzpw5Pee//85+OcztOCIEAOh9b+j2AAAA9SDoAJAEQQeAJAg6ACRB0AEgCYIOAEkQdABIgqADQBIEHQCSmN/JnS1ZsiQGBwc7uUsA6Hmjo6MvRURjtvU6GvTBwUGNjIx0cpcA0PNs/6mZ9XjKBQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASRB0AEiCoANAEgQdAJLo6CdFAaAvrF086fb+juyWI3QASIKgA0ASBB0AkiDoAJAEQQeAJAg6ACRB0AEgCYIOAEkQdABIgqADQBIEHQCSIOgAkARBB4AkCDoAJDFr0G3fZnuf7a0Tlh1r+yHbzxZ/HtPeYQIAZtPMEfr3JF0wadkaSQ9HxMmSHi5uAwC6aNagR8Sjkl6etHilpPXF9fWSVtU8LgBAi8o+h/62iNgrScWfx9U3JABAGW1/UdT2sO0R2yNjY2Pt3h0A9K2yQf+L7eMlqfhz33QrRsS6iBiKiKFGo1FydwCA2ZQN+n2Sri6uXy3pp/UMBwBQVjNvW7xT0mOSTrG92/ZHJd0o6Xzbz0o6v7gNAOii+bOtEBGXT3PXiprHAgCogE+KAkASBB0AkiDoAJAEQQeAJAg6ACRB0AEgCYIOAEkQdABIgqADQBIEHQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASRB0AEiCoANAEgQdAJIg6ACQBEEHgCQIOgAkQdABIAmCDgBJEHQASIKgA0ASBB0AkiDoAJAEQQeAJAg6ACRRKei2P2N7m+2ttu+0vaCugQEAWlM66LZPkPQpSUMRcbqkeZJW1zUwAEBrqj7lMl/Sm23Pl7RQ0p7qQwIAlFE66BHxoqSvSXpe0l5J+yPiwcnr2R62PWJ7ZGxsrPxIAQAzqvKUyzGSVkpaJuntkhbZvnLyehGxLiKGImKo0WiUHykAYEZVnnJ5v6Q/RsRYRPxH0r2S3lPPsAAAraoS9OclnW17oW1LWiFpez3DAgC0qspz6BslbZC0SdKTxbbW1TQuAECL5lf5yxFxvaTraxoLAKACPikKAEkQdABIgqADQBIEHQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASRB0AEiCoANAEgQdAJIg6ACQRKVvWwSAvrJ28RTL9nd+HNPgCB0AkiDoAJAEQQeAJAg6ACRB0AEgCYIOAEkQdABIgqADQBIEHQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASVQKuu2jbW+w/bTt7bbPqWtgAIDWVP0+9Jsk/SIiLrN9hKSFNYwJAFBC6aDbPkrS+yR9WJIi4lVJr9YzLABAq6o85bJc0pik79p+wvatthfVNC4AQIuqPOUyX9K7JV0TERtt3yRpjaQvTVzJ9rCkYUkaGBiosDsA/Wpwzc8PW7ZrwRWHr3fgjsPXu/HitoxpLqpyhL5b0u6I2Fjc3qDxwB8iItZFxFBEDDUajQq7AwDMpHTQI+LPkl6wfUqxaIWkp2oZFQCgZVXf5XKNpNuLd7jslPSR6kMCAJRRKegRsVnSUE1jAQBUwCdFASAJgg4ASRB0AEiCoANAEgQdAJIg6ACQBEEHgCQIOgAkQdABIAmCDgBJEHQASIKgA0ASBB0AkiDoAJBE1e9Dxxw01em6mtVPp+tCH1u7eIpl++vbVpdwhA4ASRB0AEiCoANAEgQdAJIg6ACQBEEHgCQIOgAkQdABIAmCDgBJEHQASIKgA0ASBB0AkiDoAJAEQQeAJCoH3fY820/Y/lkdAwIAlFPHEfq1krbXsB0AQAWVgm57qaSLJd1az3AAAGVVPWPRNyV9TtKR061ge1jSsCQNDAxU3B3ajbMdzX1V/o2kDv87TT6bT9mzAnXDHDoTUbNKH6HbvkTSvogYnWm9iFgXEUMRMdRoNMruDgAwiypPuZwr6VLbuyTdJek82z+oZVQAgJaVDnpEfCEilkbEoKTVkn4VEVfWNjIAQEt4HzoAJFH1RVFJUkQ8IumROrYFACiHI3QASIKgA0ASBB0AkiDoAJAEQQeAJAg6ACRB0AEgCYIOAEkQdABIgqADQBIEHQCSIOgAkARBB4Akavm2xU7o1qnROCVbZ/Tbv2/V08gBU+EIHQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASRB0AEiCoANAEgQdAJIg6ACQBEEHgCQIOgAkQdABIAmCDgBJlA667RNt/9r2dtvbbF9b58AAAK2p8n3or0n6bERssn2kpFHbD0XEUzWNDQDQgtJH6BGxNyI2Fdf/Lmm7pBPqGhgAoDW1PIdue1DSuyRtrGN7AIDWVT4Fne23SLpH0qcj4m9T3D8saViSBgYGqu6up3D6us7o1uncevU0cp0c964Fnd33rgVXTLF0f3N/ee3iWsfSDZWO0G2/UeMxvz0i7p1qnYhYFxFDETHUaDSq7A4AMIMq73KxpO9I2h4RX69vSACAMqocoZ8r6SpJ59neXFwuqmlcAIAWlX4OPSJ+K8k1jgUAUAGfFAWAJAg6ACRB0AEgCYIOAEkQdABIgqADQBIEHQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASRB0AEiCoANAEpVPQdcLevVUYUCdpjo92+CBO7owktlNfSq5khKcWq5ZHKEDQBIEHQCSIOgAkARBB4AkCDoAJEHQASAJgg4ASRB0AEiCoANAEgQdAJIg6ACQBEEHgCQIOgAkQdABIIlKQbd9ge1nbO+wvaauQQEAWlc66LbnSfq2pAslnSrpctun1jUwAEBrqhyhnylpR0TsjIhXJd0laWU9wwIAtKpK0E+Q9MKE27uLZQCALqhyCjpPsSwOW8keljRc3HzF9jMV9jkXLJH0Urt34q+0ew+1eX0+emjM7dSRx0cZU/3CSpe0c5dLfNhcNLe/qcfaw26wVO2xcVIzK1UJ+m5JJ064vVTSnskrRcQ6Sesq7GdOsT0SEUPdHsdcwXwcivk4iLk4VCfmo8pTLo9LOtn2MttHSFot6b56hgUAaFXpI/SIeM32JyX9UtI8SbdFxLbaRgYAaEmVp1wUEfdLur+msfSKNE8f1YT5OBTzcRBzcai2z4cjDnsdEwDQg/joPwAk0ddBn+2rC2y/yfbdxf0bbQ8Wy8+0vbm4bLH9wWa3OZe1aT522X6yuG+kcz9NdWXnY8L9A7ZfsX1ds9ucy9o0H333+LA9aPtfE35nbpnwd84o5mOH7W/Zbu0dnBHRlxeNv5D7nKTlko6QtEXSqZPW+bikW4rrqyXdXVxfKGl+cf14Sfs0/nrErNucq5d2zEdxe5ekJd3++To5HxPuv0fSjyRd1+w25+qlHfPRr48PSYOStk6z3d9LOkfjb8V/QNKFrYyrn4/Qm/nqgpWS1hfXN0haYdsR8c+IeK1YvkAHP1DVy1+H0I756GWl50OSbK+StFPSxHd+9eXjQ5p2PnpZpfmYiu3jJR0VEY/FeN2/L2lVK4Pq56A389UFr69TBGu/pLdKku2zbG+T9KSkjxX39/LXIbRjPqTxuD9oe7T41HCvKD0fthdJ+rykG0psc65qx3xIffj4KO5bZvsJ27+x/d4J6++eZZszqvS2xR7XzFcXTLtORGyUdJrtd0pab/uBJrc5V9U+HxFxQNK5EbHH9nGSHrL9dEQ8WuvI26PKfNwg6RsR8cqkA7J+fXxMNx9Sfz4+9koaiIi/2j5D0k9sn9bkNmfUz0Fv5qsL/r/ObtvzJS2W9PLEFSJiu+1/SDq9yW3OVe2Yj5GI2FMs32f7xxr/X9Ve+IWtMh9nSbrM9lclHS3pv7YPSBptYptzVe3zERE39+Pjo3g65d+SFBGjtp+T9I5i/aWzbHNm3X5xoVsXjf/HbKekZTr4osZpk9b5hA59UeOHxfVlOvii30nFpC9pZptz9dKm+Vgk6chi+SJJv5N0Qbd/1nbPx6R11urgi6J9+fiYYT768vEhqSFpXnF9uaQXJR1b3H5c0tk6+KLoRS2Nq9sT0+V/lIsk/UHjr1Z/sVj2ZUmXFtcXaPxV+R0af/V5ebH8Ko2/uLNZ0iZJq2baZq9c6p6P4sG6pbhs65f5mLSN1wPWr4+P6eajXx8fkj5U/Lxbit+XD0zY5pCkrcU2b1bx4c9mL3xSFACS6Od3uQBAKgQdAJIg6ACQBEEHgCQIOgAkQdABIAmCDgBJEHQASOJ/OABNx+3l97AAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Compute the persistence diagram for the randomly perturbated function\n", "pert = 0.05\n", "n_it = 50\n", "B_List0 = []\n", "B_List1 = []\n", "\n", "for i in range(n_it):\n", " # Perturb the values\n", " values_pert = values + np.random.uniform(-pert, pert, len(values))\n", " # We reuse the same complex\n", " for splx in st.get_filtration():\n", " st.assign_filtration(splx[0], max(values_pert[splx[0]]))\n", "\n", " # The filtration has changed\n", " st.initialize_filtration()\n", " diag_pert = st.persistence() #compute persistence diagram(s)\n", " #gd.plot_persistence_diagram(diag_pert)\n", " diag_pert_0 = st.persistence_intervals_in_dimension(0)\n", " diag_pert_1 = st.persistence_intervals_in_dimension(1)\n", " B_List0.append(gd.bottleneck_distance(diag_0,diag_pert_0))\n", " B_List1.append(gd.bottleneck_distance(diag_1,diag_pert_1))\n", "\n", "# Plot histograms of bottleneck distances between the non perturbated fn and\n", "# the perturbated ones. \n", "plt.hist(B_List1,bins=20)\n", "plt.hist(B_List0,bins=20)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Vietoris-Rips and alpha-complex filtrations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are basic instructions to build Vietoris-Rips and α-complex filtrations and compute their persistence." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of simplices in the V-R complex: 42103\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Number of simplices in the alpha-complex: 2315\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#Create a random point cloud in 3D\n", "nb_pts=100\n", "pt_cloud = np.random.rand(nb_pts,3)\n", "#Build Rips-Vietoris filtration and compute its persistence diagram\n", "rips_complex = gd.RipsComplex(pt_cloud,max_edge_length=0.5)\n", "simplex_tree = rips_complex.create_simplex_tree(max_dimension=3)\n", "print(\"Number of simplices in the V-R complex: \",simplex_tree.num_simplices())\n", "diag = simplex_tree.persistence(homology_coeff_field=2, min_persistence=0)\n", "gd.plot_persistence_diagram(diag).show()\n", "#Compute Rips-Vietoris filtration and compute its persistence diagram from\n", "#a pairwise distance matrix\n", "dist_mat = []\n", "for i in range(nb_pts):\n", " ld = []\n", " for j in range(i):\n", " ld.append(np.linalg.norm(pt_cloud[i,:]-pt_cloud[j,:]))\n", " dist_mat.append(ld)\n", "rips_complex2 = gd.RipsComplex(distance_matrix=dist_mat,max_edge_length=0.5)\n", "simplex_tree2 = rips_complex2.create_simplex_tree(max_dimension=3)\n", "diag2 = simplex_tree2.persistence(homology_coeff_field=2, min_persistence=0)\n", "gd.plot_persistence_diagram(diag2).show()\n", "#Compute the alpha-complex filtration and compute its persistence\n", "alpha_complex = gd.AlphaComplex(points=pt_cloud)\n", "simplex_tree3 = alpha_complex.create_simplex_tree()\n", "print(\"Number of simplices in the alpha-complex: \",simplex_tree3.num_simplices())\n", "diag3 = simplex_tree3.persistence(homology_coeff_field=2, min_persistence=0)\n", "gd.plot_persistence_diagram(diag3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Illustrate the stability theorem for persistence diagrams of Vietoris-Rips and α-complex filtrations (take into accound that AlphaComplex uses the square of distances as filtration values).\n", "2. What happens to Vietoris-Rips and α-complex filtrations when the size of the point cloud increases? When the ambient dimension increases?" ] } ], "metadata": { "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.6.3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": false, "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 }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }