tslearn.metrics.soft_dtw_alignment

tslearn.metrics.soft_dtw_alignment(ts1, ts2, gamma=1.0, be=None, compute_with_backend=False)[source]

计算两个时间序列之间的Soft-DTW度量,并返回相似度度量和对齐矩阵。

Soft-DTW最初在[1]中提出,并在我们的关于DTW及其变体的用户指南页面中进行了更详细的讨论。

Soft-DTW 的计算方式如下:

\[\text{soft-DTW}_{\gamma}(X, Y) = \min_{\pi}{}^\gamma \sum_{(i, j) \in \pi} \|X_i, Y_j\|^2\]

其中 \(\min^\gamma\) 是参数 \(\gamma\) 的软最小操作符。

在极限情况下 \(\gamma = 0\)\(\min^\gamma\) 简化为一个硬最小操作符,而软DTW被定义为DTW相似度度量的平方。

Parameters:
ts1array-like, shape=(sz1, d) or (sz1,)

一个时间序列。 如果形状是(sz1,),则假定时间序列是单变量的。

ts2array-like, shape=(sz2, d) or (sz2,)

另一个时间序列。 如果形状是 (sz2,),则假定时间序列是单变量的。

gammafloat (default 1.)

Soft-DTW的Gamma参数。

beBackend object or string or None

后端。如果 be 是类 NumPyBackend 的实例或字符串 “numpy”,则使用 NumPy 后端。 如果 be 是类 PyTorchBackend 的实例或字符串 “pytorch”,则使用 PyTorch 后端。 如果 beNone,则后端由输入数组决定。 更多信息请参阅我们的 专用用户指南页面

compute_with_backendbool, default=False

当使用NumPy后端时,此参数没有影响。 当使用不同于NumPy的后端时(参见参数be): 如果True,则使用相应的后端进行计算。 如果False,可以使用转换为NumPy后端来加速计算。

Returns:
array-like, shape=(sz1, sz2)

软对齐矩阵

float

相似度

另请参阅

soft_dtw

仅返回软DTW分数

参考文献

[1]

M. Cuturi, M. Blondel “Soft-DTW: 一种用于时间序列的可微损失函数,” ICML 2017.

示例

>>> a, dist = soft_dtw_alignment([1, 2, 2, 3],
...                              [1., 2., 3., 4.],
...                              gamma=1.)  
>>> dist
-0.89...
>>> a  
array([[1.00...e+00, 1.88...e-01, 2.83...e-04, 4.19...e-11],
       [3.40...e-01, 8.17...e-01, 8.87...e-02, 3.94...e-05],
       [5.05...e-02, 7.09...e-01, 5.30...e-01, 6.98...e-03],
       [1.37...e-04, 1.31...e-01, 7.30...e-01, 1.00...e+00]])

PyTorch 后端可用于计算梯度:

>>> import torch
>>> ts1 = torch.tensor([[1.0], [2.0], [3.0]], requires_grad=True)
>>> ts2 = torch.tensor([[3.0], [4.0], [-3.0]])
>>> path, sim = soft_dtw_alignment(ts1, ts2, gamma=1.0, be="pytorch", compute_with_backend=True)
>>> print(sim)
tensor(41.1876, dtype=torch.float64, grad_fn=<AsStridedBackward0>)
>>> sim.backward()
>>> print(ts1.grad)
tensor([[-4.0001],
        [-2.2852],
        [10.1643]])
>>> ts1_2d = torch.tensor([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0]], requires_grad=True)
>>> ts2_2d = torch.tensor([[3.0, 3.0], [4.0, 4.0], [-3.0, -3.0]])
>>> path, sim = soft_dtw_alignment(ts1_2d, ts2_2d, gamma=1.0, be="pytorch", compute_with_backend=True)
>>> print(sim)
tensor(83.2951, dtype=torch.float64, grad_fn=<AsStridedBackward0>)
>>> sim.backward()
>>> print(ts1_2d.grad)
tensor([[-4.0000, -4.0000],
        [-2.0261, -2.0261],
        [10.0206, 10.0206]])

使用tslearn.metrics.soft_dtw_alignment的示例

软动态时间规整

Soft Dynamic Time Warping