一个实际例子演示动态时间规整(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])
。
我看到默认都是绝对值!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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 蜜罐技术——通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析