摘要
KMeans是一种简单的对给定数据集将其划分成k个簇的聚类算法,数据挖掘十大算法之一,其数学原理也是非常的朴素。本文将根据KMeans的原理将其实现,并对其性能进行分析,讨论其缺陷与探讨业界主流的改进方式。
1 引言
KMeans 算法的思想是由许多跨学科领域的研究者们经过长时间不断的交织出来的,但其第一次使用是由Lloyd(1957, 1982)所提出用于调制脉冲编码,关于KMeans的更多历史信息可在[2]中找到,KMeans提出之初因为其朴素算法涉及组合爆炸问题导致其是NP-Hard的问题,但Gray and Neuhoff[3]提出了一种非常高效的启发式搜索算法,使其能够较快的收敛至局部最优值。
本文第二节会详细的阐述KMeans的数学原理(这是必要的),根据其核心原理使用Python语言将其实现;第三节中会使用scikit-learn产生一组测试数据集,该数据集由三个不同的高斯分布生成,而后会将第二节中实现的KMeans算法应用在此数据集上,并与scikit-learn中提供的KMeans算法进行对比,最后会讨论KMeans的不足并探讨业界流行的改进方式;第四节是对本文的总结。
2 原理及实现
KMeans其本质是一种基于形心的聚类技术[5],目的要把 D D D 中的所有对象分配到 k k k个簇$ C_1, \cdot \cdot \cdot , C_k$中,使得对于 1 ⩽ i , j ⩽ k , C i ⊆ D 1 \leqslant i , j \leqslant k , C_i \subseteq D 1⩽i,j⩽k,Ci⊆D且$ C_i \cap C_j = \varnothing $。使用一个距离度量评价划分的质量,即
E = ∑ j = 1 k ∑ x ∈ C j d i s t ( x , μ j ) ( 2.1 ) E = \sum^{k}_{j=1} \sum_{x \in C_j} dist(x, \mu_j) \qquad \qquad (2.1) E=j=1∑kx∈Cj∑dist(x,μj)(2.1)
其中 d i s t ( ⋅ , ⋅ ) dist(\cdot,\cdot) dist(⋅,⋅)<