1

我有两个模型中使用相同的数据KMEANS模型像下面的培训:为什么StreamingKMeans聚类中心不同VS常规K均值

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); 

的想法与流的一个是,我读了一切从卡夫卡队列和训练模型,它会自动更新,因为新的数据进来。

我得到两个不同的cl这两种模式的中心。我哪里做错了? 常规KMeans是正确的。我只在这里发布了5个聚类中心中的2个。任何帮助表示赞赏,谢谢=)。

集群:K均值

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]

回答

1

k-means是随机化。如果你运行两次,你可能会得到两个不同的结果。具体而言,它们可能不对齐(即,在另一结果中,群集1可能与群集1不匹配)。

此外,流式k均值可能仅允许单次通过数据,所以预期结果在1次迭代后与k均值有些相似。

更新:Sparks StreamingKMeans setRandomCenters从N(0; 1)分布中选择初始中心。根据你的数据,这可能是一个坏主意,一些聚类中心(例如负坐标的聚类中心)将永远保持空白。在我看来,这是一个非常愚蠢的初始化方法,对于大多数应用程序都是无用的。

+0

这是真的,但这里的问题是流聚类质心甚至没有意义,即它不在数据集中。 你可能会在这里做些什么,我将在稍后以单通道运行普通kmeans,看看它们是否匹配。感谢您的回答:) –

+0

StreamingKMeans在spark中比我想象的要糟糕。 'setRandomCenters'将从N(0; 1)中抽取**随机高斯**,并假定这对你的数据是个好主意。现在其中一些中心可能从未收到过单点! –

+0

将正常的k-means设置为1次迭代和1次运行仍然给出了一个在数据范围内的合理答案。我发现解决这个问题的一种方法是,如果我使用正常的k-means并使用聚类中心作为流式k-means的setIntialCenters输入,那么它是正确的。 –