机器学习笔记 soft-DTW(论文笔记 A differentiable loss function for time-series)

本文介绍了soft-DTW算法,它是DTW算法的一种可微版本,适用于神经网络中的时间序列对比。文章详细解释了soft-DTW的基本原理,包括其如何通过使用soft-min函数替代传统的min函数来实现可微性,并给出了前向传播和反向传播的具体公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 soft-DTW来由

        DTW 算法通过动态规划求解了两个序列的相似度。这个过程1是离散的,不可微的。如果要将其应用作为神经网络的损失函数,这是不行的。因为神经网络通过对损失函数结果进行梯度下降的方法,更新参数,要求损失函数可微

2 符号说明 

论文“A differentiable loss function for time-series”(2017 ICML)中使用了 Soft minimum 来代替 DTW minimum

        对于两个序列,我们定义代价矩阵,其中δ是 可微代价函数(某一时刻x上的p维信息+某一时刻y上的p维信息——>一个实数值)【通常δ(·,·)可以用欧几里得距离】 

3 soft-DTW原理

        定义集合,为路径上的代价和r_{i,j}组成的集合(从(0,0)到(i,j)的最小开销路径的cost)

         如果是DTW,那么它的动态规划式子为

         如1所说,由于min是一个离散的过程,不可微,所以这导致了DTW的离散。

        于是Soft-DTW使用了连续的soft-min

         当γ=0的时候,就是DTW,否则他就是一个可微的式子

(在max函数的平滑(log-sum-exp trick)_UQI-LIUWJ的博客-CSDN博客 中,我们知道

log(\sum_{i \in [1,n]}e^{x_i})=log(\sum_{i \in [1,n],i \ne j}e^{x_i}+e^{x_j}) \approx log(e^{x_j})=x_j=max \{x_1,\dots,x_n \}

那么这里也是类似的  

min(a_1,a_2,\dots,a_n)=-max(-a_1,-a_2,\dots,-a_n)

                                  =-log (\sum_{i \in [1,n]} e^{-a_i})

                                  =-log [\sum_{i \in [1,n]} (e^\frac{​{-a_i}}{\gamma})^\gamma]

这里这篇论文做了一个近似

                                 \approx -log [\sum_{i \in [1,n]} (e^\frac{​{-a_i}}{\gamma})]^\gamma

  也就等于   了                     

 3.1 前向传播

        定义,这是一个集合,其中的每一个元素A是一个矩阵,该矩阵表示两个时间序列x和y之间的对齐矩阵(alignment matrix)

         对于一个特定的对齐矩阵,A中只有在(1,1)到(n,m)路径上的点(i,j),其a_{i,j}=1,其他点的a_{i,j}都是0。

          以DTW中出现过的图为例,那种情况下的A矩阵,在红色箭头上的(i,j),其a_{i,j}=1,其余点的a_{i,j}均为0DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现)_UQI-LIUWJ的博客-CSDN博客

         换句话说,A_{n,m}中包含了所有(1,1)到(n,m)的路径(每个路径是一个矩阵,每个矩阵只有路径上的元素为1)

        于是矩阵内积<A,Δ(x,y)>表示这条路径下的代价和(非这条路径上的点乘0,这条路径上的点乘1,再求和)

        于是,soft-dtw的目标函数为

 3.1.1 算法伪代码

如果γ=0的时候,也就退化为了DTW,这里不同的是,我们需要关注γ>0的情况

 

3.2 反向传播

        soft-DTW的目的是为了计算时间序列x和时间序列y之间的动态扭曲距离,y是目标序列的话,我们反向传播计算的是对时间序列x的梯度,也即

         

        通过链式法则,我们有

        这里的分子和分母都是矩阵,所以线性代数笔记:标量、向量、矩阵求导_UQI-LIUWJ的博客-CSDN博客

        

 

也就是在我们的问题中,\frac{\partial \Lambda_i}{\partial x_j}都是一个p×m维矩阵,那么整体上是一个np×nm的矩阵(记🔺相对于x的雅可比矩阵)

 

 对于第二项

由于

同样地根据链式法则有:

 定义元素

我们令 

 所以有:

\Delta为欧几里得距离的时候,对于任意n×m维度的矩阵,有:

 3.2.1 反向传播的优化

         对于这个式子,我们进行反向传播的时候,如果使用自动求导机制,那每一个e_{i,j}的计算,都需要重新从e_{1,1}开始计算,计算到e_{i,j}为止,所以每一个e_{i,j}都需要O(mn)的时间复杂度,而每次反向传播都需要计算一次E矩阵,所以每次反向传播计算E就需要O(m^2n^2)的时间复杂度

         于是论文中给出了一种动态规划的方法计算E,将时间复杂度降低至O(mn)

         我们知道,而r_{i,j}只会在(i,j+1),(i+1,j+1),(i+1,j)这三项中出现,所以也只有这三项会影响到e_{i,j}

 那么根据链式法则,有:

 

 而根据soft-dtw的定义:

我们有:

 (3.7)对两边求r_{i,j}的偏导,有:

 

 对(3-8)式两边取对数,再乘以γ,于是有:

  

同理我们有

 

 所以我们可以从开始,逐个计算到e_{1,1},总的时间复杂度式O(mn)

 伪代码如下

 

 

### 基于Soft DTW距离度量的K-medoids聚类算法 以下是基于Python编写的实现代码,其中利用了`tslearn`库中的`soft_dtw`函数来计算时间序列之间的相似性,并通过自定义的距离矩阵完成K-medoids聚类。 #### 安装依赖 首先需要安装必要的库: ```bash pip install tslearn scikit-learn numpy scipy ``` #### 实现代码 以下是一个完整的实现: ```python import numpy as np from sklearn_extra.cluster import KMedoids from tslearn.metrics import soft_dtw from sklearn.metrics import silhouette_score def compute_distance_matrix(data, metric=soft_dtw): """ 计算数据集的时间序列距离矩阵。 参数: data (list or array): 时间序列数据集合。 metric (function): 距离度量方法,默认为soft_dtw。 返回: distance_matrix (array): 数据集中每对时间序列间的距离矩阵。 """ n = len(data) distance_matrix = np.zeros((n, n)) for i in range(n): for j in range(i, n): dist = metric(data[i], data[j]) distance_matrix[i][j] = dist distance_matrix[j][i] = dist # 对称矩阵 return distance_matrix def kmedoids_softdtw_clustering(data, num_clusters): """ 使用软动态时间规整(Soft-DTW)作为距离度量执行K-Medoids聚类。 参数: data (list or array): 输入的时间序列数据。 num_clusters (int): 预期的簇数量。 返回: labels (array): 每个样本所属的簇标签。 medoids (array): 各簇的中心点索引。 score (float): 轮廓系数得分。 """ # 计算距离矩阵 distance_matrix = compute_distance_matrix(data) # 执行K-Medoids聚类 model = KMedoids(n_clusters=num_clusters, metric="precomputed", method='pam', init='k-medoids++') labels = model.fit_predict(distance_matrix) # 获取轮廓系数评分 score = silhouette_score(distance_matrix, labels, metric="precomputed") return labels, model.medoid_indices_, score # 示例数据 if __name__ == "__main__": from tslearn.datasets import CachedDatasets # 加载示例时间序列数据 X_train, y_train, _, _ = CachedDatasets().load_dataset("Trace")[:2] time_series_data = X_train[y_train == 1][:30] # 取部分数据用于测试 # 设置参数并运行聚类 num_clusters = 4 labels, medoids, score = kmedoids_softdtw_clustering(time_series_data, num_clusters) print(f"Cluster Labels: {labels}") print(f"Medoid Indices: {medoids}") print(f"Silhouette Score: {score:.6f}") # 输出轮廓系数分数[^1] ``` #### 关键说明 上述代码实现了以下几个功能模块: 1. **距离矩阵计算**:通过嵌套循环调用`soft_dtw`函数构建两两时间序列间距离矩阵。 2. **K-medoids模型训练**:使用预处理好的距离矩阵输入到`sklearn-extra`库中的`KMedoids`模型中进行拟合。 3. **评估指标**:最终返回各簇分配情况以及整体轮廓系数评价结果。 此方案能够有效应对复杂形状变化较大的时间序列数据分类需求。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值