Mahout KMeans 生成的簇数比我的初始 K 设置翻倍

Posted

技术标签:

【中文标题】Mahout KMeans 生成的簇数比我的初始 K 设置翻倍【英文标题】:Mahout KMeans generate doubled cluster number than my initial K setting 【发布时间】:2012-10-02 06:54:12 【问题描述】:

我是 Mahout 的初学者,我使用 Mahout 0.8 并按照 https://cwiki.apache.org/MAHOUT/clustering-of-synthetic-control-data.html 中的教程进行操作

当我使用: mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job -i testdata -o output -t1 20 -t2 50 -k 5 -x 20 -ow

然后使用 clusterdump 提取集群中心:

mahout clusterdump --input output/clusters-20-final --output /media/synthetic_control.center

在synthetic_control.center 文件中:

VL-585n=50 c=[29.832, 29.589, 29.405, 28.516, 29.600, ….] r=[3.152, 3.518, 3.292, …]

VL-591n=197 c=[29.984, 29.681,…] r=[3.602, 3.558, 3.364,…]

VL-595n=203 c=[….] r=[….]

VL-597n=61 c=[….] r=[….]

VL-599n=43 c=[….] r=[….]

VL-585n=1 c=[….] r=[….]

VL-591n=27 c=[….] r=[….]

VL-595n=1 c=[….] r=[….]

VL-597n=1 c=[….] r=[….]

VL-599n=16 c=[….] r=[….]

似乎 kmean 生成了 10 个集群,但我对 k 的初始设置是 5。

我也尝试了其他k,它总是生成双倍簇。

谁能帮我解决这个问题?非常感谢!

【问题讨论】:

你不应该选择t1 > t2吗? @Anony-Mousse:是的,感谢您的通知。实际上,t1 应该 > t2。这些参数用于canopy-clustering,因为设置了cluster-number K,job不会在kmeans之前运行canopy clustering,而是直接运行kmean,所以这里t1和t2无所谓。 【参考方案1】:

哈哈!最后,看了代码,发现mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job的bug!!

事情是这样的: 在syntheticcontrol.kmeans.Job中,如果用户设置了k,那么job不会在kmeans之前运行canopy clustering,而是直接运行kmean。 运行kmean时,它需要每个簇的初始中心,所以它使用RandomSeedGenerator随机生成每个簇中心并将这个文件(part-randomSeed)放到output/clusters-0文件夹,在这个kmean之后首先使用这些中心对所有点进行分类并更新聚类中心并将这些中心放入 output/clusters-0 文件夹。因此,在 clusters-0 文件夹中,有两组中心!因此,第一次迭代将读取双倍集群!这就是为什么这个作业总是产生双倍的簇数!

解决方案:将部分随机种子保存到另一个文件夹。 在 org.apache.mahout.clustering.syntheticcontrol.kmeans.Job

第 142 行,Path clusters = new Path(output, Cluster.INITIAL_CLUSTERS_DIR);

更改为Path clusters = new Path(output, "randomSeeds");

【讨论】:

确认这是一个错误的唯一方法就是报告它。

以上是关于Mahout KMeans 生成的簇数比我的初始 K 设置翻倍的主要内容,如果未能解决你的问题,请参考以下文章

聚类(kmeans,DBSCAN,OPTICS)

kmeans

R语言确定聚类的最佳簇数:3种聚类优化方法

使用 sklearn tf-idf 查找矢量化文本文档中的簇数

数据分析 第六篇:聚类的评估(簇数确定和轮廓系数)和可视化

R语言KMeans聚类分析确定最优聚类簇数实战:NbClust包(确定最优聚类簇数)