一个实际例子演示动态时间规整(Dynamic Time Warping, DTW )算法

用一个实际例子,演示动态时间规整(Dynamic Time Warping, DTW   )算法
 

动态时间规整 (Dynamic Time Warping, DTW) 是一种用于度量两个时间序列之间的差异的算法,尤其是当这两个序列出现时间偏移或速度不同的情况。例如,DTW 可用于语音识别或股价数据分析。

以下是一个简单的 DTW 算法实现例子,我们将使用 Python 和 numpy 来计算两个时间序列之间的 DTW 距离:

1. 定义 DTW 函数

python
2. 定义两个时间序列并计算它们的 DTW 距离
python
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
 
def dtw(seq1, seq2):
    m, n = len(seq1), len(seq2)
    # 创建一个 m x n 的矩阵,初始化为无穷大
    dtw_matrix = np.zeros((m+1, n+1))
    dtw_matrix[0, 1:] = float('inf')
    dtw_matrix[1:, 0] = float('inf')
 
    for i in range(1, m+1):
        for j in range(1, n+1):
            cost = (seq1[i-1] - seq2[j-1])**2
            # 选择之前三个操作中的最小值
            dtw_matrix[i, j] = cost + min(dtw_matrix[i-1, j], dtw_matrix[i, j-1], dtw_matrix[i-1, j-1])
 
    return dtw_matrix[m, n]
 
seq1 = np.array([1, 1, 2, 3, 2, 0])
seq2 = np.array([0, 1, 1, 2, 3, 2, 1])
distance = dtw(seq1, seq2)
print("DTW distance between seq1 and seq2:", distance)
# 答案是2
 
seq1 = np.array([1, 3, 2, 2, 4, 4])
seq2 = np.array([1, 1, 3, 3, 2, 4])
distance = dtw(seq1, seq2)
print("DTW distance between seq1 and seq2:", distance)
# 答案是0 见图

  

在上述例子中,我们定义了两个简单的时间序列并使用 DTW 函数来计算它们之间的距离。返回的距离给出了两个时间序列之间的差异度量。

需要注意的是,这只是一个基本的 DTW 实现,专门为了说明算法而设计。在实际应用中,可能会使用更高级的版本和优化技术,例如使用约束条件来减少计算复杂性,或者使用快速近似方法来加速计算。

 

本质上就是一个最短路的动态规划算法,无非是路径可以斜着走而已!

 

 

 

这里是不是有错啊?cost = (seq1[i-1] - seq2[j-1])**2 是不是应该是取绝对值?  

对于 DTW,计算两个点之间的“距离”或“代价”可以有多种方式。常用的方式确实是取两点的绝对差,但平方差也是合理的选择。选择哪种方式取决于应用的具体需求。

使用绝对差值:

python
cost = abs(seq1[i-1] - seq2[j-1])

使用平方差:

python
cost = (seq1[i-1] - seq2[j-1])**2

这两种方式都可以用在 DTW 算法中,但它们可能会导致稍微不同的结果。绝对差值可能在某些应用中更有意义,尤其是当我们关心的是实际的差异大小而不是差异的平方时。

因此,如果你的应用更适合使用绝对差值,那么可以替换为 cost = abs(seq1[i-1] - seq2[j-1])

 

我看到默认都是绝对值!

posted @   bonelee  阅读(431)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2021-08-26 HTTP 请求夹带漏洞——预防方法:使用HTTP / 2进行后端连接,为前端和后端服务器使用完全相同的Web服务器软件,后端服务器拒绝模糊请求并关闭网络连接来避免漏洞
2021-08-26 分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原
2019-08-26 python assert 在正式产品里禁用的手法 直接-O即可
2017-08-26 kafka 0.11 spark 2.11 streaming例子
2017-08-26 蜜罐技术——通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析
点击右上角即可分享
微信分享提示