【发布时间】:2010-06-12 18:12:46
【问题描述】:
首先,我是 R 新手(我是昨天开始的)。
我有两组点,data 和 centers,第一个大小为 n,第二个大小为 K(例如,n = 3823 和 K = 10),并且对于每个第一组i,我需要找到第二组j,距离最小。
我的想法很简单:对于每个i,让dist[j] 为i 和j 之间的距离,我只需要使用which.min(dist) 来查找我要查找的内容。
每个点都是64双精度数组,所以
> 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,但速度也较慢。
我现在不知道该怎么办。好像我做错了什么。关于如何更有效地做到这一点的任何想法?
ps:我需要这个来手动实现 k-means(我需要这样做,这是作业的一部分)。我相信我只需要欧几里得距离,但我还不确定,所以我更喜欢有一些可以轻松替换距离计算的代码。 stats::kmeans 在不到一秒的时间内完成所有计算。
【问题讨论】:
-
这里的人都在做一些不喜欢做的任务...所以试着专注于一个特定的问题。
标签: r performance distance