ddtw_distance#
- ddtw_distance(x: ndarray, y: ndarray, window: float | None = None, itakura_max_slope: float | None = None, bounding_matrix: ndarray = None, compute_derivative=None, **kwargs: Any) float [source]#
计算时间序列之间的导数动态时间规整 (DDTW) 距离。
DDTW 是 DTW 的一种变体,最初在 [1] 中提出。DDTW 尝试通过更好地考虑时间序列的“形状”来改进 dtw。这是通过将 y 轴数据点视为“形状”的高级特征来完成的。为此,首先计算序列的一阶导数,然后利用这个导数序列进行 dtw 计算。
使用的默认导数是
\[D_{x}[q] = \frac{{}(q_{i} - q_{i-1} + ((q_{i+1} - q_{i-1}/2)}{2}\]其中 q 是原始时间序列,d_q 是导数时间序列。
- 参数:
- x: np.ndarray (1d 或 2d 数组)
第一个时间序列。
- y: np.ndarray (1d 或 2d 数组)
第二个时间序列。
- window: float, 默认值 = None
表示 Sakoe-Chiba 窗口半径的浮点数(如果使用 Sakoe-Chiba 下界)。值必须介于 0. 和 1. 之间。
- itakura_max_slope: float, 默认值 = None
Itakura 平行四边形(如果使用 Itakura 平行四边形下界)的斜率梯度。值必须介于 0. 和 1. 之间。
- bounding_matrix: np.ndarray (大小为 mxn 的 2d 数组,其中 m 是 len(x),n 是 len(y)),
默认值 = None
要使用的自定义边界矩阵。如果已定义,则忽略其他 lower_bounding 参数。矩阵应结构化,使得在边界内考虑的索引值为 0.,而在边界矩阵外的索引值为无穷大。
- compute_derivative: Callable[[np.ndarray], np.ndarray],
默认值 = average slope difference
计算导数的 Callable。如果未提供,则使用两点之间斜率的平均值。
- kwargs: Any
额外 kwargs。
- 返回:
- float
x 和 y 之间的 Ddtw 距离。
- 引发:
- ValueError
如果 sakoe_chiba_window_radius 不是 float。如果 itakura_max_slope 不是 float。如果提供的 x 或 y 值不是 numpy 数组。如果 x 或 y 值维数大于 2。如果提供的 metric 字符串不是定义的有效字符串。如果提供的 metric 对象(类实例)不继承自 NumbaDistance。如果解析的 metric 或 compute derivative callable 未进行 no_python 编译。如果无法确定 metric 类型。如果 compute derivative callable 未进行 no_python 编译。如果同时设置了 window 和 itakura_max_slope。
参考文献
[1]Keogh, Eamonn & Pazzani, Michael. (2002). Derivative Dynamic Time Warping. First SIAM International Conference on Data Mining. 1. 10.1137/1.9781611972719.1.
示例
>>> import numpy as np >>> from sktime.distances import ddtw_distance >>> x_1d = np.array([1, 2, 3, 4]) # 1d array >>> y_1d = np.array([5, 6, 7, 8]) # 1d array >>> ddtw_distance(x_1d, y_1d) np.float64(0.0)
>>> x_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) # 2d array >>> y_2d = np.array([[9, 10, 11, 12], [13, 14, 15, 16]]) # 2d array >>> ddtw_distance(x_2d, y_2d) np.float64(0.0)