k 均值聚类算法的优点很明显,那就是原理简单、易于操作,并且执行效率非常高,因此该算法得到了广泛的应用。但它也有不足,大体上有以下四点。
1) k值需要事先给出
通过对 k 均值聚类算法的流程分析,不难看出,在执行该算法之前需要给出聚类个数(簇个数)。然而,在实际工作场景中,对于给定的数据集要分多少个类,用户往往很难给出合适的答案。此时,人们不得不根据经验或其他算法的协助来给出簇个数。这样无疑会增加算法的负担。在一些场景下,获取k的值要比实施算法本身付出的代价还大。
《k均值聚类算法核心》一节中的公式所示的误差函数,有一个很大的陷阱:随着簇个数的增加,误差函数趋近于 0,最极端的情况是每个样本各为一个单独的簇,此时样本的整体误差为 0,但是这样的聚类结果显然不是我们想要的。通常,我们可以引入结构风险,对模型的复杂度进行惩罚。
2) 聚类质量对初始簇中心的选取有很强的依赖性
在 k 均值聚类算法运行的开始阶段,要从数据集中随机地选取出 k 个数据样本,作为初始簇中心,然后通过不断的迭代得出聚类结果,直到所有样本点的簇归属不再发生变化。k 均值聚类算法的目标函数通常将各个点到簇中心之间的距离平方和最小化,目标函数是一个非凸函数,往往会导致聚类出现很多局部最小值,进而导致聚类陷入局部距离最小而非全局距离最小的局面。显然这样的聚类结果是难以令人满意的。
3) 对噪音数据比较敏感,聚类结果容易受噪音数据的影响
在 k 均值聚类算法中,需要通过对每个簇中的数据点求均值来获得簇中心。如果数据集中存在噪音数据,那么在计算均值点(簇中心)时,会导致均值点远离样本密集区域,甚至出现均值点向噪音数据靠近的现象。自然,这样的聚类效果是不甚理想的。
4) 只能发现球形簇,对于其他任意形状的簇无能为力
k 均值聚类算法常采用欧式距离来度量不同点之间的距离,这样只能发现数据点分布较均匀的球形簇。在聚类过程中,将距离平方和作为目标,是为了令目标函数能够取到极小值,算法会趋向于将包含数据较多的类分解为包含数据较少的类。一种极端情况是,算法把一个数据点视为一个类,这时数据点就是簇中心,距离误差达到最小(为 0),这种算法偏好也会导致聚类效果不甚理想。
k 均值聚类算法常采用欧式距离来度量不同点之间的距离,这样只能发现数据点分布较均匀的球形簇。在聚类过程中,将距离平方和作为目标,是为了令目标函数能够取到极小值,算法会趋向于将包含数据较多的类分解为包含数据较少的类。一种极端情况是,算法把一个数据点视为一个类,这时数据点就是簇中心,距离误差达到最小(为 0),这种算法偏好也会导致聚类效果不甚理想。
尽管 k 均值聚类算法有各种“不尽如人意”的小毛病,但算法简单,容易实现,瑕不掩瑜,它依然被广泛用在各种场景下。