本文介绍K均值(KMeans)聚类算法。
0x01、k均值聚类简介
K均值聚类是基于样本集合划分的聚类算法。K均值聚类将样本集合划分为K个子集,构成K个类,将n个样本分到K个类中,每个样本到其所属类的中心的距离最小。每个样本只能属于一个类,所以K均值聚类是硬聚类。
1、模型
给定 个样本的集合 ,每个样本由一个特征向量表示,特征向量的维数是 。 均值聚类的目标是将 个样本分到 个不同的类或簇中,这里假设 。 个类 形成对样本集合 的划分,其中 ,。用 表示划分,一个划分对应着一个聚类结果。
划分 是一个多对一的函数。事实上,如果把每个样本用一个整数 表示,每个类也用一个整数 表示,那么划分或者聚类可以用函数 表示,其中 ,。所以k均值聚类的模型是一个从样本到类的函数。
2、策略
均值聚类归结为样本集合 的划分,或者从样本到类的函数的选择问题。 均值聚类的策略是通过损失函数的最小化选取最优的划分或函数 。
首先,采用欧式距离平方(squared Euclidean distance)作为样本之间的距离 :
然后,定义样本与其所属类的中心之间的距离的总和为损失函数,即:
式中 是第 个类的均值或中心, , 是指示函数,取值为1或0。函数 也称为能量,表示相同类中的样本相似的程度。
均值聚类就是求解最优化问题:
相似的样本被聚到同类时,损失函数值最小,这个目标函数的最优化能达到聚类的目的。但是这是一个组合优化问题,n个样本分到k类,所有可能分法的数目是:
这个数字是指数级的。事实上,k均值聚类的最优解问题是NP困难问题。现实中采用迭代的方法求解。
0x02、k均值聚类算法
k均值聚类的算法是一个迭代的过程,每次迭代包括两个步骤。首先选择k个类的中心,将样本逐个指派到与其最近的中心的类中,得到一个聚类结果;然后更新每个类的样本的均值,作为类的新的中心;重复以上步骤,直到收敛未知。具体过程如下。
首先,对于给定的中心值 ,求一个划分 ,使得目标函数极小化:
就是说在类中心确定的情况下,将每个样本分到一个类中,使样本和其所属类的中心之间的距离总和最小。求解结果,将每个样本指派到与其最近的中心 的类 中。
然后,对给定的划分C,再求各个类的中心 ,使得目标函数极小化:
就是说在划分确定的情况下,使样本和其所属类的中心之间的距离总和最小。求解结果,对于每个包含 个样本的类 ,更新其均值 :
重复以上两个步骤,直到划分不再该表,得到聚类结果。
【k均值聚类算法】
输入:n个样本的集合X;
输出:样本集合的聚类C* 。
(1)初始化。令 ,随机选择 个样本点作为初始聚类中心 ;
(2)对样本进行聚类。对固定的类中心 ,其中 为类 的中心,计算每个样本到类中心的距离,将每个样本指派到与其最近的中心的类中,构成聚类结果 ;
(3)计算新的类中心。对聚类结果 ,计算当前各个类中的样本的均值,作为新的类中心 ;
(4)如果跌到收敛或符合停止条件,输出 。否则,令 ,返回步骤(2)。
k均值聚类算法的复杂度是 ,其中 是样本维数, 是样本个数, 是类别个数。
0x03、k均值聚类算法在sklearn中是实现
sklearn.cluster.KMeans
参数 | 参数类型及取值范围 | 说明 |
n_clusters | 整型 | 簇的数量,即生成的质心的数量。默认值8。 |
init | {'k-means++', 'random', | 初始化方法。默认是'k-means++'。 k-means++:选择的初始均值向量之间都距离比较远,效果较好;random:随机选择K个样本最为初始均值向量;ndarry:形如(n_cluster,n_features)的数组作为初始均值向量。 |
n_init | 整型 | 算法使用不同质心种子下计算的次数。默认值10。 最终结果将是这些运行结果的最佳输出。 |
max_iter | 整型 | 最大迭代次数。默认值为300。 |
tol | 浮点型 | 算法收敛的阈值。默认值1e-4。 |
verbose | 整型 | 详细模式。默认值为0。 0表示不输出日志信息;1表示每隔一段时间打印一次日志信息。如果大于1,打印次数频繁。 |
random_state | 整型,或随机状态实例 | 随机数生成器种子。默认值None。 |
copy_x | 布尔型 | 当预先计算距离时,使之在数值上更精确地居中数据。默认值为True。 当为True时,原始数据不会被修改;为False时,原始数据会被修改,并在函数返回前放回,但可能会因减去再加上数据均值而引入小的数值上的差异。注意如果原始数据不是C-连续的,或原始数据稀疏,但不是CSR格式的,即使参数值为False也会进行复制。 |
algorithm | {'auto','full','elkan'} | 使用K均值算法。默认值为auto。 经典的EM风格算法是‘full’;通过使用三角不等式,elkan变异对定义完好的簇更有效;但由于分配了额外的形状数组(n_samples,n_clusters),因此需要更多的内存。 |
n_jobs | 整型 | 使用CPU的数量。默认值None。将在0.25版本被移除。 |
参考:
[1]. 李航. 统计学习方法(第二版)