肘法找到90个不同kmeans(weka)的簇数

时间:2018-07-22 18:07:48

标签: java machine-learning cluster-analysis weka k-means

我正在进行增量学习,并且每次迭代都必须进行聚类。我正在使用Java在weka上使用简单kmeans进行90种不同的聚类。如何为每个群集过程找到群集数量?我可以轻松找到wss,因此我认为肘部方法可以解决此问题,但我无法实现。

1 个答案:

答案 0 :(得分:0)

@ var-yok要在java中使用弯头方法,请尝试以下操作

K均值是一种简单的无监督机器学习算法,可将数据集分组为用户指定的(k)个簇。该算法有些幼稚-即使k不是要使用的正确簇数,它也会将数据簇分为k个簇。因此,在使用k均值聚类时,用户需要某种方法来确定他们是否使用了正确数量的聚类。

一种验证簇数的方法是弯头法。弯头方法的想法是针对数据集的k值范围(例如,在上面的示例中k从1到10)在数据集上运行k均值聚类,并针对k的每个值计算平方误差之和( SSE)。像这样:

var sse = {};
for (var k = 1; k <= maxK; ++k) {
    sse[k] = 0;
    clusters = kmeans(dataset, k);
    clusters.forEach(function(cluster) {
        mean = clusterMean(cluster);
        cluster.forEach(function(datapoint) {
            sse[k] += Math.pow(datapoint - mean, 2);
        });
    });
}

然后,为k的每个值绘制SSE的折线图。如果折线图看起来像手臂,那么手臂上的“肘”就是最好的k值。这个想法是我们想要一个小的SSE,但随着k的增加,SSE趋于朝0减小(当k等于数据集中的数据点数时,SSE为0,因为那时每个数据点都是自己的集群,并且它和集群中心之间没有错误)。因此,我们的目标是选择一个仍具有较低SSE的小值k,而弯头通常代表我们通过增加k开始收益递减的地方。