如何在已知聚类数和大小的情况下使用K-means聚类
我正在用scikit来对一些数据进行聚类。
我有一个非常简单的任务:我知道要分成多少个组。而且,我知道每个组的大小。请问可以把这些信息告诉K-means函数吗?
3 个回答
1
我只想到了一种简单粗暴的方法,也就是暴力算法。如果这些数据组之间的距离很远,你可以尝试多次运行聚类算法,每次用不同的随机初始值,只需要输入你想要的聚类数量。每次运行后,统计每个聚类的大小,把它们排序,然后和已知的聚类大小列表进行比较。如果不匹配,就再来一次,直到匹配为止。
3
不行。你需要一种受限制的聚类算法来完成这个任务,而在scikit-learn这个库里没有实现这样的算法。(这并不是“最简单的任务”,我甚至不知道有什么正规的算法可以做到这一点,除了通过一些经验方法把样本从一个聚类移动到另一个聚类。)
2
这就不是k-means了。
k-means是一种最小化方差的方法,而看起来你的目标是生成预定义大小的分组,而不是最小化方差。
不过,这里有一个教程,教你如何修改k-means,使其生成相同大小的聚类。你可以很容易地扩展这个方法,来生成你想要的特定大小的聚类,而不是平均大小。这样修改k-means其实挺简单的。但是,结果在大多数数据集上会比k-means的结果更没有意义。k-means的效果往往和随机的凸分区差不多。