我正在处理时间序列数据。可用数据是多变量的。因此,对于每个时间实例,都有三个可用的数据点。
格式:
因此,可以实时生成上述格式的一个时间序列数据。我试图在另一个已存储的时间序列基础数据中找到此实时生成的时间序列的良好匹配项(它的大小要大得多,并且是以不同的频率收集的)。如果我对每个系列(X,Y,Z)分别应用标准DTW,则它们最终可能会在基础数据库中的不同点得到匹配,这是不利的。因此,我需要在基础数据库中找到一个点,所有三个组件(X,Y,Z)在同一点都匹配良好。
我对此事进行了研究,发现多维DTW是解决此问题的完美解决方案。在R中,dtw软件包确实包含多维DTW,但我必须在Python中实现它。 R-Python桥接程序包“rpy2”在这里可能会有所帮助,但我没有R的经验。我浏览了Python中可用的DTW程序包,例如mlpy,dtw,但没有帮助。谁能建议使用rpy2在Python中使用软件包进行相同的操作或对多维DTW进行编码。
提前致谢!
最佳答案
感谢@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传递两个2-D矩阵,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