动态时间规整 (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 大小限制。
如何在使用动态时间扭曲时指定单调性约束(一个时间序列不应出现在另一个时间序列之前)?
比如我有成本和收入数据;一个应该影响另一个,但反之则不然。我使用的是基本的 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 大小限制。