一、聚类简要介绍
1.聚类概念
聚类就是按照某一个标准(如距离原则)把一个数据集分成不同的类或簇,使得同一类间的数据对象相似性较大,不同类间的数据对象差异性较大。
2.聚类与分类
聚类属于无监督学习;
分类属于监督学习。
3.衡量聚类算法优劣的标准
1.算法的处理能力:处理大型数据集的能力;处理数据噪声的能力;处理任意形状,包括有间隙的嵌套的数据的能力;
2.算法的输入属性:算法的处理结果是否与数据输入的顺序有关;对数据维数是否敏感;对数据类型的要求;
3.算法是否需要预设条件:是否需要预先知道聚类个数;是否需要用户给出领域知识。
4.聚类算法有哪些
基于划分的聚类方法;基于层次的聚类方法;基于密度的聚类方法;(本文主要介绍)
基于网络的聚类方法;基于模型的聚类方法;基于模糊的聚类方法;
其他聚类方法(基于约束、基于粒度、谱聚类、核聚类、量子聚类)
二、各种聚类算法及其sklearn介绍
1.基于划分的聚类方法
1.1基本思想
目标·:同一类别内的点都足够近,不同类别间的点距离足够远。
首先确定要将散点分为几类,然后挑选几个点作为聚类中心,依据预先定好的启发式算法进行迭代。这一类的聚类方法主要包括k-means算法及其变体包括k-medoids、k-modes、k-medians、kernel k-means等。
1.2算法流程
以经典k-means为例:
1.随机选取k个对象,每个对象初始代表了一个簇的中心;
2.对剩余的每个对象,根据其与各簇中心的距离,将其赋给最近的簇;
3.重新计算每个簇的平均值,更新为簇的中心;
4.重复2/3直至收敛。
1.3优缺点
优点:对于大型数据集也简单高效、时间复杂度、空间复杂度都较低;
缺点:数据集大时容易陷入局部最优;需要预先设定K值,对先选取的K个点很敏感;对噪声和离群值很敏感;值适用于numerical数据;不能解决非凸(non-convex)数据。
1.4常见算法及改进
k-means对初始值的设置很敏感,所以有了k-means++、intelligent k-means、genetic k-means。
k-means对噪声和离群值非常敏感,所以有了k-medoids和k-medians。
k-means只用于numerical类型数据,不适用于categorical类型数据,所以k-modes。
k-means不能解决非凸(non-convex)数据,所以有了kernel k-means。
另外,很多教程都告诉我们Partition-based methods聚类多适用于中等体量的数据集,但我们也不知道“中等”到底有多“中”,所以不妨理解成,数据集越大,越有可能陷入局部最小。下图显示的就是面对非凸,k-means和kernel k-means的不同效果。
1.5k-means的sklearn相关介绍
1.5.1参数:
class sklearn.cluster.KMeans
(n_clusters=8, init='k-means++', n_init=10, max_iter=300,
tol=0.0001, precompute_distances='auto', verbose=0,
random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
n_clusters | 质心/分簇数量,默认为8 |
init | ‘random’:随机选取 |
‘k-means++’:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心,但在选取第一个聚类中心(n=1)时同样通过随机的方法,之所以这样做是因为聚类中心互相离得越远越好。 | |
ndarray:形如 (n_clusters, n_features) 并给出初始质心 | |
n_init | 使用不同的初始化质心运行算法的次数,默认是10 |
max_iter | 最大迭代次数。默认值=300 。如果数据集不是凸集,可能很难收敛,此时可以通过指定最大的迭代次数让算法可以及时退出循环。 |
tol | 误差容忍度最小值。 |
precompute_distances | 是否需要提前计算距离,auto ,True ,False 三个参数值可选。默认值是auto ,如果选择auto ,当样本数*质心数>12兆的时候,就不会提前进行计算,如果小于则会与提前计算。提前计算距离会让聚类速度很快,但是也会消耗很多内存。 |
copy_x | 主要起作用于提前计算距离的情况,默认值是True,如果是True,则表示在源数据的副本上提前计算距离时,不会修改源数据。 |
algorithm | 优化算法的选择,有auto、full和elkan三种选择。full就是一般意义上的K-Means算法,elkan是使用的elkan K-Means算法(利用三角形两边之和大于第三边的原理改进了代码)。 默认的auto则会根据数据值是否是稀疏的(稀疏一般指是有大量缺失值),来决定如何选择full和elkan。 如果数据是稠密的,就选择elkan K-means,否则就使用普通的Kmeans算法。 |
1.5.2重要属性
labels_ | 查看聚好的类别,每个样本所对应的类 |
cluster_centers_ | 查看质心 |
intertia_ | 查看总距离平方和 |
详细说明见:sklearn.cluster.KMeans — scikit-learn 1.4.2 documentation
1.5.3常用评估指标
当我们选择分类的簇数值越大时,我们的总距离平方和是越来越小,但事实上我们不能分类无穷多簇。轮廓系数是最常用的聚类算法的评价指标。
轮廓系数:
它是对每个样本来定义的,它能够同时衡量:
1.样本与其自身所在的簇中的其他样本的相似度 a,等于样本与同一簇中所有其他点之间的平均距离;
2.样本与其他簇中的样本的相似度 b,等于样本与下一个最近的簇中的所有点之间的平均距离。
根据聚类的要求”簇内差异小,簇外差异大“,我们希望 b 永远大于 a,并且大得越多越好。单个样本的轮廓系数计算为:
这个公式可以解析为:
不难发现轮廓系数范围是(-1, 1):
轮廓系数越接近 1:样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似。
轮廓系数为 0 时:两个簇中的样本相似度一致,两个簇本应该是一个簇。
轮廓系数为负时:样本点与簇外的样本更相似。
在 sklearn 中,我们使用模块 metrics 中的类 silhouette_score 来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。但我们还有同在 metrics 模块中的silhouette_sample,它的参数与轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数。
2.基于层次的聚类方法
2.1基本思想
主要有两种类型:合并的层次聚类和分裂的层次聚类。
合并的层次聚类:自底向上的层次聚类算法,从最底层开始,每一次通过合并最相似的聚类来形成上一层次的聚类,整个当全部数据点都合并到一个类别而停止。大部分层次聚类采用这种方法。
分裂的层次聚类:自顶向下的方法,从一个包含全部点的聚类开始,逐渐往下分裂。
2.2算法流程
以自底向上为例。
1.将每个对象看成一类,计算两两之间的距离;
2.将距离最小的两类合并为一类;
3.重新计算新类与所有类之间的距离;
4.重复2/3,直到合并为一类。
2.3优缺点
优点:可解释性好;适用于任意形状的聚类;对样本的输入顺序不敏感。
缺点:时间复杂度高;不可逆性,聚类一旦形成无法改变。
2.4常见算法及改进
该聚类算法因为计算复杂度比较大适用于小数量级,如对中国省会城市聚类。改进的算法有BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies)主要是在数据体量很大的时候使用,而且数据类型是numerical。
Chameleon(A Hierarchical Clustering Algorithm Using Dynamic Modeling)里用到的linkage是kNN(k-nearest-neighbor)算法,并以此构建一个graph,Chameleon的聚类效果被认为非常强大,比BIRCH好用,但运算复杂还是很高,O(n^2)。看个Chameleon的聚类效果图,其中一个颜色代表一类,可以看出来是可以处理非常复杂的形状的。
2.5sklearn相关介绍
2.5.1参数
AgglomerativeClustering
是合并的聚类方法。
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, *,
metric='euclidean', memory=None, connectivity=None, compute_full_tree='auto',
linkage='ward', distance_threshold=None, compute_distances=False)
n_clusters | 聚类数,默认为2 |
metric | “euclidean”, “l1”, “l2”, “manhattan”, “cosine”, or “precomputed” 如果链接是“ward”,则只接受“euclidean”。如果是“precomputed”,则需要距离矩阵作为拟合方法的输入。 |
linkage | “ward”将要合并的集群的方差降至最低。 average”使用两个集合中每个观测值的距离的平均值。 “complete”使用两个集合的所有观测值之间的最大距离。 “single”使用两个集合的所有观测值之间的最小距离。 |
3.基于密度的聚类方法
2.1基本思想
基于密度的方法:k-means解决不了不规则形状的聚类。于是就有了Density-based methods来系统解决这个问题。该方法同时也对噪声数据的处理比较好。其原理简单说画圈儿,其中要定义两个参数,一个是圈儿的最大半径,一个是一个圈儿里最少应容纳几个点。只要邻近区域的密度(对象或数据点的数目)超过某个阈值,就继续聚类,最后在一个圈里的,就是一个类。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)就是其中的典型。
2.2算法流程
DBSCAN的算法步骤分成两步。
1,寻找核心点形成临时聚类簇。
扫描全部样本点,如果某个样本点R半径范围内点数目>=MinPoints,则将其纳入核心点列表,并将其密度直达的点形成对应的临时聚类簇。
2,合并临时聚类簇得到聚类簇。
对于每一个临时聚类簇,检查其中的点是否为核心点,如果是,将该点对应的临时聚类簇和当前临时聚类簇合并,得到新的临时聚类簇。
重复此操作,直到当前临时聚类簇中的每一个点要么不在核心点列表,要么其密度直达的点都已经在该临时聚类簇,该临时聚类簇升级成为聚类簇。
继续对剩余的临时聚类簇进行相同的合并操作,直到全部临时聚类簇被处理。
2.3优缺点
优点:对噪声不敏感;能发现任意形状的聚类。
缺点:聚类的结果与参数有很大的关系;DBSCAN用固定参数识别聚类,但当聚类的稀疏程度不同时,相同的判定标准可能会破坏聚类的自然结构,即较稀的聚类会被划分为多个类或密度较大且离得较近的类会被合并成一个聚类。
2.4sklearn相关介绍
参数:
class sklearn.cluster.DBSCAN(
eps=0.5,
*,
min_samples=5,
metric='euclidean',
metric_params=None,
algorithm='auto',
leaf_size=30,
p=None,
n_jobs=None
)
eps | 邻域的距离阈值,默认为0.5 |
min_samples | 样本点要成为核心对象所需要的邻域的样本数阈值,默认5 |
metric | 度量方式,默认为欧式距离,可以使用的距离度量参数有’euclidean’/‘manhattan’/‘chebyshev’/‘minkowski’/‘wminkowski’/‘seuclidean’/‘mahalanobis’ |
详细说明见:sklearn.cluster.DBSCAN — scikit-learn 1.4.2 documentation
三、参考资料
各种聚类算法的介绍和比较_k-means对初始值的设置很敏感,所以有了k-means++、intelligent k-mean-CSDN博客
一文带你用Python玩转K-Means算法 ;各种参数详细说明;如何评估无监督模型?_python kmeans参数-CSDN博客