Я реализую алгоритм kmeans в R, однако у меня ужасные проблемы с производительностью.Я пришел из Python, Java и C ++, поэтому я не очень-то привык к кодированию на языке R, и поэтому я хотел знать, могу ли я получить совет по базовым операциям для выполнения.
Во-первых, моя функция - получитьрасстояние между двумя точками:
distance <- function(pt1, pt2){
pt1 <- pt1[0:NUMBER_OF_FEATURES]
pt2 <- pt2[0:NUMBER_OF_FEATURES]
pt2 <- t(pt2)
sum <- 0
counter <- 1
for (i in 1:nrow(pt2)){
sum <- sum + ((pt1[counter] - pt2[counter])^2)
counter <- counter + 1
}
value <- sqrt(sum)
return(value)
}
Не похоже, что я могу намного лучше понять то, что понимаю, но я знаю, что на самом деле не следует использовать циклы for в R.
Также у меня есть другая функция, которая фокусируется на обновлении центроидов каждого кластера, и я закодировал это так:
update_centroids <- function(ptlst, centroids){
centroids <- matrix(, nrow = NUMBER_OF_CLUSTERS, ncol = NUMBER_OF_FEATURES)
for (i in 1:NUMBER_OF_CLUSTERS){
temp <- ptlst[which(ptlst$cluster == i),]
temp <- temp[0:NUMBER_OF_FEATURES]
print(ncol(temp))
centroid <- c()
for (j in 1:ncol(temp)){
centroid <- c(centroid, mean(as.numeric(unlist(temp[j]))))
}
print(centroid)
centroids[i,] <- centroid
}
print(centroids)
}
Опять же, насколько я понимаю, я не должен кодировать эту часть, как это, ноиспользуйте общую запись, которая сделает это намного быстрее.
В целом мой полный алгоритм выполняется на наборе данных iris за 2,24 секунды, в то время как моя собственная реализация на python выполняется за 0,03 секунды
Так что я ясноделать что-то не так здесь, и есть что-то, и это занимает огромное количество времени, но я не могу достать это
Заранее спасибо за ваши ответы, Shraneid
РЕДАКТИРОВАТЬ: файл сгенерированный dput