wddtw_distance#
- wddtw_distance(x: ndarray, y: ndarray, window: float | None = None, itakura_max_slope: float | None = None, bounding_matrix: ndarray | None = None, compute_derivative=None, g: float = 0.0, **kwargs: Any) float [source]#
计算加权导数动态时间扭曲 (WDDTW) 距离。
WDDTW 最早由 [1] 提出,作为 DDTW 的扩展。通过给导数添加权重,意味着对齐不仅考虑了时间序列的形状,还考虑了相位。
导数的正式计算公式为:
\[D_{x}[q] = \frac{{}(q_{i} - q_{i-1} + ((q_{i+1} - q_{i-1}/2)}{2}\]因此,可以使用 D (导数) 计算加权导数,公式为:
\[d_{w}(x_{i}, y_{j}) = ||w_{|i-j|}(D_{x_{i}} - D_{y_{j}})||\]- 参数:
- x: np.ndarray (1维或2维数组)
第一个时间序列。
- y: np.ndarray (1维或2维数组)
第二个时间序列。
- window: float, 默认 = None
浮点数,表示 Sakoe-Chiba 窗口的半径(如果使用 Sakoe-Chiba 下界)。值必须在 0. 到 1. 之间。
- itakura_max_slope: float, 默认 = None
Itakura 平行四边形的斜率梯度(如果使用 Itakura 平行四边形下界)。值必须在 0. 到 1. 之间。
- bounding_matrix: np.ndarray (大小为 mxn 的 2维数组,其中 m 是 len(x),n 是 len(y)),
默认 = None
要使用的自定义边界矩阵。如果定义,则忽略其他 lower_bounding 参数。矩阵应结构化,使得在边界内的索引值为 0.,边界外的索引值为无穷大。
- compute_derivative: Callable[[np.ndarray], np.ndarray],
默认 = 平均斜率差
计算导数的 Callable 对象。如果未提供,则使用两点之间斜率的平均值。
- g: float, 默认 = 0.
控制函数曲率(斜率)的常数;即,g 控制对相位差较大的点进行惩罚的程度。
- kwargs: Any
额外关键字参数。
- 返回:
- float
x 和 y 之间的 Wddtw 距离。
- 引发:
- ValueError
如果 sakoe_chiba_window_radius 不是浮点数。如果 itakura_max_slope 不是浮点数。如果提供的 x 或 y 值不是 numpy 数组。如果 x 或 y 值超过 2 维。如果提供了指标字符串,但不是有效的定义字符串。如果提供了指标对象(类实例)但未继承自 NumbaDistance。如果无法确定指标类型。如果 compute_derivative callable 未使用 no_python 编译。如果 g 的值不是浮点数。如果同时设置了 window 和 itakura_max_slope。
参考文献
[1]Young-Seon Jeong, Myong K. Jeong, Olufemi A. Omitaomu, 用于时间序列分类的加权动态时间扭曲, Pattern Recognition, Volume 44, Issue 9, 2011, Pages 2231-2240, ISSN 0031-3203, https://doi.org/10.1016/j.patcog.2010.09.022。
时间序列分类的扭曲, Pattern Recognition, 第44卷, 第9期, 2011, 页 2231-2240, ISSN 0031-3203, https://doi.org/10.1016/j.patcog.2010.09.022。
示例
>>> import numpy as np >>> from sktime.distances import wddtw_distance >>> x_1d = np.array([1, 2, 3, 4]) # 1d array >>> y_1d = np.array([5, 6, 7, 8]) # 1d array >>> wddtw_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 >>> wddtw_distance(x_2d, y_2d) np.float64(0.0)