web-dev-qa-db-ja.com

kmeans:Quick-TRANSferステージのステップが最大値を超えました

標準のstatsパッケージ:kmeans(dataset, centers = 100, nstart = 25, iter.max = 20)を使用して、636,688行と7列のデータセットでRのk-meansクラスタリングを実行しています。

次のエラーが表示されます:Quick-TRANSfer stage steps exceeded maximum (= 31834400)、および http://svn.r-project.org/R/trunk/src/library/stats/R/でコードを表示できますがkmeans.R -何がおかしいのかわかりません。私の問題はデータセットのサイズに関係していると思いますが、誰かが問題を軽減するためにできることを一度だけ明確にできれば幸いです。

31
Anna Dunietz

私は同じ問題を抱えていました。

?kmeansを介してRのkmeansのドキュメントを参照してください。

Hartigan-Wongアルゴリズムは通常、これらのいずれよりも優れた仕事をしますが、いくつかのランダムスタート(「nstart」> 1)を試みることをお勧めします。 まれに、いくつかのポイント(「x」の行)が非常に近い場合、アルゴリズムは「Quick-Transfer」段階で収束しない場合があります、警告を通知(および「ifault = 4 ')。その場合、データをわずかに丸めることをお勧めします。

これらの場合、LloydまたはMacQueenアルゴリズムに切り替える必要があります。

ここでのRの厄介な点は、気づかないうちに警告が続くことです。ベンチマークの目的のために、これは失敗した実行であると考えているため、以下を使用します。

if (kms$ifault==4) { stop("Failed in Quick-Transfer"); }

ユースケースによっては、次のようなことをしたい場合があります

if (kms$ifault==4) { kms = kmeans(X, kms$centers, algorithm="MacQueen"); }

代わりに、別のアルゴリズムを続行します。

K-meansのベンチマークを行う場合、Rはデフォルトでiter.max=10を使用することに注意してください。収束するには10回以上の反復が必要になる場合があります。

21
Erich Schubert

同じ問題を抱えていたが、利用可能なメモリに何か関係があるようだ。

関数が機能する前にガベージコレクションを実行する:

gc()

または参照:

Rプロセスで使用可能なメモリを増やす(または減らす)

10
BarnSoHard

@jlhowardのコメント:

試して

kmeans(dataset, algorithm="Lloyd", ..)
2
dfrankow