Delay Coordinates
A timeseries recorded in some manner from a dynamical system can be used to gain information about the dynamics of the entire phase-space of the system. This can be done by reconstructing a new phase-space from the timeseries. One method that can do this is what is known as delay coordinates embedding or delay coordinates reconstruction.
This is done through reconstruct
or embed
:
#DelayEmbeddings.reconstruct
— Function.
reconstruct(s, γ, τ)
Reconstruct s
using the delay coordinates embedding with γ
temporal neighbors and delay τ
and return the result as a Dataset
.
See embed
for the version that accepts the embedding dimension D = γ+1
directly.
Description
Single Timeseries
If τ
is an integer, then the n-th entry of the embedded space is
If instead τ
is a vector of integers, so that length(τ) == γ
, then the n-th entry is
The reconstructed dataset can have same invariant quantities (like e.g. lyapunov exponents) with the original system that the timeseries were recorded from, for proper γ
and τ
. This is known as the Takens embedding theorem [1, 2]. The case of different delay times allows reconstructing systems with many time scales, see [3].
Notice - The dimension of the returned dataset (i.e. embedding dimension) is γ+1
!
Multiple Timeseries
To make a reconstruction out of a multiple timeseries (i.e. trajectory) the number of timeseries must be known by type, so s
can be either:
s::AbstractDataset{B}
s::SizedAray{A, B}
If the trajectory is for example (x, y) and τ
is integer, then the n-th entry of the embedded space is
If τ
is an AbstractMatrix{Int}
, so that size(τ) == (γ, B)
, then we have
Notice - The dimension of the returned dataset is (γ+1)*B
!
References
[1] : F. Takens, Detecting Strange Attractors in Turbulence — Dynamical Systems and Turbulence, Lecture Notes in Mathematics 366, Springer (1981)
[2] : T. Sauer et al., J. Stat. Phys. 65, pp 579 (1991)
[3] : K. Judd & A. Mees, Physica D 120, pp 273 (1998)
#DelayEmbeddings.embed
— Function.
embed(s, D, τ)
Perform a delay coordinates embedding on signal s
with embedding dimension D
and delay time τ
. The result is returned as a Dataset
, which is a vector of static vectors.
See reconstruct
for an advanced version that supports multiple delay times and can reconstruct multiple timeseries efficiently.
Here are some examples of reconstruct
ing a 3D continuous chaotic system:
using DynamicalSystems, PyPlot ds = Systems.gissinger(ones(3)) data = trajectory(ds, 1000.0, dt = 0.05) xyz = columns(data) figure(figsize = (12,10)) k = 1 for i in 1:3 for τ in [5, 30, 100] R = reconstruct(xyz[i], 1, τ) ax = subplot(3,3,k) plot(R[:, 1], R[:, 2], color = "C$(k-1)", lw = 0.8) title("var = $i, τ = $τ") global k+=1 end end tight_layout() suptitle("2D reconstructed space") subplots_adjust(top=0.9)
τ
and dt
Keep in mind that whether a value of τ
is "reasonable" for continuous systems depends on dt
. In the above example the value τ=30
is good, only for the case of using dt = 0.05
. For shorter/longer dt
one has to adjust properly τ
so that their product τ*dt
is the same.
You can also reconstruct
multidimensional timeseries. For this to be possible, the number of timeseries must be known by Type:
using StaticArrays: Size a = rand(1000, 3) # my trajectory A = Size(1000, 3)(a) # create array with the size as Type information R = reconstruct(A, 2, 2) #aaaall good
9-dimensional Dataset{Float64} with 996 points 0.586737 0.690671 0.551722 0.461107 … 0.188193 0.216192 0.215246 0.909351 0.91001 0.184039 0.901984 0.165364 0.532704 0.0376504 0.461107 0.637003 0.102668 0.188193 0.530936 0.362354 0.638021 0.901984 0.630049 0.789279 0.165364 0.218598 0.110794 0.4218 0.188193 0.216192 0.215246 0.530936 0.910046 0.0928874 0.635087 0.165364 0.532704 0.0376504 0.218598 … 0.559884 0.682263 0.891165 0.530936 0.362354 0.638021 0.910046 0.925997 0.848005 0.962085 0.218598 0.110794 0.4218 0.559884 0.710808 0.278401 0.0480046 0.910046 0.0928874 0.635087 0.925997 0.0329893 0.808522 0.777041 0.559884 0.682263 0.891165 0.710808 0.733236 0.522726 0.663948 ⋮ ⋱ 0.654696 0.910419 0.937102 0.496767 0.902413 0.535011 0.286326 0.112787 0.676533 0.710604 0.782823 0.23796 0.8091 0.331807 0.496767 0.72632 0.0801256 0.902413 0.974982 0.126917 0.0617047 0.782823 0.30521 0.509296 0.23796 0.350376 0.680805 0.819884 0.902413 0.535011 0.286326 0.974982 … 0.8753 0.0753148 0.58837 0.23796 0.8091 0.331807 0.350376 0.874148 0.427944 0.0337361 0.974982 0.126917 0.0617047 0.8753 0.859089 0.923793 0.206666 0.350376 0.680805 0.819884 0.874148 0.83831 0.852862 0.0214431 0.8753 0.0753148 0.58837 0.859089 0.119321 0.975463 0.903877
ds = Systems.towel(); tr = trajectory(ds, 10000) R = reconstruct(tr, 2, 2) # Dataset size is also known by Type!
9-dimensional Dataset{Float64} with 9997 points 0.085 -0.121 0.075 … 0.837347 0.0372633 0.555269 0.285813 -0.0675286 0.238038 0.51969 0.0616256 0.940906 0.76827 -0.038933 0.672094 0.966676 -0.00171595 0.2225 0.681871 0.0508933 0.825263 0.112748 0.0674955 0.653573 0.837347 0.0372633 0.555269 0.386547 -0.0886542 0.869349 0.51969 0.0616256 0.940906 … 0.910741 -0.0316828 0.411607 0.966676 -0.00171595 0.2225 0.306095 0.0689305 0.909129 0.112748 0.0674955 0.653573 0.824263 -0.056185 0.326064 0.386547 -0.0886542 0.869349 0.545332 0.0508239 0.819404 0.910741 -0.0316828 0.411607 0.954994 0.00453815 0.569534 ⋮ ⋱ 0.914702 -0.0315439 0.294266 0.90246 0.0242141 0.539502 0.289932 0.0641239 0.778698 0.335976 0.0735803 0.943945 0.793854 -0.0552801 0.664223 0.86657 -0.0497658 0.214728 0.62671 0.0557527 0.832001 0.430816 0.0535742 0.62743 0.90246 0.0242141 0.539502 … 0.936955 -0.0200112 0.894333 0.335976 0.0735803 0.943945 0.237481 0.0983265 0.353212 0.86657 -0.0497658 0.214728 0.681538 -0.0476555 0.883219 0.430816 0.0535742 0.62743 0.836353 0.0363264 0.380351 0.936955 -0.0200112 0.894333 0.515471 0.0534613 0.898152