聚类属于无监督学习,线性回归、贝叶斯、SVM等常见的算法都是有类别标签y的,也就是说样例中已经给出了样例的分类。而聚类的样本中缺没有给定y,只给定了特征x。聚类的目的是找到每个样本x潜在的类别y,并将同类别y的样本x放在一起。k-means是聚类算法中的比较简单的一种。k-means主要是来计算数据聚集的算法,主要通过不断的更新质心,然后计算各点到质心的距离,将每一个点分配到一个簇中。
下图展示了n个样本点进行k-means聚类的效果,这里k取2.
k-means的算法流程如下:
1.随机在图中取k(这里k=2)个质心。
2.然后对图中的所有点求到这k个质心的距离,假设点A离质心P最近,那么A属于P点群。第三张图中已经把所有的点划分了类别。
3.我们将随机选取的2个质心位置更新,更新方式为计算第2步划分类别的各类别的中所有点的平均值。并将该平均值作为新的质心。
4.重复第2、第3步,计算各点到新质心的距离,并将数据点分配到距离最近的簇中。
5.直到质心的位置不发生变化,至此聚类操作完成。
在我们计算各点到质心的距离,一般常用欧式距离,也有使用曼哈顿距离的。而质心的求解一般是使用各点的平均值。
K-means主要有两个重要的缺陷,都和初始值有关:
- k是事先给定的,这个k值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少类别才最合适。
- k-means算法需要用初始随机质心来计算,这个随机质心太重要,不同的随机质心点会有得到完全不同的结果。
k-means算法收敛但聚类效果较差的原因是k-means算法收敛到了局部最小值,而非全局最小值。我们使用SSE来度量聚类的效果。SSE及各点到簇质心的距离平方值。SSE越小表示数据点越接近他们的质心,聚类效果越好。如何对聚类的结果进行改进呢?一种方法是将具有最大SSE值的测划分成2个簇。为了保持簇的总数不变,可以将某两个簇合并。一般有2种方法,第一种是合并最近的质心,第二种是合并使得SSE增幅最小的质心。第一种思路需要计算所有的质心之间的距离,然后合并距离最近的两个点来实现。第二种需要合并2个簇然后计算总SSE值,必须在所有可能的两个簇上重复上述过程,知道找到合并最佳的两个簇为止。
二分k-means算法是为了克服k-means算法收敛于局部最小值。该算法首先将所有的点作为一个簇,然后将该簇一份为二。之后选择其中一个簇继续划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE的值。上述基于SSE的划分不断重复,知道得到用户指定的k为止。