概述

聚类算法是无监督学习的代表算法之一,也叫“无监督分类”。目的是将数据分为若干有意义或有用的组,通常根据实际需求来进行划分。聚类可以用于降维和矢量量化(vectorquantization),可以将高维特征压缩到一列当中,常常用于图像,声音,视频等非结构化数据,可以大幅度压缩数据量。核心是将数据分为多个组,探索每个组的数据是否有联系。

KMeans的工作原理
簇与质心

KMeans将数据划分称若干个无交集的簇,每个簇就是一个一组聚集在一起的数据集,在一个簇中的数据视为同一类,簇是聚类的结果体现。
质心就是每个簇中所有数据的平均值。
KMeans的工作流程如下:
1)随机取K个样本作为最初的质心;
2)将每个样本分配到离它最近的质心,得到K个簇;
3)对于得到的簇计算新的质心作为下一轮迭代的质心;
4)重复操作直到质心不再改变。

簇内样本平方和

我们认为分到同一个簇中的数据具有相似性,聚类追求的就是簇内差异小,簇间差异大。这个差异由样本点到簇质心的距离来衡量。

对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为簇中的样本越相似,簇内的差异越小。而衡量距离主要有以下几种方法:

高维数据 Kmeans聚类绘制 python kmeans用于高维聚类_sklearn


采用欧几里得距离时,一个簇中所有样本点到质心的距离的平方和为:

高维数据 Kmeans聚类绘制 python kmeans用于高维聚类_聚类_02


其中j为样本的编号,m就为簇中样本的数量,这个公式就是簇内平方和,又叫Inertia。整个数据集的簇内平方和相加就得到了整体平方和,整体平方和越小,聚类效果就越好。所以KMeans追求的就是使簇内平方和最小的质心。

对于三个距离,对应的质心和inertia不同:

距离度量

质心

Inertia

欧几里得距离

均值

最小化每个样本点到质心的欧氏距离之和

曼哈顿距离

中位数

最小化每个样本点到质心的曼哈顿距离之和

余弦距离

均值

最小化每个样本点到质心的余弦距离之和

sklearn中的KMeans

sklearn.cluster.KMeans

  • 参数n_clusters
    告诉模型要分几类,默认是8类。
  • 属性labels_,查看聚好的类别,每个样本属于哪个类,等同于fit_predict(X)
  • 属性cluster_centers_,查看每个类别的质心
  • 属性inertia_,返回总距离的平方和
聚类算法的模型评估指标

聚类算法的目标是簇内差异小,簇间差异大。首先上面的inertia可以作为衡量的一个指标,但是存在一定的局限性,当一个样本被划分为越多的簇时,inertia可能越来越小,就不能准确的评估模型的优劣。同时,Inertia对数据的分布有假设,它假设数据满足凸分布(即数据在二维平面图像上看起来是一个凸函数的样子),并且它假设数据是各向同性的(isotropic),即是说数据的属性在不同方向上代表着相同的含义。但是现实中的数据往往不是这样。所以使用Inertia作为评估指标,会让聚类算法在一些细长簇,环形簇,或者不规则形状的流形时表现不佳。

当数据有标签时,如果采用聚类算法,可以用以下几种方法来评估:

高维数据 Kmeans聚类绘制 python kmeans用于高维聚类_sklearn_03


当样本标签未知时,可以采用轮廓系数来评估。

轮廓系数同时衡量了样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离

单个样本的轮廓系数计算公式是:高维数据 Kmeans聚类绘制 python kmeans用于高维聚类_聚类算法_04,其取值范围是(-1,1).其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数是0时就说明两个样本的相似度一致,两个样本就是一个簇了。

在sklearn中,我们使用模块metrics中的类silhouette_score来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。但我们还有同在metrics模块中的silhouette_sample,它的参数与轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数。传入参数为样本数据和训练后每个样本对应的簇。