summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortakeshimeonerespect <m.takenouchi@fujitsu.com>2020-01-31 08:08:43 +0100
committertakeshimeonerespect <m.takenouchi@fujitsu.com>2020-01-31 08:08:43 +0100
commit68b6e3f3d641cd4a1e86f08bff96e417cc17ac59 (patch)
tree82d11c17c3e5f0e1bcbacda5d209ec08a88cd607 /src
parent5d5f40493ce60f2a606793645bf713c60fb5284d (diff)
timedelay added on fork
Diffstat (limited to 'src')
-rw-r--r--src/python/CMakeLists.txt5
-rw-r--r--src/python/doc/point_cloud.rst7
-rw-r--r--src/python/gudhi/point_cloud/timedelay.py56
-rwxr-xr-xsrc/python/test/test_point_cloud.py35
4 files changed, 103 insertions, 0 deletions
diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt
index b558d4c4..b23ec8a9 100644
--- a/src/python/CMakeLists.txt
+++ b/src/python/CMakeLists.txt
@@ -52,6 +52,7 @@ if(PYTHONINTERP_FOUND)
# Modules that should not be auto-imported in __init__.py
set(GUDHI_PYTHON_MODULES_EXTRA "${GUDHI_PYTHON_MODULES_EXTRA}'representations', ")
set(GUDHI_PYTHON_MODULES_EXTRA "${GUDHI_PYTHON_MODULES_EXTRA}'wasserstein', ")
+ set(GUDHI_PYTHON_MODULES_EXTRA "${GUDHI_PYTHON_MODULES_EXTRA}'point_cloud', ")
add_gudhi_debug_info("Python version ${PYTHON_VERSION_STRING}")
add_gudhi_debug_info("Cython version ${CYTHON_VERSION}")
@@ -221,6 +222,7 @@ endif(CGAL_FOUND)
file(COPY "gudhi/persistence_graphical_tools.py" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/gudhi")
file(COPY "gudhi/representations" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/gudhi/")
file(COPY "gudhi/wasserstein.py" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/gudhi")
+ file(COPY "gudhi/point_cloud" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/gudhi")
add_custom_command(
OUTPUT gudhi.so
@@ -399,6 +401,9 @@ endif(CGAL_FOUND)
add_gudhi_py_test(test_representations)
endif()
+ # Point cloud
+ add_gudhi_py_test(test_point_cloud)
+
# Documentation generation is available through sphinx - requires all modules
if(SPHINX_PATH)
if(MATPLOTLIB_FOUND)
diff --git a/src/python/doc/point_cloud.rst b/src/python/doc/point_cloud.rst
index d668428a..55c74ff3 100644
--- a/src/python/doc/point_cloud.rst
+++ b/src/python/doc/point_cloud.rst
@@ -20,3 +20,10 @@ Subsampling
:members:
:special-members:
:show-inheritance:
+
+TimeDelayEmbedding
+------------------
+
+.. autoclass:: gudhi.point_cloud.timedelay.TimeDelayEmbedding
+ :members:
+
diff --git a/src/python/gudhi/point_cloud/timedelay.py b/src/python/gudhi/point_cloud/timedelay.py
new file mode 100644
index 00000000..5c7ba542
--- /dev/null
+++ b/src/python/gudhi/point_cloud/timedelay.py
@@ -0,0 +1,56 @@
+import numpy as np
+
+class TimeDelayEmbedding:
+ """Point cloud transformation class.
+
+ Embeds time-series data in the R^d according to Takens' Embedding Theorem
+ and obtains the coordinates of each point.
+
+ Parameters
+ ----------
+ dim : int, optional (default=3)
+ `d` of R^d to be embedded.
+
+ delay : int, optional (default=1)
+ Time-Delay embedding.
+
+ skip : int, optional (default=1)
+ How often to skip embedded points.
+
+ """
+ def __init__(self, dim=3, delay=1, skip=1):
+ self._dim = dim
+ self._delay = delay
+ self._skip = skip
+
+ def __call__(self, *args, **kwargs):
+ return self.transform(*args, **kwargs)
+
+ def _transform(self, ts):
+ """Guts of transform method."""
+ return ts[
+ np.add.outer(
+ np.arange(0, len(ts)-self._delay*(self._dim-1), self._skip),
+ np.arange(0, self._dim*self._delay, self._delay))
+ ]
+
+ def transform(self, ts):
+ """Transform method.
+
+ Parameters
+ ----------
+ ts : list[float] or list[list[float]]
+ A single or multiple time-series data.
+
+ Returns
+ -------
+ point clouds : list[list[float, float, float]] or list[list[list[float, float, float]]]
+ Makes point cloud every a single time-series data.
+ """
+ ndts = np.array(ts)
+ if ndts.ndim == 1:
+ # for single.
+ return self._transform(ndts).tolist()
+ else:
+ # for multiple.
+ return np.apply_along_axis(self._transform, 1, ndts).tolist()
diff --git a/src/python/test/test_point_cloud.py b/src/python/test/test_point_cloud.py
new file mode 100755
index 00000000..2ee0c1fb
--- /dev/null
+++ b/src/python/test/test_point_cloud.py
@@ -0,0 +1,35 @@
+from gudhi.point_cloud.timedelay import TimeDelayEmbedding
+
+def test_normal():
+ # Sample array
+ ts = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ # Normal case.
+ prep = TimeDelayEmbedding()
+ attractor = prep(ts)
+ assert (attractor[0] == [1, 2, 3])
+ assert (attractor[1] == [2, 3, 4])
+ assert (attractor[2] == [3, 4, 5])
+ assert (attractor[3] == [4, 5, 6])
+ assert (attractor[4] == [5, 6, 7])
+ assert (attractor[5] == [6, 7, 8])
+ assert (attractor[6] == [7, 8, 9])
+ assert (attractor[7] == [8, 9, 10])
+ # Delay = 3
+ prep = TimeDelayEmbedding(delay=3)
+ attractor = prep(ts)
+ assert (attractor[0] == [1, 4, 7])
+ assert (attractor[1] == [2, 5, 8])
+ assert (attractor[2] == [3, 6, 9])
+ assert (attractor[3] == [4, 7, 10])
+ # Skip = 3
+ prep = TimeDelayEmbedding(skip=3)
+ attractor = prep(ts)
+ assert (attractor[0] == [1, 2, 3])
+ assert (attractor[1] == [4, 5, 6])
+ assert (attractor[2] == [7, 8, 9])
+ # Delay = 2 / Skip = 2
+ prep = TimeDelayEmbedding(delay=2, skip=2)
+ attractor = prep(ts)
+ assert (attractor[0] == [1, 3, 5])
+ assert (attractor[1] == [3, 5, 7])
+ assert (attractor[2] == [5, 7, 9])