Как эффективно создать матрицу расстояний с пользовательской метрикой в r?
У меня есть некоторые разреженные данные, и я хотел бы рассчитать пропущенные значения, используя метод вменения kNN. Я планировал сделать матрицу расстояний из моих данных и найти k ближайших соседей к каждой из моих строк. После этого я намеревался заполнить пропущенные значения в каждой строке медианой или средним значением k ближайших рядов.
С этой целью я решил, что было бы хорошо построить матрицу расстояний с пользовательской метрикой, которая нормализует евклидово расстояние на основе количества пропущенных значений. Проблема в том, что мой вложенный цикл занимает слишком много времени:
a <- rep(0, nrow(df))
for(i in 1:nrow(df)) {
for (j in 1:nrow(df)){
l <- ! is.na(df[i,]) & ! is.na(df[j,]) #locate NA's
#adding custom distance to distance matrix
a[i,j] <- (ncol(df)/sum(l) * sum((df[i,][l] - df[j,][l])^2))^1/2 #custom function
}
}