Как настроить то, что возвращает proxy :: dist с функцией расстояния dtw - PullRequest
0 голосов
/ 05 января 2019

У меня есть список временных рядов:

ex <- list(ts1 = structure(c(15.33, 46.83, 69.93, 79.59, 85.785, 78.132, 
61.812, 189.108, 188.904, 159.936, 35.175, 62.37, 77.49, 85.785, 
87.36, 17.952, 198.696, 198.084, 159.936, 157.692), .Dim = 5:4, .Dimnames = list(
    NULL, c("var1", "var2", "var3", "var4")), .Tsp = c(1, 5, 
1), class = c("mts", "ts", "matrix")), ts2 = structure(c(34.65, 
43.47, 34.125, 62.424, 10.2, 45.084, 43.575, 34.125, 27.72, 10.812, 
48.756, 92.616), .Dim = 3:4, .Dimnames = list(NULL, c("var1", 
"var2", "var3", "var4")), .Tsp = c(1, 3, 1), class = c("mts", 
"ts", "matrix")), ts3 = structure(c(33.915, 59.325, 47.736, 8.772, 
54.18, 80.115, 4.08, 61.2), .Dim = c(2L, 4L), .Dimnames = list(
    NULL, c("var1", "var2", "var3", "var4")), .Tsp = c(1, 2, 
1), class = c("mts", "ts", "matrix")))

Я хотел бы рассчитать расстояние между двумя парами в списке. Как чтение в dtw регистр пакета dtw расстояние в качестве функции расстояния в базе данных proxy расстояния pr_DB, я могу просто использовать proxy::dist, чтобы быстро рассчитать все расстояния. Проблема в том, что proxy::dist, кажется, возвращает необработанные расстояния, в то время как мои временные ряды имеют различную длину, мне нужно, чтобы он возвращал нормализованное расстояние. Функция dtw::dtw возвращает список с normalizedDistance в качестве одного элемента. Так как я могу изменить то, что возвращается на proxy::dist, и заставить его вернуться normalizedDistance? Или, может быть, есть другой способ расчета каждой пары нормированных расстояний? (Конечно, поскольку мой набор данных большой, мне нужно избегать зацикливания всех пар).

Вот краткий код, помогающий увидеть проблему:

> proxy::dist(ex, method = 'dtw')
         ts1      ts2
ts2 822.2551         
ts3 909.3705 195.2110
> dtw::dtw(ex[[1]], ex[[2]])$distance
[1] 822.2551
> dtw::dtw(ex[[1]], ex[[2]])$normalizedDistance
[1] 102.7819

1 Ответ

0 голосов
/ 05 января 2019

Если мы ищем попарно, тогда попробуйте с combn

library(dtw)
combn(ex, 2, FUN = function(x) dtw(x[[1]], x[[2]])$normalizedDistance)
#[1] 102.78188 129.91007  39.04219

Проверка путем индивидуального применения функции dtw к парам

dtw::dtw(ex[[2]], ex[[3]])$normalizedDistance
#[1] 39.04219
dtw::dtw(ex[[1]], ex[[3]])$normalizedDistance
#[1] 129.9101
...