Calinski-Harbasz Score 详解

在做海量数据聚类分析(MiniBatch Kmeans)的时候,常常因为数据量太大画不出dendrogram,没办法用Elbow Method确定K值。这时需要其他metrics辅助确定K值。在做聚类之前,一定要先做去重啊!

概括地说,评估聚类的方法主要有两种:

  • 内部评估方法:不需要借助其他监督数据,通过一个单一的量化得分评估算法好坏
  • 外部评估方法:需要知道数据的类别,通过将聚类结果与ground truth进行对比,评估算法好坏

实际生产环境中,很少有标注数据帮助我们进行聚类,因为很难人为地确定到底有多少个簇,簇之间的区别不是很明显,特别是对于文本数据。

内部评估方法有:

  • Silhouette Coefficient
  • Calinski-Harbasz Score
  • Davies-Boulding

详细地使用方法可以参考sklearn文档:2.3. Clustering — scikit-learn 1.0.2 documentation

为了后续复习方便,这里简单介绍一下Silhouette Coefficient。Silhouette Coefficient对于一个样本点需要计算两种距离: a-当前样本点与同类的其他样本点的平均距离,b-当前样本点与最接近的另一个类的其他样本点的平均距离。当前样本点的得分是s,计算方式如下:

 s = \frac{b - a}{max(a, b)}

s衡量的是当前样本点是否离当前类的其他样本点近,并且与最接近的另一个类足够远。对于每个样本点都需要计算这样一个得分,计算复杂度可想而知。

每种评估方法都各有优缺点,因为Silhouette Coefficient的计算复杂度太高,即使在GPU的机器上,跑30w数据跑了1个小时还没跑出来,所以考虑Calinski-Harbasz Score,Calinski-Harbasz Score的优点就在于计算速度非常快。

在实际使用的过程中,发现类别越少,Calinski-Harbasz Score的分数越高,当k=2时,分数达到最高。但是30w数据分成2类也太敷衍了吧(抓狂)!于是开始研究这个metrics到底在评估什么东西。结论,当上述情况发生的时候,需要一个个K值去测试,找到一个local maxium(局部最高)的分数,这个分数对应的K值就是当前最佳的分类。根据:Calinski-Harabasz Index and Boostrap Evaluation with Clustering Methods

Calinski-Harbasz Score是通过评估类之间方差和类内方差来计算得分。

s = \frac{SS_B}{k-1}/ \frac{SS_W}{N-k},其中k代表聚类类别数,N代表全部数据数目。SS_B 是类间方差,SS_W 是类内方差。

SS_B的计算方式是:

SS_B = tr(B_k)

B_k = \sum_{q=1}^{k}n_q(c_q-c_E)(c_q-c_E)^T,trace只考虑了矩阵对角上的元素,即类q中所有数据点到类的欧几里得距离。

SS_W的计算方式是:

SS_W = tr(W_k)

W_k = \sum_{q=1}^{k}\sum_{x \in C_q}(x-c_q)(x-c_q)^T,其中C_q是类q中所有数据的集合,c_q是类q的质点,c_E是所有数据的中心点,n_q是类q数据点的总数。

Calinski-Harbasz Score衡量分类情况和理想分类情况(类之间方差最大,类内方差最小)之间的区别,归一化因子(N-k)/(k-1)随着类别数k的增加而减少,使得该方法更偏向于选择类别少的分类结果。这导致了在实验中K=2,往往得到很高的分数,但是这不是我们想要的结果。这时,我们需要去找另一个局部最优的K。即使找到的K不是真正的分数最高,但是只要它们对应的得分显著高,我们都可以接受这样的值,如同梯度一样,我们有的时候并不能找到全局最优,但是局部最优的结果仍可以接受。

你可能感兴趣的:(kmeans算法)