wddtw_distance#

wddtw_distance(x: ndarray, y: ndarray, window: float = None, g: float = 0.05) float[source]#

Compute the wddtw distance between two time series.

WDDTW was first proposed in [1] as an extension of DDTW. By adding a weight to the derivative it means the alignment isn’t only considering the shape of the time series, but also the phase.

Formally the derivative is calculated as:

\[D_{x}[q] = \frac{{}(q_{i} - q_{i-1} + ((q_{i+1} - q_{i-1}/2)}{2}\]

Therefore a weighted derivative can be calculated using D (the derivative) as:

\[d_{w}(x_{i}, y_{j}) = ||w_{|i-j|}(D_{x_{i}} - D_{y_{j}})||\]
Parameters:
x: np.ndarray, of shape (n_channels, n_timepoints) or (n_timepoints,)

First time series.

y: np.ndarray, of shape (m_channels, m_timepoints) or (m_timepoints,)

Second time series.

window: float, defaults=None

The window to use for the bounding matrix. If None, no bounding matrix is used.

g: float, defaults=0.05

Constant that controls the level of penalisation for the points with larger phase difference. Default is 0.05.

Returns:
float

wddtw distance between x and y.

Raises:
ValueError

If x and y are not 1D or 2D arrays. If n_timepoints or m_timepoints are less than 2.

References

[1]

Young-Seon Jeong, Myong K. Jeong, Olufemi A. Omitaomu, Weighted dynamic time

warping for time series classification, Pattern Recognition, Volume 44, Issue 9, 2011, Pages 2231-2240, ISSN 0031-3203, https://doi.org/10.1016/j.patcog.2010.09.022.

Examples

>>> import numpy as np
>>> from aeon.distances import wddtw_distance
>>> x = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
>>> y = np.array([[42, 23, 21, 55, 1, 19, 33, 34, 29, 19]])
>>> dist = wddtw_distance(x, y)