【问题标题】:Why is the StreamingKMeans cluster centers different vs regular Kmeans为什么 StreamingKMeans 集群中心与常规 Kmeans 不同
【发布时间】:2016-09-21 12:28:46
【问题描述】:

我有两个模型使用与 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

集群中心:[1.41012161E9,20.9157142857143,68.01750871080174]

集群中心:[2.20259211E8,0.6811821903787257,36.58268423745944]

集群:StreamingKmeans

集群中心:[-0.07896129994296074,-1.0194960760532714,-0.4783789312386866]

集群中心:[1.3712228467872134,-0.16614353149605163,0.24283231360124224]

【问题讨论】:

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


    【解决方案1】:

    k-means 是随机化的。如果你运行它两次,你可能会得到两个不同的结果。特别是,它们可能无法对齐(即集群 1 可能与其他结果中的集群 1 不匹配)。

    此外,流式 k-means 可能只允许对数据进行单次传递,因此结果预计会与 k-means 有点相似在 1 次迭代后

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

    【讨论】:

    • 确实如此,但这里的问题是流式集群质心甚至没有意义,即它不在数据集中。你可以在这里做一些事情,我稍后会用单次通过运行正常的 kmeans,看看它们是否匹配。感谢您的回答:)
    • Spark 中的 StreamingKMeans 比我想象的要糟糕。 setRandomCenters 将从 N(0;1) 中抽取 随机高斯,并假设这对您的数据来说是个好主意。现在,其中一些中心可能从未获得过一分!
    • 将正常的 k-means 设置为 1 次迭代和 1 次运行仍然给出了在数据范围内的合理答案。我发现解决此问题的一种方法是,如果我执行正常的 k-means 并将集群中心用作流式 k-means 的 setIntialCenters 输入,那么它是正确的。
    • 您也可以尝试使用前 k 个对象作为初始数据中心。这将是流式传输 k-means 的常用方法。
    猜你喜欢
    • 2021-08-20
    • 2020-05-26
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2019-09-02
    • 2019-06-11
    • 2018-10-28
    • 2019-11-27
    相关资源
    最近更新 更多