wdtw_distance#

wdtw_distance(x: ndarray, y: ndarray, window: float | None = None, itakura_max_slope: float | None = None, bounding_matrix: ndarray = None, g: float = 0.05, **kwargs: Any) float[来源]#

计算时间序列之间的加权动态时间规整 (WDTW) 距离。

WDTW 最早由 [1] 提出,它根据规整距离增加了一个乘法权重惩罚。这意味着相差较小的时间序列会被施加较小的权重(即惩罚较少),而相差较大的时间序列会被施加较大的权重(即惩罚较多)。

形式上可以描述为

\[d_{w}(x_{i}, y_{j}) = ||w_{|i-j|}(x_{i} - y_{j})||\]

其中 d_w 是应用于点 i 和 j 的加权距离,w(|i-j|) 是应用于点 x_i 和 y_j 之间计算的一个正权重。

参数:
x: np.ndarray (一维或二维数组)

第一个时间序列。

y: np.ndarray (一维或二维数组)

第二个时间序列。

window: float, 默认值 = None

用于 Sakoe-Chiba 窗口半径的浮点数(如果使用 Sakoe-Chiba 下界)。值必须在 0. 和 1. 之间。

itakura_max_slope: float, 默认值 = None

用于 Itakura 平行四边形斜率的梯度(如果使用 Itakura 平行四边形下界)。值必须在 0. 和 1. 之间。

bounding_matrix: np.ndarray (大小为 mxn 的二维数组,其中 m 为 len(x),n 为 len(y)),

默认值 = None

要使用的自定义边界矩阵。如果已定义,则忽略其他 lower_bounding 参数。矩阵的结构应使得边界内的索引值为 0.,边界外的索引值为无穷大。

g: float, 默认值 = 0.

控制函数曲率(斜率)的常数;即 g 控制对相差较大的点施加惩罚的程度。

kwargs: Any

额外关键字参数。

返回值:
float

x 和 y 之间的 Wdtw 距离。

抛出:
ValueError

如果 sakoe_chiba_window_radius 不是浮点数。如果 itakura_max_slope 不是浮点数。如果提供的 x 或 y 值不是 numpy 数组。如果 x 或 y 的维度超过 2 维。如果提供的指标字符串无效。如果提供的指标对象(类实例)未继承自 NumbaDistance。如果无法确定指标类型。如果同时设置了 window 和 itakura_max_slope。

参考文献

[1]

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

时间序列分类的加权动态时间规整,Pattern Recognition, Volume 44, Issue 9, 2011, Pages 2231-2240, ISSN 0031-3203, https://doi.org/10.1016/j.patcog.2010.09.022

示例

>>> import numpy as np
>>> from sktime.distances import wdtw_distance
>>> x_1d = np.array([1, 2, 3, 4])  # 1d array
>>> y_1d = np.array([5, 6, 7, 8])  # 1d array
>>> wdtw_distance(x_1d, y_1d)
np.float64(27.975712863958133)
>>> 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
>>> wdtw_distance(x_2d, y_2d)
np.float64(243.2106560107827)