首先,我是 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
在不到一秒的时间内完成所有计算。