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 后端。 如果 be 是 None,则后端由输入数组决定。 更多信息请参阅我们的 专用用户指南页面。
- 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]])