聚类分析如可确定最佳的聚类簇数?

聚类与分类的不同在于,聚类所要求划分的类是未知的。也就是说我们对样本数据的划分是不了解。聚类分析的任务就是要明确这个划分。例如我们采集到很多未知的植物标本,并对每株标本的植物学特征进行了记录、量化。那么这些植物标本到底是几个物种呢?聚类分析就可以解决这个问题。

当前在机器学习领域涌现了许多优秀的聚类分析算法供我们使用,如k-means、DBSCAN、AGNES等。通过使用这些成熟的算法,我们很容易完成对数据样本的聚类分析。但是同时我们也普遍面临一个问题的困扰——对于类别未知的数据集合,分几个类别才是最优的?

可视化的手段是常用的,如上图。我们可以直观的判断样本聚集的质量。但是对于超出3维的高维数据,可视化手段就失效了。

聚类质量的判断标准是簇内相似度最高、簇间差异性最高,这个标准我们如何进行衡量呢?

今天我们介绍一个非常好有并且有效的工具——calinski_harabaz分数。calinski_harabaz分数的计算公式如下:

,其中m为样本总量,k为分类的数量(簇数),Bk是簇间协方差矩阵,Wk是簇内协方差矩阵,tr是矩阵的迹(矩阵主对角线(从左上方至右下方的对角线)上各个元素的总和被称为矩阵)。也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabaz分数会高,聚类的结果就更好。

对于聚类结果的评价,我们还可以使用轮廓系数silhouette和兰德指数,从计算效率来看calinski_harabaz分数最高,所以一般来说calinski_harabaz分数更常用。

使用sklearn.metrics的calinski_harabaz_score(样本数据,聚类结果)函数就可以进行聚类结果的评价了。在实际工作中,我们可以使用如下算法完成最优聚类结果的选择:

import sklearn.metrics
ch_score=0
best=null
#args为聚类算法clustering的参数
for arg in args:
    clusters=clustering(sample,arg)
    _score=calinski_harabaz_score(sample,clusters)
    if(_score>ch_score):
        best=clusters
        ch_score=_score
output(best)

推荐自编课程《零基础学python数据分析》
推荐自编简明预测分析教程(Python版)

### 如何选择聚类分析中的最佳 在处理类别未知的据集合时,确定最优的聚类量是一个常见的挑战。为了找到最合适的,可以采用多种评估方法来指导决策。 #### 使用肘部法则 (Elbow Method) 一种直观的方法是基于总组内平方和(WSS, Within-Cluster Sum of Squares),随着增加量 k ,WSS 将逐渐减小。当继续增大 k 值所带来的 WSS 减少变得微不足道时,在图上会形成一个类似于“肘”的弯曲点,该位置即被认为是理想的目[^2]。 ```python from sklearn.cluster import KMeans import matplotlib.pyplot as plt def elbow_method(data): wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0) kmeans.fit(data) wcss.append(kmeans.inertia_) plt.plot(range(1, 11), wcss) plt.title('The Elbow Method') plt.xlabel('Number of clusters') plt.ylabel('WCSS') # within cluster sum of squares plt.show() ``` #### 应用平均轮廓系 (Silhouette Coefficient) 另一种有效的方式是利用平均轮廓宽度来进行评价。此度量考虑了样本与其最近邻之间的距离关系,并给出介于 -1 到 +1 的分;其中接近+1表示良好分离的结构。因此,可以通过遍历不同的 k 取值并选取使得整体平均轮廓达到最大的那个作为最终的选择标准[^3]。 ```python from sklearn.metrics import silhouette_score def find_best_k_silhouette(X, min_k=2, max_k=10): best_k = None best_score = -1 for n_cluster in range(min_k, max_k+1): kmeans = KMeans(n_clusters=n_cluster).fit(X) label = kmeans.labels_ sil_coeff = silhouette_score(X, label, metric='euclidean') if sil_coeff > best_score: best_score = sil_coeff best_k = n_cluster return best_k, best_score ``` 除了上述两种常用的技术外,还有其他一些可供参考的标准和技术,比如间隙统计量(Gap Statistic),它通过比较实际据与随机分布下的 log(WCSS) 差异来决定最优
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

interbigdata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值