聚类算法在sklearn中有两种表现形式:
- 类(和我们之前学过的分类算法以及数据预处理方法一样)
需要实例化,训练并使用接口和属性来调用结果
- 函数(function)
只需要输入特征矩阵和超参数,即可返回聚类的结果和各种指标
注意:该模块中实现的算法可以采用不同类型的矩阵作为输入
- 所有方法都接受形状
[n_samples,n_features]
的标准特征矩阵
这些可以从sklearn.feature_extraction
模块中的类中获得
- 对于亲和力传播,光谱聚类和DBSCAN 还可以输入形状
[n_samples, n_samples]
的相似性矩阵
可以使用sklearn.metrics.pairwise
模块中的函数来获取相似性矩阵
=========================================================================
作为聚类算法的典型代表,KMeans可以说是最简单的聚类算法没有之一,那它是怎么完成聚类的呢?
关键概念:簇与质心
KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类;簇就是聚类的结果表现。
簇中所有数据的均值 μ \mu μ通常被称为这个簇的质心(centroids)。在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。
在KMeans算法中,簇的个数K是一个超参数,需要我们人为输入来确定。KMeans的核心任务就是根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。具体过程可以总结如下:
| 顺序 | 过程 |
| — | — |
| 1 | 随机抽取K个样本作为最初的质心 |
| 2 | 开始循环: |
| 2.1 | 将每个样本点分配到离他们最近的质心,生成K个簇 |
| 2.2 | 对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心 |
| 3 | 当质心的位置不再发生变化,迭代停止,聚类完成 |
什么情况下,质心的位置会不再变化呢?
- 当我们找到一个质心,在每次迭代中被分配到这个质心上的样本都是一致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了。
这个过程在可以由下图来显示,我们规定将数据分为4(K=4),其中白色X代表质心的位置:
可以看见,第六次迭代之后,基本上质心的位置就不再改变了,生成的簇也变得稳定。此时我们的聚类就完成了,我们可以明显看出,KMeans按照数据的分布,将数据聚集成了我们规定的4类,接下来我们就可以按照我们的业务需求或者算法需求,对这四类数据进行不同的处理。
聚类算法聚出的类有什么含义呢?这些类有什么样的性质?
我们认为,被分在同一个簇中的数据是有相似性的,而不同簇中的数据是不同的,当聚类完毕之后,我们就要分别去研究每个簇中的样本都有什么样的性质,从而根据业务需求制定不同的商业或者科技策略。
这个听上去和评分卡案例中讲解的“分箱”概念有些类似,即我们分箱的目的是希望:一个箱内的人有着相似的信用风险,而不同箱的人的信用风险差异巨大,以此来区别不同信用度的人,因此我们追求“组内差异小,组间差异大”。
聚类算法也是同样的目的,我们追求“