自动确定簇数 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准则(确定最优聚类簇数)