Как настроить то, что возвращает proxy::dist с функцией расстояния dtw

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

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 ответ

Если мы ищем попарно, то попробуйте с 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
Другие вопросы по тегам