为什么StreamingKMeans集群中心与常规Kmeans不同

时间:2016-05-24 10:35:00

标签: java apache-spark cluster-analysis spark-streaming apache-spark-mllib

我使用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);   

流式传输的想法是我从kafka队列中读取所有内容并训练模型,并在新数据进入时自动更新。

我为这两个模型获得了两个不同的集群中心。我哪里做错了? 常规的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]

1 个答案:

答案 0 :(得分:1)

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

此外,流k-means可能只允许对数据进行一次传递,因此预期结果有点类似于1次迭代后的k-means

更新:Sparks StreamingKMeans setRandomCenters从N(0; 1)发行版中选择初始中心。根据您的数据,这可能是一个坏主意,并且一些集群中心(例如具有负坐标的集群中心)将永远保持为空。在我看来,这是一个非常愚蠢的初始化方法,对大多数应用程序都没用。