0

使用动态时间扭曲时如何指定单调性约束(一个时间序列不应出现在另一个之前)?

例如,我有成本和收入数据;一个应该影响另一个,但反之则不然。我正在使用基本的dtw包,但我知道还有很多其他包可能会更好。下面是我目前的对齐方式。

(我想把对应的收入点单独存一栏,可以吗?)

library(dtw)

asy<-dtw(df$cost,
         df$revenue,
         keep=TRUE,       
         window.size = 7, # max 7 days shift
         step=asymmetric  # gives best results for this problem (other: symmetric1 & symmetric2)
         );

plot(asy, type="two", off=1);

在此处输入图像描述

感谢您的帮助!

4

1 回答 1

1

我认为您可以通过定义自己的窗口函数来强制执行此操作。例如,以这些系列为例:

library(dtw)

set.seed(310L)

idx <- seq(0, 6.28, len = 100L)
reference <- sin(idx)
query <- cos(idx) + runif(100L) / 10

foo <- dtw(query, reference, keep = TRUE, step.pattern = symmetric2, window.type = sakoeChibaWindow, window.size = 30L)
plot(foo, type = "two", off = 2)

前

红线是参考,您希望查询的值仅匹配过去或同一天的值。

win_fun <- function(i, j, ...) { i >= j }

bar <- dtw(query, reference, keep = TRUE, step.pattern = symmetric2, window.type = win_fun)
plot(bar, type = "two", off = 2)

后

如果要匹配过去的值,严格排除同一时间的值,请将条件更改为i > j

dtwWindowingFunctions查看更多选项的文档。您可能想要添加窗口大小约束。

于 2021-03-25T22:30:18.173 回答