巨大なデータセットの最近傍を計算するために、rdist を繰り返し使用しています。現在、6 列の 634,000 ベクトルのかなり小さな行列があります。
前述のように、rdist を使用して、各ベクトルから他のすべてのベクトルまでの距離を計算しています。各距離の計算は 1 ステップです。さらに、すべてのステップで、k=1,2,3,4 の最近傍を計算し、合計を取る関数を実行します (事実上、k=すべての近傍)。
###My function to compute k nearest neighbours from distance vector
knn <- function (vec,k) {
sum((sort(vec)[1:k+1]))
}
###My function to compute nearest neighbours iteratively for every vector
myfunc <- function (tab) {
rowsums <- numeric(nrow(tab)) ###Here I will save total sums
knnsums_log <- matrix(nrow=nrow(tab),ncol=4) ###Matrix for storing each of my kNN sums
for(i in 1:nrow(tab)) { ###For loop to compute distance and total sums
q<-as.matrix(rdist(tab[i,],tab))
rowsums[i] <- rowSums(q)
for (k in c(1:4)) { ###Nested loop to run my knn function
knnsums[i,k] <- knn(q,k)
}
}
return(cbind(rowsums,knnsums_log))
}
データがどのように見えるかのサンプル (この 634k 行)
X1 X2 X3 X4 X5 X6
1 0.00 0.02 0 0 0.02 -0.263309267
2 0.00 0.02 0 0 0.02 -0.171764667
3 0.00 0.02 0 0 0.02 -0.128784869
4 0.00 0.02 0 0 0.02 -0.905651733
関数 rdist に慣れていない人のために、引数間のユークリッド距離を取得します。カスタム作成関数よりもはるかに高速に動作します。dist は行列距離内でのみ計算されるため、dist よりも適切です。私はそれが私がやっていることを技術的に知っていますが、distはそれをメモリに保存しようとしますが、それを行うことを検討するには大きすぎます。
上記の機能を改善するにはどうすればよいですか?適用関数をいじってみましたが、何も役に立ちません。すべてを明確に説明できたことを願っています。私の計算が正しければ、最悪の場合、そのコードを実行するのに 1 週間以上かかると推測されます。これを処理するための非常に強力なサーバーがあります。ただし、GPU はありません。マルチコアを試したことはありません (12 が利用可能である必要があります) が、コアごとに委任する方法がわかりません。
ご協力ありがとうございました。