R: Перебор возможных комбинаций нескольких векторов временных рядов для вычисления DTW

#r #time-series #dtw

#r #временные ряды #dtw

Вопрос:

Я новичок в R и временных рядах. Допустим, у меня есть 5 векторов временных рядов (разной длины), которые я хочу найти сходство между ними, используя динамическое искажение времени. Как вы знаете, DTW сравнивает только 2 временных ряда. Мне нужно просмотреть каждую пару из 5 посещений (10 пар), чтобы вычислить расстояния, а затем сравнить их.

Используя пакет DTW, этот код работает только для двух временных рядов.

 v1<-c(358.214, 359.240, 360.039, 361.163, 361.164, 362.113, 362.114)
v2<-c(392.664, 414.588, 414.589, 421.463, 421.464, 427.863)
v3<-c(470.776, 470.777, 471.951, 471.952, 477.651, 477.652, 479.601, 479.602, 480.426, 480.427)
v4<-c(639.000, 650.574, 650.575, 658.199, 658.200, 658.696)
v5<-c(678.846, 678.847, 688.121, 688.122, 690.371, 690.372, 701.946, 701.947, 704.921)

dtw1 <-dtw(v1, v2, dist.method="Euclidean", keep.internals = T, step.pattern= asymmetric)
plot(dtw1)
 

Я не знаю, как пройти через каждую пару. Я не думаю, что цикл for здесь является лучшим вариантом. После вычисления расстояний я должен сохранить их в матрице, чтобы сравнить их?
Каков наилучший способ вычисления всех возможных пар для этих векторов?

Ответ №1:

Поместите все векторы в список и используйте combn для создания всех возможных их комбинаций и сохранения результата в списке.

 library(dtw)

list_vec <- list(v1, v2, v3, v4, v5)

result <- combn(list_vec, 2, function(x) {
   dtw(x[[1]], x[[2]], dist.method="Euclidean", 
       keep.internals = TRUE, step.pattern= asymmetric)
}, simplify = FALSE)
 

Комментарии:

1. Спасибо за ваш ответ. Вы имеете в виду сохранить результат здесь в коде в (list_results <- список (результат) ? Как я могу получить расстояния от каждой комбинации?

2. Данные уже есть в списке result . Как вы получаете расстояние от dtw1 своего вопроса? Вы можете использовать lapply , чтобы сделать то же самое из result .

3. Я использую (dtw1 $ расстояние). Но здесь почему-то результат пустой. Расстояние равно НУЛЮ. Я вижу только 6 комбинаций (например, показывающих длины векторов (размер выравнивания (запрос x ссылка): 138 x 154)) при печати результата. У вас есть какое-либо представление об этой проблеме?

4. sapply(result, `[[`, 'distance') Или sapply(result, function(x) x$distance) дает мне 10 значений 310.523 797.915 1999.422 2297.850 358.555 1391.838 1650.420 1679.654 2097.620 227.807

5. Вы можете создавать эти пары с tmp <- combn(paste0('v', 1:5), 2, paste0, collapse = '-') помощью . Так что, возможно, добавьте их в фрейм данных. data <- data.frame(pair = tmp, distance = sapply(result, `[[`, 'distance'))