6

私はこのpostと同じ問題がありますが、そこにコメントを追加するには十分なポイントがありません。私のデータセットは100万行、100 colsです。私もMllib KMeansを使用していますが、それは非常に遅いです。仕事は決して終わらないので、私はそれを殺さなければならない。私はGoogleクラウド(dataproc)でこれを実行しています。それは私がより少ない数のクラスター(k = 1000)を求めても実行されますが、それでも35分以上かかります。私はk〜5000のためにそれを実行する必要があります。なぜそんなに遅いのか分かりません。データは適切にパーティション化されており、従業員数/ノード数は100万〜300,000の行列で約3分かかりますが、KMeansの場合はブラックホールに入ります。私は今、より少ない回数の反復(100の代わりに2つ)を試みていますが、どこかに何かが間違っていると感じています。Spark Mllib KMeansのアルゴリズムが極端に遅いのはなぜですか?

KMeansModel Cs = KMeans.train(datamatrix, k, 100);//100 iteration, changed to 2 now. # of clusters k=1000 or 5000 
+0

#iterationを2に変更すると、全く違いはありません。 – Kai

+0

カイ、私は[同様の問題がある](http://stackoverflow.com/questions/39260820/is-sparks-kmeans-unable-to-handle-bigdata)。しかし、私の場合、仕事は単にハングする*だけではなく、それは遅いです。私の場合のように、あなたの仕事を走らせるときに進歩が見られ、それは遅くなるか、何もしませんか? – gsamaras

答えて

5

それは理由が比較的単純であるように見えます。かなり大きなkを使用し、高価な初期化アルゴリズムと組み合わせて使用​​します。

デフォルトでは、SparkはK-means++の分散バリアントとしてK-means ||を使用しています。 (What exactly is the initializationSteps parameter in Kmeans++ in Spark MLLib?参照)。分散バージョンはおおよそO(k)です。したがって、より大きなkでは、遅い開始を期待することができます。これは、反復回数を減らしたときに改善が見られない理由を説明します。

モデルを訓練すると大きなKを使うことも高価です。 SparkはLloydsの変形を使用しています。これはおおよそO(nkdi)です。

データの複雑な構造が予想される場合は、K-Meansよりもこれを処理するアルゴリズムが優れている可能性が高いですが、本当にそれに固執したい場合はランダム初期化を使用します。

+0

あなたは、この「初期化」によってほとんどの時間が消費されていると言っていますか? – Kai

+0

私はこれを高価なステップと言っています。しかし、もっと重要なのは、何千ものクラスタを持つK-meansを訓練することがうまく機能しないことです。 – zero323

+0

ちょうど5000カスター、無作為の初期化でスパークジョブを走らせ、7分で終わった!!驚くばかり!!今私は論文を読んで行くつもりの精度に影響を参照してください。ありがとう、もう一度ゼロ。クラスターの数については、問題の次元が非常に重要だと思う - >非常に高い点ではすべての点が他のすべての点から「遠い」。ポイントの数は、実行速度を上回る場合にはそれほど重要ではありません。 – Kai

1

k-meansの他の実装を試してください。 ELKIの亜種のようなものは、単一CPU上でさえ、方法スパークより優れています。クラスターに行くことなく、1つのノードからどれくらいのパフォーマンスを引き出すことができるかは、驚かされます。残念ながら、私の実験では、良いローカル実装を打ち破るために少なくとも100ノードのクラスタが必要になります。

these C++ versionsは、マルチコア(ただしシングルノード)であり、おそらく最も速いK-meansを今すぐ見つけることができますが、私はまだ自分自身を試していません(ELKIのバージョンはすべて驚くほど速く、私の最大のデータセットで数秒で仕上げる)。

+0

これを指摘していただきありがとうございます。 – Kai

関連する問題