2014-11-07 3 views
0

сообщества,R - Как ускорить вычисление евклидова расстояния на очень большом наборе данных

У меня есть очень большой набор данных, содержащий 3 колонки с координатами (х, у, г) и 24 х 10^6 строк. Мне нужно вычислить эвклидовое расстояние между всеми строками и первой строкой, которая равна 0, 0, 0. С петлей ниже это занимает очень много времени! Я также пробовал это также на матрице, а не на кадре данных, но это не решило проблему.

У кого-нибудь есть предложения по ускорению этого процесса?

library(cluster) 

e <- list() # list to be filled with euclidean distances 

for (r in 1:(nrow(pca.123.df))) { 

    eucl.dist <- daisy(pca.123.df[c(1,r), ], metric = "euclidean") # Euclidean distance between anomaly and zero (row 1) 

    e[[r]] <- eucl.dist[1] 

} 

ответ

4

Используйте формулу для Euclidean distance.

Воспроизводимый пример кода:

library(cluster) 
set.seed(42) 
DF <- as.data.frame(rbind(0, matrix(rnorm(15), ncol=3))) 

e <- list() # list to be filled with euclidean distances 

for (r in 1:(nrow(DF))) { 

    eucl.dist <- daisy(DF[c(1,r), ], metric = "euclidean") # Euclidean distance between anomaly and zero (row 1) 

    e[[r]] <- eucl.dist[1] 

} 
# [[1]] 
# [1] 0 
# 
# [[2]] 
# [1] 1.895646 
# 
# [[3]] 
# [1] 2.79863 
# 
# [[4]] 
# [1] 1.438665 
# 
# [[5]] 
# [1] 2.133606 
# 
# [[6]] 
# [1] 0.4302796 

Векторизованное решение:

sqrt(colSums((t(DF)-unlist(DF[1,]))^2)) 
#[1] 0.0000000 1.8956461 2.7986300 1.4386649 2.1336055 0.4302796 

Используя знания о том, что первая строка все нули:

sqrt(rowSums(DF^2)) 
#1] 0.0000000 1.8956461 2.7986300 1.4386649 2.1336055 0.4302796 
+0

Спасибо, эффективное решении ! –

 Смежные вопросы

  • Нет связанных вопросов^_^