乐趣区

关于人工智能:如何确定多少个簇聚类算法中选择正确簇数量的三种方法

聚类是一种无监督机器学习办法,能够从数据自身中辨认出类似的数据点。对于一些聚类算法,例如 K-means,须要当时晓得有多少个聚类。如果谬误地指定了簇的数量,则后果的成果就会变得很差(参见图 1)。

这种状况下,s 变为正数,靠近 -1。

在许多状况下,不晓得数据中有多少个簇。然而弄清楚有多少簇可能是咱们首先要执行聚类操作的起因。如果有数据集相干的畛域内常识可能有助于确定簇的数量。然而这假如须要晓得指标类(或至多有多少类),而在无监督学习中无奈确认,所以咱们须要一种办法,它能够在不依赖指标变量的状况下通知咱们簇的数量。

确定正确的簇数量的一种可能的解决方案是暴力测试的办法。咱们尝试不同数量的簇的聚类算法。而后找到最优的聚类后果,然而这种形式的须要破费大量的资源。在本文中,咱们首先介绍两个风行的指标来评估簇品质。而后介绍了三种办法来找到最佳簇数量:

  • 肘部法 The elbow method
  • 轮廓系数的优化 The optimization of the silhouette coefficient
  • 距离量统计 The gap statistic

聚类后果的品质

在应用不同的办法来确定最佳聚类数之前,首先要理解如何定量评估聚类后果的品质。设想以下场景,雷同的数据集分为三个簇(参见图 2)。左侧的聚类定义良好,而右侧的聚类辨认不佳。

这是为什么?聚类的指标是对聚类中的数据点进行分组,以便 (1) 聚类内的点尽可能类似,(2) 属于不同聚类的点尽可能不同。这意味着,在现实的聚类中,簇内的变动很小,而簇间的变化很大。因而,一个好的聚类品质度量应该可能定量地总结(1)和 / 或(2)。

一种这样的质量指标是 inertia(惯性)。这被计算为数据点与其所属聚类核心之间的平方间隔之和。inertia 量化了簇内的变动。

另一个风行的指标是 silhouette coefficient(轮廓系数),它试图总结簇内和簇间的变动。在每个数据点,咱们计算到该数据点所属的聚类核心的间隔(称为 a),以及到次优聚类核心的间隔(称为 b)。在这里,次好的簇是指不是以后数据点簇的最靠近的簇。而后基于这两个间隔 a 和 b,该数据点的轮廓 s 计算为 s=(b-a)/max(a,b)。

在现实聚类下,间隔 a 与间隔

一旦在所有数据点计算 s,s 的平均值就确定了轮廓系数。能够为每个簇独自计算轮廓系数,也能够为所有数据点计算轮廓系数。靠近 1 的轮廓系数表明聚类算法可能将数据划分为拆散良好的聚类。

肘部法令

inertia 是簇数 k 的递加函数。它的降落速度在最佳聚类数 K 高低是不同的。当 k<K 时,inertia 迅速降落,而当 k>K 时,inertia 降落很慢。因而,通过在 k 范畴内绘制 inertia,能够确定曲线在 K 处蜿蜒或弯头的地位。图 4 显示了图 1 中示例的惯性图。咱们能够分明地看到蜿蜒或弯头,在 k = 6。所以我将 inertia 翻译成了惯性是十分贴切的。

这种办法有些主观,因为不同的人可能会在不同的地位辨认肘部。在咱们图 4 的示例中,有些人可能会辩论说 k=4 是肘部。此外,肘部可能并不总是很显著,咱们将在前面看到。

肘部法的用例能够在自然语言问题中看到,以应用 KNIME 剖析平台确定社交网络中的最佳主题数量。因为没有 KNIME 节点来计算 inertia,因而在此示例中应用 Java Snippet 节点来计算 inertia。这是用于计算 inertia 的代码片段。

// Initializing the sum of squares
out_sum_squares = 0.0;
/*
The first half of columns belong to features of the origin.
The second half of columns belong to features of the terminus.
The groups of columns have to be in the same order.
 */
int col_count = getColumnCount();
int no_dimensions = col_count / 2;

// Loop over the feature columns
for(int i=0; i < no_dimensions; i++){
  /*
  Checking if the feature i from the origin and
  the feature i from the terminus (i.e., i+no_dimensions)
  are not missing, and have similar column names
   */
  if(!isMissing(i) && isType(i, tDouble)
   && !isMissing(i+no_dimensions) && 
   isType(i+no_dimensions, tDouble) &&
   getColumnName(i+no_dimensions).contains(getColumnName(i))){
    // Calculating the squared distance and adding it to the sum
    out_sum_squares += Math.pow(getCell(i, tDouble) - 
    getCell(i+no_dimensions, tDouble), 2);
   }
}

轮廓系数法

轮廓系数能够提供更主观的办法来确定最佳聚类数。这是通过简略地计算 k 范畴内的轮廓系数并将峰值辨认为最佳 K 来实现的。在 k 范畴内执行 K-Means 聚类,找到产生最大轮廓系数的最佳 K,并依据优化的 K 将数据点调配给聚类。图 5 显示了咱们提供的示例数据中的轮廓系数图示例 如图 1 所示,轮廓系数在 k=6 处达到峰值,因而确定为最佳 K。

距离量统计

为了探讨差距统计,让咱们思考一个没有任何聚类的随机数据集的聚类。假如一个随机数据集被聚类为 k 个聚类,并依据生成的聚类计算惯性(参见图 6)。只管不足根本的组织,但随着 k 的减少,簇的随机数据会产生稳步降落的惯性(惯性的复数)。这是因为聚类核心越多,数据点到聚类核心的间隔越小就会产生惯性的衰减。正如在图 4 中曾经看到的,在具备簇组织的数据集中,无论 k 是否低于或高于最佳簇数 K,惯性的缩小率都会有所不同。将察看数据和随机数据的惯性绘制在一起时差别变得显著(参见图 7)。距离量统计是通过比拟来自(心愿)聚类数据集和笼罩数据空间中雷同范畴的相应随机数据集的惯性来计算的。

图 6:均匀分布的随机数据汇集成 k=4(左)、6(中)和 15(右)簇。

图 7:原始数据(来自图 1)与 k 范畴内的随机数据的惯性如何升高。

在理论计算距离统计量时,会生成一些随机样本,而后在 k 的范畴内进行聚类,并记录由此产生的惯性。这容许随机状况下的一些惯性。原始数据集也在 k 的范畴内汇集,产生一系列惯性。k 个簇的间隙统计量计算为

其中 Wk(i) 是来自第 i 个随机样本 (i=1,2,…,B) 的惯性,具备 k 个簇,Wk 是来自原始数据的惯性具备 k 个簇,将其标准差计算为

而后找到最优 K 作为满足条件的最小 k

距离量统计的计算波及模仿,所以这里在 R 中计算间隙统计信息。特地是调用 clusGap() 函数计算不同 k 处的 gap 统计量,maxSE() 返回满足上述条件的最优 K。图 8 显示了图 1 中示例数据集的间隙统计图,基于每个 k 处的 B=100 次迭代。红线代表满足上述条件的最优 K。

须要留神的是,由距离量统计办法确定的最优 K 可能不统一。例如,当距离量统计办法屡次利用于演示数据时,失去的最优 K 可能不同(见图 9)。

MNIST 手写数字数据示例

当初让咱们在具备簇组织的实在数据集上查看上述三种办法。MNIST 数据集由 0 到 9 的手写数字的灰度图像组成。在这个例子中,咱们应用了 n=1797 个 8×8 像素的图像。图 10 显示了数据集的一些示例。

上述三种办法用于确定最佳聚类数。因为该数据集中有 10 个不同的数字,因而能够正当地假如有 10 个聚类,每个聚类对应一个数字。然而人们可能有多种书写数字的形式,实际上簇的数量不肯定是 10。数据的 2D 散点图(通过 tSNE 投影到 2D 空间,参见图 11)显示一些簇可能与其余簇很好地拆散,而一些 簇可能接触或重叠。

肘部法的后果尚无定论,因为图中没有显著的肘部(图 12,左)。而 图中有一些奥妙的蜿蜒(例如,9、12、20、24 等等),并且能够抉择其中任何一个作为聚类的数量。

图 12:依据数字数据生成的肘部图(左)和轮廓系数图(右)。

图 13:依据 B=100 次迭代从数字数据生成的距离量统计图。最佳 k=12 用红线示意。

轮廓系数在 k=12 处有一个峰值(图 12,右)。依据距离量统计办法,k=12 也被确定为最佳聚类数(图 13)。咱们能够直观地比拟 k=9(依据肘部办法最佳)和 k=12(依据轮廓和间隙统计办法最佳)的 k-Means 聚类(参见图 14)。

图 14:在 k=9 和 k=12 的数字数据中发现的 K-Means 聚类,t-SNE 投影到 2D 空间。

总结

本文展现了抉择最佳聚类数的三种不同办法,即肘部法、轮廓系数和距离量统计量。尽管肘部图的解释相当主观,但轮廓系数和间隙统计办法都能够准确地确定聚类的数量。然而距离量统计波及模仿,它可能并不总是产生雷同的后果。

与许多机器学习办法一样,此处形容的办法并非在所有场景中都能失常工作。因为这些办法量化了聚类核心和数据点之间的间隔,因而它们实用于寻找凸聚类,例如在 K-Means 聚类中找到的聚类的数量。

援用

Robert Tibshirani, Guenther Walther, Trevor Hastie. Estimating the number of clusters in a data set via the gap statistic. Journal of the Royal Statistical Society, Series B, 63: 411–423 (2001).

https://www.overfit.cn/post/c25bfe782db74e1aa44b345af4ec01e8

作者:Satoru Hayasaka

退出移动版