动态时间规整 (DTW) 单调性约束

Dynamic Time Warping (DTW) monotonicity constraint

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

比如我有成本和收入数据;一个应该影响另一个,但反之则不然。我使用的是基本的 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);

感谢您的帮助!

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

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 的文档以获得更多选项。 您可能想要添加 window 大小限制。