Я пытаюсь использовать функцию proxy::dist
с пользовательской матрицей расстояний, но то, что у меня сейчас, очень медленно.
Это воспроизводимый пример того, как я вызываю свою пользовательскую функцию:
set.seed(1)
test <- matrix(runif(4200), 60, 70)
train <- matrix(runif(4200), 60, 70)
dMatrix <- proxy::dist(x = test, y = train, method = customDTW,
by_rows = T,
auto_convert_data_frames = T)
, который должен вычислять расстояние между каждым временным рядом в матрице test
со всеми временными рядами в матрице train
(каждая строка является временным рядом).
Моя пользовательская функция:
customDTW <- function(ts1, ts2){
d <- dtw(ts1, ts2,
dist.method = "Euclidean",
window.type = "sakoechiba",
window.size = 20
)
return(d$distance)
}
Проблема в том, что по сравнению с тем, когда я использую method="DTW"
, или даже со случаем, когда я сам вычисляю матрицу расстояний, это чрезвычайно медленно, и как длина временного рядаили их число растет, экспоненциально становится медленнее.Конечно, это коренится во вложенном цикле, но меня удивляет масштаб эффекта.Должна быть еще одна причина, по которой я этого не вижу.
Мой вопрос о том, как еще я мог бы реализовать свой customDTW
, чтобы сделать его быстрее, используя proxy::dist
?
Это мой маленький эксперимент по времени выполнения:
Время выполнения для 60X7
(с использованием proxy::dist
+ customDTW
)
user system elapsed
2.852 0.012 2.867
Время выполнения для60X70
(с использованием proxy::dist
+ customDTW
)
user system elapsed
5.384 0.000 5.382
Время выполнения для 60X700
(с использованием proxy::dist
+ customDTW
)
user system elapsed
509.088 18.652 529.115
Время выполнения для60X700
( без с использованием proxy::dist
)
user system elapsed
26.696 0.004 26.753