Python 中的多维/多变量动态时间扭曲 (DTW) 库/代码

问题描述 投票:0回答:5

我正在处理时间序列数据。可用的数据是多变量的。因此,对于每个时间实例,都有三个可用的数据点。 格式:

| X |是 | Z |

这样就会实时生成一个上述格式的时间序列数据。我试图在另一个已经存储的时间序列基础数据中找到这个实时生成的时间序列的良好匹配(其大小要大得多并且以不同的频率收集)。如果我将标准 DTW 单独应用于每个系列(X、Y、Z),它们最终可能会在基础数据库中的不同点获得匹配,这是不利的。所以我需要在基础数据库中找到一个点,其中所有三个分量(X,Y,Z)都匹配良好并且在同一点。

我研究了这个问题,发现多维DTW是解决这个问题的完美方案。在 R 中,dtw 包确实包含多维 DTW,但我必须在 Python 中实现它。 R-Python 桥接包(即“rpy2”)可能会在这里提供帮助,但我没有 R 经验。我已经查看了 Python 中可用的 DTW 包,如 mlpy、dtw,但没有帮助。任何人都可以建议使用 Python 中的包来执行相同的操作或使用 rpy2 进行多维 DTW 的代码吗?

提前致谢!

python pattern-matching time-series dynamic-programming rpy2
5个回答
6
投票

看起来 tslearn 的

dtw_path()
正是您正在寻找的。引用之前链接的文档:

计算(可能是多维)时间序列之间的动态时间规整 (DTW) 相似性度量并返回路径和相似性。

[...]

不要求两个时间序列具有相同的大小,但它们必须具有相同的维度。 [...]

他们提供的实现如下:

H。 Sakoe, S. Chiba,“语音识别的动态编程算法优化”,IEEE 声学、语音和信号处理汇刊,卷。 26(1),第 43–49 页,1978 年。


5
投票

感谢@lgautier,我进行了更深入的研究,发现在 Python 中使用 rpy2 实现了多元 DTW。只需将模板和查询作为 2D 矩阵(R 中的矩阵)传递即可允许 rpy2 dtw 包执行多元 DTW。此外,如果您安装了 R,加载 R dtw 库和“?dtw”将允许访问该库的文档以及该库可用的不同功能。

供以后有类似问题的其他用户参考: R dtw 包的官方文档:https://cran.r-project.org/web/packages/dtw/dtw.pdf 示例代码,为多元 DTW 传递两个二维矩阵,open_begin 和 open_end 参数启用子序列匹配:

import numpy as np
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
from rpy2.robjects.packages import importr
import rpy2.robjects as robj

R = rpy2.robjects.r
DTW = importr('dtw')

# Generate our data
template = np.array([[1,2,3,4,5],[1,2,3,4,5]]).transpose()
rt,ct = template.shape
query = np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]]).transpose()
rq,cq = query.shape

#converting numpy matrices to R matrices
templateR=R.matrix(template,nrow=rt,ncol=ct)
queryR=R.matrix(query,nrow=rq,ncol=cq)

# Calculate the alignment vector and corresponding distance
alignment = R.dtw(templateR,queryR,keep=True, step_pattern=R.rabinerJuangStepPattern(4,"c"),open_begin=True,open_end=True)

dist = alignment.rx('distance')[0][0]

print dist

2
投票

我认为在考虑是否值得重新实现之前,在任何现有的实现中尝试一种方法是一个好主意。

您尝试过以下方法吗?

from rpy2.robjects.packages import importr
# You'll obviously need the R package "dtw" installed with your R
dtw = importr("dtw")

# all functions and objects in the R package "dtw" are now available
# with `dtw.<function or object>`

0
投票

我偶然发现了这篇文章,并认为我应该提供一些更新的信息,以防其他人试图找到一种在 Python 中进行多变量 DTW 的方法。 DTAPistance 包可以选择执行多元 DTW。


0
投票

正如 Jamie 提到的,DTAIDistance 可以做到这一点,并且对于相同的任务,与 TSLearn 相比速度非常快。

这是项目页面:链接

这是 pypi 页面:链接

在项目页面上,这里是示例代码:

from dtaidistance import dtw
import numpy as np
s1 = np.array([0.0, 0, 1, 2, 1, 0, 1, 0, 0])
s2 = np.array([0.0, 1, 2, 0, 0, 0, 0, 0, 0])
d = dtw.distance_fast(s1, s2)
© www.soinside.com 2019 - 2024. All rights reserved.