首先,我是R(我昨天開始)的新手。在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
在不到一秒內完成所有計算。
人民輪在這裏種-A-鴕鳥政策樣做任務......因此要儘量集中在一個特定的問題。 – aL3xa 2010-06-12 19:38:45