まず第一に、私はRに不慣れです(私は昨日始めました)。
ポイントの2つのグループがdata
ありcenters
、最初のグループはサイズn
、2番目のグループはサイズK
(たとえば、n = 3823
)K = 10
であり、最初のセットのそれぞれについて、最小距離で2番目のグループ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)])
}
しかし、これは2倍遅いようです。dist
ペアごとに使ってみましたが、遅いです。
今どうしたらいいのかわからない。私は何か非常に間違ったことをしているようです。これをより効率的に行う方法について何かアイデアはありますか?
ps:k-meansを手動で実装するには、これが必要です(これを実行する必要があります。これは、割り当ての一部です)。必要なのはユークリッド距離だけだと思いますが、まだわからないので、距離の計算を簡単に置き換えることができるコードを用意したいと思います。stats::kmeans
すべての計算を1秒未満で実行します。