summaryrefslogtreecommitdiff
path: root/src/python/doc
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/doc')
-rw-r--r--src/python/doc/barycenter_sum.inc24
-rw-r--r--src/python/doc/barycenter_user.rst60
-rw-r--r--src/python/doc/img/barycenter.pngbin0 -> 12433 bytes
-rw-r--r--src/python/doc/index.rst5
4 files changed, 89 insertions, 0 deletions
diff --git a/src/python/doc/barycenter_sum.inc b/src/python/doc/barycenter_sum.inc
new file mode 100644
index 00000000..da2bdd84
--- /dev/null
+++ b/src/python/doc/barycenter_sum.inc
@@ -0,0 +1,24 @@
+.. table::
+ :widths: 30 50 20
+
+ +-----------------------------------------------------------------+----------------------------------------------------------------------+------------------------------------------------------------------+
+ | .. figure:: | A Frechet mean (or barycenter) is a generalization of the arithmetic | :Author: Theo Lacombe |
+ | ./img/barycenter.png | mean in a non linear space such as the one of persistence diagrams. | |
+ | :figclass: align-center | Given a set of persistence diagrams :math:`\mu_1 \dots \mu_n`, it is | :Introduced in: GUDHI 3.1.0 |
+ | | defined as a minimizer of the variance functional, that is of | |
+ | Illustration of Frechet mean between persistence | :math:`\mu \mapsto \sum_{i=1}^n d_2(\mu,\mu_i)^2`. | :Copyright: MIT |
+ | diagrams. | where :math:`d_2` denotes the Wasserstein-2 distance between | |
+ | | persistence diagrams. | |
+ | | It is known to exist and is generically unique. However, an exact | |
+ | | computation is in general untractable. Current implementation | :Requires: Python Optimal Transport (POT) :math:`\geq` 0.5.1 |
+ | | available is based on [Turner et al, 2014], and uses an EM-scheme to | |
+ | | provide a local minimum of the variance functional (somewhat similar | |
+ | | to the Lloyd algorithm to estimate a solution to the k-means | |
+ | | problem). The local minimum returned depends on the initialization of| |
+ | | the barycenter. | |
+ | | The combinatorial structure of the algorithm limits its | |
+ | | scaling on large scale problems (thousands of diagrams and of points | |
+ | | per diagram). | |
+ +-----------------------------------------------------------------+----------------------------------------------------------------------+------------------------------------------------------------------+
+ | * :doc:`barycenter_user` | |
+ +-----------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/src/python/doc/barycenter_user.rst b/src/python/doc/barycenter_user.rst
new file mode 100644
index 00000000..83e9bebb
--- /dev/null
+++ b/src/python/doc/barycenter_user.rst
@@ -0,0 +1,60 @@
+:orphan:
+
+.. To get rid of WARNING: document isn't included in any toctree
+
+Barycenter user manual
+================================
+Definition
+----------
+
+.. include:: barycenter_sum.inc
+
+This implementation is based on ideas from "Frechet means for distribution of
+persistence diagrams", Turner et al. 2014.
+
+Function
+--------
+.. autofunction:: gudhi.barycenter.lagrangian_barycenter
+
+
+Basic example
+-------------
+
+This example computes the Frechet mean (aka Wasserstein barycenter) between
+four persistence diagrams.
+It is initialized on the 4th diagram.
+As the algorithm is not convex, its output depends on the initialization and
+is only a local minimum of the objective function.
+Initialization can be either given as an integer (in which case the i-th
+diagram of the list is used as initial estimate) or as a diagram.
+If None, it will randomly select one of the diagram of the list
+as initial estimate.
+Note that persistence diagrams must be submitted as
+(n x 2) numpy arrays and must not contain inf values.
+
+.. testcode::
+
+ import gudhi.barycenter
+ import numpy as np
+
+ dg1 = np.array([[0.2, 0.5]])
+ dg2 = np.array([[0.2, 0.7]])
+ dg3 = np.array([[0.3, 0.6], [0.7, 0.8], [0.2, 0.3]])
+ dg4 = np.array([])
+ pdiagset = [dg1, dg2, dg3, dg4]
+ bary = gudhi.barycenter.lagrangian_barycenter(pdiagset=pdiagset,init=3)
+
+ message = "Wasserstein barycenter estimated:"
+ print(message)
+ print(bary)
+
+The output is:
+
+.. testoutput::
+
+ Wasserstein barycenter estimated:
+ [[0.27916667 0.55416667]
+ [0.7375 0.7625 ]
+ [0.2375 0.2625 ]]
+
+
diff --git a/src/python/doc/img/barycenter.png b/src/python/doc/img/barycenter.png
new file mode 100644
index 00000000..cad6af70
--- /dev/null
+++ b/src/python/doc/img/barycenter.png
Binary files differ
diff --git a/src/python/doc/index.rst b/src/python/doc/index.rst
index 3387a64f..96cd3513 100644
--- a/src/python/doc/index.rst
+++ b/src/python/doc/index.rst
@@ -71,6 +71,11 @@ Wasserstein distance
.. include:: wasserstein_distance_sum.inc
+Barycenter
+============
+
+.. include:: barycenter_sum.inc
+
Persistence representations
===========================