(1)尽量选择距离比较远的点(方法:依次计算出与已确定的点(第一个点可以随机选择)的距离,并选择距离最大的点)。当k比较大时,这种方法计算量比较复杂,适合二分K-均值聚类算法的k值初始化。
(2)采取层次聚类的方式找出k个簇。 TBD
3. 特征值处理
K-均值聚类算法需要数值型数据来进行相似性度量,也可以将标称型数据映射为二值型数据再用于度量相似性。
另外,样本会有多个特征,每一个特征都有自己的定义域和取值范围,他们对distance计算的影响也就不一样,如取值较大的影响力会盖过取值较小的参数。为了公平,样本特征取值必须做一些scale处理,最简单的方式就是所有特征的数值都采取归一化处置,把每一维的数据都转化到0,1区间内,从而减少迭代次数,提高算法的收敛速度。
4. k值的选取
前面提到,在k-均值聚类中簇的数目k是一个用户预先定义的参数,那么用户如何才能知道k的选择是否正确?如何才能知道生成的簇比较好呢?与K-近邻分类算法的k值确定方法一样,k-均值算法也可采用交叉验证法确定误差率最低的k值,参考“机器学习经典算法详解及Python实现–K近邻(KNN)算法”的2.3节-k值的确定。
当k的数目低于真实的簇的数目时,SSE(或者平均直径等其他分散度指标)会快速上升。所以可以采用多次聚类,然后比较的方式确定最佳k值。多次聚类,一般是采用 k=1, 2, 4, 8… 这种二分数列的方式,通过交叉验证找到一个k在 v/2, v 时获取较好聚类效果的v值,然后继续使用二分法,在 [v/2, v] 之间找到最佳的k值。
5. K-均值算法的Python实现
下载地址:TBD
K-均值算法收敛但聚类效果较差的原因是,K-均值算法收敛到了局部最小值,而非全局最小值(局部最小值指结果还可以但并非最好结果,全局最小值是可能的最好结果)。为克服k-均值算法收敛于局部最小值的问题,有人提出了另一个称为二分k- 均值(bisecting K-means)的算法。
(三)二分K-均值(bisecting k-means)聚类算法
顾名思义,二分K-均值聚类算法就是每次对数据集(子数据集)采取k=2的k-均值聚类划分,子数据集的选取则有一定的准则。二分K-均值聚类算法首先将所有点作为一个簇,第一步是然后将该簇一分为二,之后的迭代是:在所有簇中根据SSE选择一个簇继续进行二分K-均值划分,直到得到用户指定的簇数目为止。根据SSE选取继续划分簇的准则有如下两种:
(1)选择哪一个簇进行划分取决于对”其划分是否可以最大程度降低SSE的值。这需要将每个簇都进行二分划分,然后计算该簇二分后的簇SSE之和并计算其与二分前簇SSE之差(当然SSE必须下降),最后选取差值最大的那个簇进行二分。
该方案下的二分k-均值算法的伪代码形式如下:
***************************************************************
将所有数据点看成一个簇
当簇数目小于k时
对每一个簇
计算总误差
在给定的簇上面进行k-均值聚类(k=2)
计算将该簇一分为二后的总误差
选择使得误差最小的那个簇进行划分操作
***************************************************************
(2)另一种做法是所有簇中选择SSE最大的簇进行划分,直到簇数目达到用户指定的数目为止,算法过程与(1)相似,区别仅在于每次选取簇中SSE最大的簇。
二分K-均值聚类算法的Python实现
下载地址:TBD
End.
作者:Python中文社区(中国统计网特邀认证作者)