机器学习之聚类算法K-Means

2019-01-14  本文已影响70人  oneape15

K-Means算法是最简单的一种聚类算法,属于无监督学习算法
假设我们的样本是
\{ x^{(1)}, x^{(2)}, ..., x^{(m)}\},每个x^{(i)} \in R^n
即它是一个n维向量。现在用户给定一个K值,要求将样本聚类(Clustering)成K个类簇(Cluster)。在这里我们把整个算法称为聚类算法,聚类算法的结果是一系列的类簇。

K-Means是一个迭代型的算法,它的算法流程是:

  1. 随机选取K个聚类质心(Cluster Centroid),为\mu_1,\mu_2,...,\mu_k \in R^n
  2. 重复下面过程,直到收敛:
    2.1 对于每个样本i, 计算它应该属于的类:
    c^{(i)}:=arg \ min_j\ || x^{(i)} - \mu_j||^2
    2.2 对于每一个类别j,重新计算它的质心:
    \mu_j:=\frac{\sum_{i=1}^n{1}\{c^{(j)}=j\}x^{(i)}}{\sum_{i=1}^n{1}\{c^{(i)} = j\}}

收敛是在上一次迭代到本次迭代中,每个样本隶属于同样的类别,每个类别的质心不再发生改变。

下面以一个实例展示K-Mean标准算法的执行过程。假设我们对样本进行K=3的聚类,下图的正方形是样本点,圆点(不同灰度)分别是三个类的质心。

K-Means算法实例
注意: 图中不同灰度的圆圈不是真实存在的数据点,而是某个类簇的虚拟质心

在K-Means算法中,涉及距离的计算,最常用的距离是欧式距离,欧式距离(Euclidean Distance)的公式为:
欧式距离 \ d_{ij}=\sqrt[]{\sum_{K=1}^n(x_{iK} - x_{jK})^2}
此外,还有闵可夫斯基距离,曼哈顿距离(也称为城市距离,City Block Distance)可以使用,它们的计算公式分别为:
闵可夫斯基距离 \ d_{ij} =\sqrt[\lambda]{\sum_{K=1}^n(x_{iK} - x_{jK})^\lambda}

曼哈顿距离\ d_{ij} =\sum_{K=1}^n|x_{iK} - x_{jK}|

K值的选择

在K-Means算法中,K值的选择是一个重要的问题

我们希望所选择的K正好是数据里隐含的真实的类簇的数目;

我们可以选择的类簇指标包括平均半径或者直径;

K-Means是可伸缩和高效的,方便处理大数据集,计算的复杂度为O(NKt),其中
N为数据对象的数目,
t为迭代的次数。
一般来说,K<<N,t<<N。
当各个类簇是密集,且类簇与类簇之间区别明显时,K-Means算法可以取得较好的效果。

K-Means算法的缺点
  1. 在K-Means算法中,K值是事先给定的,一个合适的K值难以估计;
  2. 在K-Means算法中,首先需要根据初始类簇中心来确定一个初始划分,然后对初始划分进行优化。初始类簇中心的选择对聚类结果有较大的影响。不旦初始值选择的不好,可以无法得到有效的聚类结果。
  3. 算法需要不断的进行样本分类调整,不断地计算调整后的新类簇中心,因此当数据量非常大时,算法的时间开销是非常大的。
优化处理

对于上面的三个缺点,我们可以做一些优化来规避这些缺点;

  1. 使用遗传算法(Genetic Algorithm),帮助选择合适的初始类簇中心。
  2. 对于数据量大时,可以利用采样策略,改进算法效率。也就是初始点的选择,以及每一次迭代完成时对数据的调整,都是建立在随机采样的样本数据的基础之上,这样可以提高算法的收敛速度。
上一篇下一篇

猜你喜欢

热点阅读