対異なるセンタリングされて、なぜ私は2つのモデルが以下のように同じデータに関数kmeansモデルを使用して訓練があります。StreamingKMeansクラスタは、通常の関数kmeans
int numIterations = 20;
int numClusters = 5;
int runs = 10;
double epsilon = 1.0e-6;
KMeans kmeans = new KMeans();
kmeans.setEpsilon(epsilon);
kmeans.setRuns(runs);
kmeans.setMaxIterations(numIterations);
kmeans.setK(numClusters);
KMeansModel model = kmeans.run(trainDataVectorRDD.rdd());
、以下のようなStreamingKmeans:
int numOfDimensions = 3;
int numClusters = 5;
StreamingKMeans kmeans = new StreamingKMeans()
.setK(numClusters)
.setDecayFactor(1.0)
.setRandomCenters(numOfDimensions, 1.0, 0);
kmeans.trainOn(trainDataVectorRDD);
アイデアをストリーミングの1つは、私はkafkaキューからすべてを読んでモデルを訓練し、新しいデータが入ってくると自動的に更新されるということです。
私は2つの異なるcl両方のモデルのusterセンター。どこで私は間違えましたか? 通常のKMeansが正しいものです。私は5つのクラスターセンターのうち2つをここに掲載しています。どんな助けもありがとう、ありがとう=)。
クラスタ:関数kmeans
clusterCenter:[1.41012161E9,20.9157142857143,68.01750871080174]
clusterCenter:[2.20259211E8,0.6811821903787257,36.58268423745944]
クラスタ:StreamingKmeans
clusterCenter: - 0.07896129994296074,1.0194960760532714、-0.4783789312386866
clusterCenter: [1.3712228467872134、-0.16614353149605163,0.24283231360124224]
これは当てはまりますが、ここでの問題はストリーミングクラスタの重心が理にかなっていない、つまりデータセットにないことです。 ここに何かをすることができます。後で普通のkmeansをシングルパスで実行し、それらが一致するかどうかを確認します。お返事ありがとうございます:) –
SparkのStreamingKMeansは私が思ったより悪いです。 'setRandomCenters'はN(0; 1)から**ランダムガウス分布**を描画し、これがあなたのデータのための良いアイディアだと仮定します。今ではこれらのセンターのいくつかはおそらく単一のポイントを受け取ったことはありません! –
通常のk-meansを1回反復と1回実行に設定すると、データの範囲内にある賢明な回答が得られます。この問題を回避する方法の1つは、通常のk-meansを実行し、ストリーミングk-meansのsetIntialCenters入力としてクラスタセンターを使用すると正しいことです。 –