自动确定簇数 k-means

Posted

技术标签:

【中文标题】自动确定簇数 k-means【英文标题】:automatically determine number of clusters k-means 【发布时间】:2015-01-05 17:16:11 【问题描述】:

我想在rapid miner中建立一个集群模型,可以自动定义集群的数量,然后继续k-means算法。 Rapid Miner 有什么方法可以自动确定聚类的 k 吗?

【问题讨论】:

您应该在 rapidminer 论坛上提出此类问题,除非您打算修改 rapdiminer 源代码 - 本网站用于编程问题,而不是用于使用问题。 【参考方案1】:

在 k-means 中,k 的值由用户提供。可以使用集群有效性度量(例如 Davies-Bouldin)来评估生成的集群以给出分数。通过改变 k,可以产生不同的集群有效性分数,并且最佳分数(对于 Davies-Bouldin 而言是最小值)将成为最有趣的 k 值的候选者。请点击链接了解如何在 RapidMiner Examples 中完成此操作的详细信息。

有很多与此相关的警告。最重要的一点是,必须有领域专家参与,以检查 k 的值和产生的聚类是否有意义。

【讨论】:

【参考方案2】:

确定 K 的一个技巧是首先对您的数据集运行 DBSCAN。从 DBSCAN 中确定聚类的数量,然后使用 K-means 得到聚类中心

这是一些python代码:

from sklearn.cluster import DBSCAN #python -m pip install scikit-learn
import cv2 as cv #python -m pip install opencv-python
import numpy as np #python -m pip install numpy
Z=np.array([0.0,1.0,0.25,0.11,0.12,0.27,0.99,1.1,0.05,0.06]) 
Z=np.unique(Z) #speed up the DBSCAN by considering only unique points
Z=Z.reshape((-1,1)).astype(np.float32)
K=int(np.max(DBSCAN(eps=0.05,min_samples=2).fit(Z).labels_))+1
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
_,label,center=cv.kmeans(Z,K,None,criteria,10,cv.KMEANS_RANDOM_CENTERS)
print(f"\nK=K")
print("\nlabel=")
print(label)
print("\ncenter=")
print(center)

代码输出:

K=4

label=
[[0]
 [0]
 [0]
 [3]
 [3]
 [1]
 [1]
 [2]
 [2]
 [2]]

center=
[[0.03666667]
 [0.26      ]
 [1.0300001 ]
 [0.11499999]]
   

【讨论】:

以上是关于自动确定簇数 k-means的主要内容,如果未能解决你的问题,请参考以下文章

R语言KMeans聚类分析确定最优聚类簇数实战:间隙统计Gap Statistic(确定最优聚类簇数)

R语言KMeans聚类分析确定最优聚类簇数实战:间隙统计Gap Statistic(确定最优聚类簇数)

R语言KMeans聚类分析确定最优聚类簇数实战:肘部法则elbow method(确定最优聚类簇数)

R语言KMeans聚类分析确定最优聚类簇数实战:Calinski-Harabasz准则(确定最优聚类簇数)

R语言KMeans聚类分析确定最优聚类簇数实战:期望最大化expectation-maximization准则(确定最优聚类簇数)

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