聚类及其常见算法 | Clustering
什么是聚类
k-means算法
主要思想
在给定值和个初始类簇中心点的情况下,把每个点分配到离其最近的类簇中心点所代表的类簇中。所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
基本原理
假定给定数据样本,包含了个对象,其中每个对象都是具有个维度属性的数据(向量)。算法的目标是将个对象依据对象间的相似性聚集到指定的个类簇中,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中。首先需要初始化个聚类中心:
然后通过计算第个对象到第个聚类中心的欧式距离:
从而得到应当归类的类簇标记:
根据标记将划分到中的中。
依次比较每一个点到每一个聚类中心的距离,从而分配对象后,完成一次迭代。
接下来根据每个类簇中被划分的点重新更新聚类中心:
式中,为属于类簇的对象个数。
于是可以总结得到算法的伪代码如下:

分析得到:
时间复杂度,为迭代次数
空间复杂度.
Python API
1 | # 从sklearn库中导入cluster中的kmeans |
层次聚类
层次聚类(Hierarchical Clustering)是通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树从而实现聚类目标的算法。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。
层次聚类算法相比划分聚类算法的优点之一是可以在不同的尺度上(层次)展示数据集的聚类情况,这来源于其算法思想。该算法对数据集的划分可分为自底向上和自顶向下的两种分拆策略。
AGNES
AGNES是一种采用自底向上聚合策略的层次聚类算法。它先将数据集中的每个对象看作一个初始聚类簇,即,然后在算法的每一步中找出距离最近的两个聚类簇和,将其进行合并。不断重复,直至达到预设的聚类簇个数。
其中在合并时选择的用于度量的 距离 有如下选择:
选择不同的度量距离,对应着不同的聚类结果,对此有着如下的定义:
Single Linkage:取计算。
这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。
Complete Linkage:取计算。
Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。
Average Linkage:取计算。
这种方法计算量比较大,但结果比前两种方法更合理。
AGNES算法伪代码如下:

DIANA
DIANA是一种采用自顶向下分裂策略的层次聚类算法。
Python API
1 | from sklearn.cluster import AgglomerativeClustering |
主要参数
n_clusters:聚类的个数,即affinity:计算距离的方法- “
euclidean”(即 “l2”,欧氏距离) - “
manhattan”(即 “l1”,曼哈顿距离,有利于稀疏特征或稀疏噪声,例如文本挖掘中使用稀有词的出现作为特征时,会出现许多 0) - “
cosine”(余弦距离) - “
precomputed”(预先计算的 affinity matrix) - 如果
linkage = "ward",只能选择 “euclidean”,选择度量标准的方针是使得不同类样本之间距离最大化,并且最小化同类样本之间的距离
- “
memory:None,strorobject with the joblib如果给定一个地址,可以将层次聚类的树形图缓存到相应地址
linkage:指定层次聚类判断相似度的方法,有以下三种:ward:组间距离等于两类对象之间的最小距离。(即single-linkage聚类)average:组间距离等于两组对象之间的平均距离。(average-linkage聚类)complete:组间距离等于两组对象之间的最大距离。(complete-linkage聚类)
主要属性
labels_: 每个数据的分类标签n_leaves_:分层树的叶节点数量n_components:连接图中连通分量的估计值children:一个数组,给出了每个非节点数量
DBSCAN 算法
Python API
1 | from sklearn.cluster import DBSCAN |
OPTICS 算法
谱聚类
模糊C均值聚类
软聚类,待更
模糊C均值聚类(Fuzzy C-means)算法(FCM)_模糊c均值聚类算法-CSDN博客
Python API
1 | # !pip install -U scikit-fuzzy |
c 为所需要聚类的个数, data为用于训练的数据。
注意! 参数data的
参数
data:训练数据,shape是(num_features, num_samples),与其他很多API的shape相反!所以传入时需要取转置。c:需要指定的聚类个数。m:隶属度指数,是一个加权指数,一般为2 。error:当隶属度的变化小于此则提前结束迭代。maxiter:最大迭代次数。
返回值
cntr:聚类中心u:最后的隶属度矩阵u0:初始化的隶属度矩阵d:是一个矩阵,记录每一个点到聚类中心的欧式距离jm:是目标函数的优化历史p:p是迭代的次数fpc:全称是fuzzy partition coefficient, 是一个评价分类好坏的指标,它的范围是0到1, 1表示效果最好,可以通过它来选择聚类的个数。
特殊数据的聚类
离散数据
K-modes 算法
K-prototypes 算法
时间序列数据
K-shape
DTW
评估指标
轮廓系数、方差比、DB指数(三种常见的聚类内部评价指标) - 知乎 (zhihu.com)



