2.3 设置k值
在一些情况下,k值的设置取决于聚类的目的。例如,一家公司计划生产小号、中号、大号和加大号男士毛衣,该公司前期在随机抽样的男士中收集了一系列相关数据(臂长、肩宽、胸围等),然后将这些数据分为4个子聚类用以帮助产品的设计。在另外一些情况下,我们并不确定k值的个数,只是希望通过算法在类似的观测值中找到最优的聚类方式。
肘部法(elbow method)在决定子聚类个数时被广泛应用。通过k-均值算法我们可以尝试多个不同的k值(例如k值取值范围为1~10),每个k值所得惯性矩分布如图2-3所示,图中线条的斜率向我们展示了随着子聚类个数的增加惯性矩值下降的趋势。在这个例子中,当我们将子聚类的个数由一个增加到2个、3个、4个时,惯性矩的下降是非常明显的,但从第4个再往后增加,惯性矩的下降趋势变弱,所以我们可以将k值为4作为最佳值。
图2-3 肘部法的应用,子聚类个数的增加与惯性矩的变化趋势
除了惯性矩,我们需要讨论的另外一个问题是如何区分子聚类。如果两个子聚类距离很近,则我们需要考虑是否有必要将两个子聚类分开。因此,数据分析师通常会检测子聚类之间的距离,对于各子聚类中心非常接近的情况,将子聚类个数从k增加到k+1,这个改变是没有太大必要的。
另外一种更加客观的、决定子聚类个数的方法是轮廓法(silhouette method)。同样,假设我们有一系列可选用的k值能够被代入k-均值算法中:对应每个k值,我们计算每个子聚类中观测值i与内部其他观测值之间的距离的平均数,设该平均距离为a(i);同时,我们计算该观测值i与外部其他子聚类中观测值之间的平均距离,设所有子聚类的平均距离最小值为b(i)。我们的目标是b(i)始终大于a(i),否则观测值i不应当被归于目前所在的子聚类中。轮廓法是用来衡量b(i)是否始终大于a(i)的方法:[1]
在上述公式中,s(i)的取值在-1和+1之间(正如前面提到的,当观测值被正确分配时,s(i)应为正数)。当取值越接近+1时,说明该观测值越应该属于目前所在的子聚类。同个子聚类中所有观测值的s(i)平均数可以用来衡量该子聚类中观测值的紧密度,而所有子聚类的s(i)的平均数则可以作为评价聚类的效果指标,我们称该指标为平均轮廓系数(average silhouette score)。例如,一组具体数字的平均轮廓系数分别为:0.70、0.53、0.65、0.52和0.45,分别对应k=2、3、4、5、6,则结论如下:k=2和4时聚类效果好于k=3、5、6。
另外还有一种决定k值的方式,是由Tibshirani等人于2001年提出的间隔统计量(gap statistic)。[2]在这种情况下,将子聚类内平方和与随机生成观测值的原假设下所产生的期望的值进行比较,我们创建N组随机观测值,针对每个k值,我们将观测值进行聚类,计算每个子聚类的惯性矩(N=500通常足够)。定义如下:
·mk:当有k个子聚类时,随机数据组的惯性矩的均值;
·sk:当有k个子聚类时,随机数据组的惯性矩的标准差;
·wk:当有k个子聚类时,观测数据的惯性矩。
我们设定:
上述公式计算出的是随机数据组惯性矩与观测数据惯性矩之差,有人认为,最优k值是保证Gapk-Gapk+1≤sk+1成立的最小整数。
[1] See L. Kaufman and P. Rousseeuw, Finding Groups in Data: An Introduction to Cluster Analysis, Wiley 1990.
[2] See R. Tibshirani, G.Walther, and T. Hastie (2001),“ Estimating the Number of Clusters in a Data Set via the Gap Statistic, ”Journal of the Royal Statistical Society, B, 63, Part 2:411-423.