首先,我刚开始学习R(昨天开始)。
我有两组点,data和centers,第一组大小为n,第二组大小为K(例如,n=3823,K=10),对于第一组中的每个i,我需要找到第二组中距离最小的j。
我的想法很简单:对于每个i,让dist[j]成为i和j之间的距离,我只需要使用which.min(dist)来找到我要找的内容。
每个点都是由64个double数组成的。
我有两组点,data和centers,第一组大小为n,第二组大小为K(例如,n=3823,K=10),对于第一组中的每个i,我需要找到第二组中距离最小的j。
我的想法很简单:对于每个i,让dist[j]成为i和j之间的距离,我只需要使用which.min(dist)来找到我要找的内容。
每个点都是由64个double数组成的。
> dim(data)
[1] 3823 64
> dim(centers)
[1] 10 64
我已经尝试过了
for (i in 1:n) {
for (j in 1:K) {
d[j] <- sqrt(sum((centers[j,] - data[i,])^2))
}
S[i] <- which.min(d)
}
这段代码非常缓慢(当n = 200
时,需要超过40秒!!)。我写的最快解决方案是:
distance <- function(point, group) {
return(dist(t(array(c(point, t(group)), dim=c(ncol(group), 1+nrow(group)))))[1:nrow(group)])
}
for (i in 1:n) {
d <- distance(data[i,], centers)
which.min(d)
}
即使它进行了很多我不使用的计算(因为dist(m)
计算了m
的所有行之间的距离),它比另一个更快(有人能解释为什么吗?),但对于我需要的速度来说还不够快,因为它不仅仅会被使用一次。此外,distance
代码非常丑陋。我试图用以下内容替换它:
distance <- function(point, group) {
return (dist(rbind(point,group))[1:nrow(group)])
}
但这似乎慢了两倍。我还尝试使用dist
来计算每对数据,但它也很慢。
我不知道该怎么办了。看起来我做错了什么。你有没有更高效的方法?
附:我需要手动实现k-means(这是我的任务的一部分)。我相信只需要欧几里得距离,但我还不确定,所以我希望有一些代码,可以轻松地替换距离计算。 stats::kmeans
可以在不到一秒钟内完成所有计算。