6

R を使用してコードの一部を並列化する方法を理解しようとしています。したがって、次の例では、k-means を使用して、2,3,4,5,6 の中心を使用してデータをクラスター化し、20 回の反復を使用します。コードは次のとおりです。

library(parallel)
library(BLR)

data(wheat)

parallel.function <- function(i) {
    kmeans( X[1:100,100], centers=?? , nstart=i )
}

out <- mclapply( c(5, 5, 5, 5), FUN=parallel.function )

反復と中心を同時に並列化するにはどうすればよいでしょうか? k-means からのすべての出力をすべてのイテレーションとセンターにわたって保持したいと仮定して、出力を追跡する方法は?

4

3 に答える 3

6

これは最初は非常に簡単に見えました...そして試してみました。しかし、昼休みにモンキータイピングとフェイスパーミングをたくさんした後、私はこれにたどり着きました:

library(parallel)
library(BLR)

data(wheat)

mc = mclapply(2:6, function(x,centers)kmeans(x, centers), x=X)

クラスタリングがどれほど賢明であるかは確認していませんが、正しいように見えます。

> summary(mc)
     Length Class  Mode
[1,] 9      kmeans list
[2,] 9      kmeans list
[3,] 9      kmeans list
[4,] 9      kmeans list
[5,] 9      kmeans list

振り返ってみると、コマンド構文は理にかなっているように見えますが、失敗した他の多くのものも合理的に見えました...ヘルプドキュメントの例は、おそらくそれほど素晴らしいものではありません.

それが役に立てば幸い。

EDIT ここで要求されているのは、2つの変数nstartcenters

(pars = expand.grid(i=1:3, cent=2:4))

  i cent
1 1    2
2 2    2
3 3    2
4 1    3
5 2    3
6 3    3
7 1    4
8 2    4
9 3    4

L=list()
# zikes horrible
pars2=apply(pars,1,append, L)
mc = mclapply(pars2, function(x,pars)kmeans(x, centers=pars$cent,nstart=pars$i ), x=X)

> summary(mc)
      Length Class  Mode
 [1,] 9      kmeans list
 [2,] 9      kmeans list
 [3,] 9      kmeans list
 [4,] 9      kmeans list
 [5,] 9      kmeans list
 [6,] 9      kmeans list
 [7,] 9      kmeans list
 [8,] 9      kmeans list
 [9,] 9      means list

りんごはいかがですか?

于 2013-12-06T13:59:39.143 に答える
5

Elkan のプルーニング アルゴリズムのメモリ効率の高いバリアントを使用してパフォーマンスを向上させる研究論文から派生したknorと呼ばれる CRAN パッケージがあります。これらの回答のすべてよりも桁違いに高速です。

install.packages("knor")
require(knor)
iris.mat <- as.matrix(iris[,1:4])
k <- length(unique(iris[, dim(iris)[2]])) # Number of unique classes
nthread <- 4
kms <- Kmeans(iris.mat, k, nthread=nthread)
于 2018-05-02T21:27:04.650 に答える
1

並列を使用して、複数のコアで異なるランダムな開始点から K-Means を試すことができます。

以下のコードは一例です。(K=K 平均の K、N= ランダムな開始点の数、C = 使用するコアの数)

suppressMessages( library("Matrix") )
suppressMessages( library("irlba") )
suppressMessages( library("stats") )
suppressMessages( library("cluster") )
suppressMessages( library("fpc") )
suppressMessages( library("parallel") )

#Calculate KMeans results
calcKMeans <- function(matrix, K, N, C){
  #Parallel running from various of random starting points (Using C cores)
  results <- mclapply(rep(N %/% C, C), FUN=function(nstart) kmeans(matrix, K, iter.max=15, nstart=nstart), mc.cores=C);
  #Find the solution with smallest total within sum of square error
  tmp <- sapply(results, function(r){r[['tot.withinss']]})
  km <- results[[which.min(tmp)]]  
  #return cluster, centers, totss, withinss, tot.withinss, betweenss, size
  return(km)
}

runKMeans <- function(fin_uf, K, N, C, 
                      #fout_center, fout_label, fout_size, 
                      fin_record=NULL, fout_prediction=NULL){
  uf = read.table(fin_uf)
  km = calcKMeans(uf, K, N, C)
  rm(uf)
  #write.table(km$cluster, file=fout_label, row.names=FALSE, col.names=FALSE)
  #write.table(km$center, file=fout_center, row.names=FALSE, col.names=FALSE)
  #write.table(km$size, file=fout_size, row.names=FALSE, col.names=FALSE)
  str(km)

  return(km$center)
}

それが役に立てば幸い!

于 2014-05-22T21:41:42.370 に答える