K-Means
K-Means 算法是一种聚类算法,聚类当然是无监督了,给定初始数据集 $\left \{x_i \right\}_{i=1}^N$ ,K-Means 会把数据分成 $K$ 个簇,每个簇代表不同的类别,K-Means 算法如下:
1. 从训练集 $\left \{x_i \right\}_{i=1}^N$ 中选取 K 个质心, 分别为 $\left \{\mu_k \right\}_{k=1}^K$ ;
2. 重复一下过程直到收敛 :
2.1 对于样本 $x_i$ ,得到其类别 $c_i$ :\[c_i = \arg \min_k||x_i – \mu_k||^2\].
2.2 对于每一个簇 $k$ ,重新计算质心:\[ \mu_k=\frac{\sum_{i=1}^N 1\left \{ c_i = k \right \}x_i}{\sum_{i=1}^N 1\left \{ c_i = k \right \}}\]
聚类完成后,用 $\left \{C_k \right\}_{k=1}^K$ 表示得到 $K$ 个簇,可以定义一个损失来衡量聚类的效果,该损失同时可用作为迭代的停止条件,其形式如下:
\[J = \sum_{k}\sum_{x_i\in C_k}||x_i-\mu_k||^2\]
当两次迭代的损失 $J$ 基本不发生变化,或者每个簇的样本基本不发生变化时,迭代便可停止。下图为 K-Means 的过程:
K-Means 非常简单,实际应用中有两个关键问题,分别是:K 值的选取与初始质心的选择,下边分别来讨论之:
K值选取
1)Elbow Method :Elbow意思是手肘,如下图左所示,此种方法适用于 K 值相对较小的情况,当选择的k值小于真正的时,k每增加1,cost值就会大幅的减小;当选择的k值大于真正的K时, k每增加1,cost值的变化就不会那么明显。这样,正确的k值就会在这个转折点,类似elbow的地方。 如下图
但是有些数据集上 Elbow 的转折趋势不明显,如上图右,所以可以采用 BIC 准则的方法。
2) BIC(贝叶斯信息准则):
\[BIC = \ln( likelihood)-\frac{K}{2} \times \ln N \]
其中,N 是数据集中的样本数目,K 为类别参数。BIC是对模型拟合程度和复杂度的一种度量方式,计算公式中的第一项是对模型拟合度的度量,这个值越大,说明拟合程度越好。第二项是对模型复杂度的度量。 两者构成一个权衡,BIC越大说明模型越好,K-Means 关于 BIC 中似然函数的计算可参考文献 。
初始质心选择
1)K-Means++ 的方法,首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。
2)K-MeansII 的方法,对于 k 值确定后,该方法在每次循环中选取多个点作为准质心(将来有可能会成为质心的点),循环 n 次之后,会选取足够多的准质心。准质心的数量要远大于 k ,而且在每次循环中选取的准质心数量一般也会非常多, 例如每次选 1000 个,这样循环的次数要比k小很多,计算效率就会高很多。最后对所有的准质心进行聚类(可以使用 K-Means++ 算法),将聚类结果中的k个质心作为全数据集的k个质心。这样不仅选质心时的计算效率提高了,而且选出的k个质心的位置也会比较好,因为是再聚类生成的质心。
3)交叉验证或者预先层次聚类选择比较靠谱的质心与K值。
参考文献
1.
2. K值选择
3. 初始质心的选择
4.
5.
6.
7.