K-means聚类

1. 概念

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如果用数据表达式表示,假设簇划分为(C1,C2,C3),则我们的目标是最小化平方误差E:

其中μi是簇Ci的均值向量,有时也称为质心,表达式为:

下面我们用一组图就可以形象的描述说明

  上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。当然在实际K-Mean算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别。

2. 原理步骤:

  • 随机设置K个特征空间内的点作为初始的聚类中心
  • 对于其他每个点计算到k个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
  • 接着对标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  • 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

3. API: sklearn.cluster.KMeans

主要参数:
KMeans(n_clusters= ,init= ,)
1) n_clusters: 即我们的k值,一般需要多试一些值以获得较好的聚类效果。k值好坏的评估标准在下面会讲.
2)init: 即初始值选择的方式,可以为完全随机选择’random’,优化过的’k-means++’或者自己指定初始化的k个质心。一般建议使用默认的’k-means++’。
3)algorithm:有“auto”, “full” or “elkan”三种选择。”full”就是我们传统的K-Means算法,“elkan”是elkanK-Means算法。默认的”auto”则会根据数据值是否是稀疏的,来决定如何选择”full”和“elkan”。一般数据是稠密的,那么就是“elkan”,否则就是”full”。一般来说建议直接用默认的”auto”

4. K-means的性能评估指标

不像监督学习的分类问题和回归问题,我们的无监督聚类没有样本输出,也就没有比较直接的聚类评估方法。但是我们可以从簇内的稠密程度和簇间的离散程度来评估聚类的效果。常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index。下面是这两种方法在scikit-learn中的介绍

  • 轮廓系数Silhouette Coefficient
    • API: sklearn.metrics.silhouette_score
    • 主要参数:
      silhouette_score(x ,labels)
      x:输入特征值
      labels:聚类估计器产生的值
      返回值趋近于1则模型越好
  • 轮廓系数Calinski-Harabasz Index
    • API: sklearn.metrics.calinski_harabaz_score
    • 主要参数:
      calinski_harabaz_score(x ,labels)
      x:输入特征值
      labels:聚类估计器产生的值
      返回值越大则表示模型越好
0条评论