常见聚类算法
参考:
- https://blog.csdn.net/weixin_47547146/article/details/118680875
- https://zhuanlan.zhihu.com/p/104355127
- https://www.jianshu.com/p/19976de06ac7
- https://zhuanlan.zhihu.com/p/401173177
聚类概述
聚类的含义?
将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”。
在无监督学习中,目标通过对无标记数据训练样本的学习来揭示数据内在的性质规律,将数据集中的样本划分为多个不相交的子集,为数据进一步分析提供基础。
距离的度量
聚类模型评价指标
简单来说就是“簇间相似度高,簇内相似度低的时候效果最好”。
1. 误差平方和SSE
误差平方和(Sum of the Squared Error, SSE),也被称为组内误差平方和,它是机器学习中很重要的概念,该概念是在聚类和回归类算法中均有广泛应用。在聚类算法中所谓误差平方和是指每个数据点的误差,即它到最所属类别质心的欧几里得距离,然后求和汇总即得误差平方和。在聚类算法中,SSE是我们判断模型是否最优的重要指标,我们希望求得的模型是在给定K值的情况下SSE最小的模型,即在相同的K值情况下聚类模型SSE越小越好,这也是聚类算法最核心的优化条件。
2. 轮廓系数
除了误差平方和SSE,轮廓系数(Silhouette Coefficient),也是聚类效果好坏的一种评价方式。它结合凝聚度和分离度两种因素。对于基于原型的簇,簇的凝聚度可以定义为关于簇原型(质心或中心点)的邻近度的和。同理,两个簇之间的分离度可以用两个簇原型的邻近性度量。如下图所示,其中簇的质心用"+"标记。
轮廓系数适用于实际类别信息未知的情况。对于单个样本,设a是与它同类别中其他样本的平均距离,b是与它距离最近不同类别中样本的平均距离,其轮廓系数为:
3. Calinski-Harabaz Index
在真实的分群label不知道的情况下,Calinski-Harabasz可以作为评估模型的一个指标。
Calinski-Harabasz指标通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。(越大越好)。
其中m为训练样本数,k是类别个数,是类别之间协方差矩阵,是类别内部数据协方差矩阵,tr为矩阵的迹。
4. Davies-Bouldin Index(戴维森堡丁指数)
DB计算任意两类别的类内距离平均距离(CP)之和除以两聚类中心距离求最大值。DB越小意味着类内距离越小同时类间距离越大。(越小越好)。
聚类相似度
除了需要衡量对象之间的距离之外,有些聚类算法(如层次聚类)还需要衡量cluster之间的距离 ,假设
和 为两个 cluster,则前四种方法定义的 和 之间的距离如下表所示。
聚类方法
原型聚类
k-means
经典的k-means算法的流程如下:
一般来说,经典k-means算法有以下几个特点:
- 需要提前确定值
- 对初始质心点敏感
- 对异常数据敏感
k-means++
k-means++
是针对k-means
中初始质心点选取的优化算法。该算法的流程和k-means
类似,改变的地方只有初始质心的选取,该部分的算法流程如下:
bi-kmeans
bi-kmeans是针对kmeans算法会陷入局部最优的缺陷进行的改进算法。该算法基于SSE最小化的原理,首先将所有的数据点视为一个簇,然后将该簇一分为二,之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否能最大程度的降低SSE的值。
学习向量化(LVQ)
LVQ带有类标记,采用迭代优化。
样本集D,学习效率m,初始化原型向量p并设置其标记。
- 从样本集中随机选取样本。
- 计算样本与p向量的距离
- 找出与x距离最近的原型向量。
- 判断X的标记和p的标记是否相等
- 相等则以m为学习效率向p靠近
- 不相等则以m为学习效率远离p
- 迭代该过程
密度聚类
DBSCAN
DBSCAN 算法有两个参数:半径 eps 和密度阈值 MinPts,具体步骤为:
- 以每一个数据点 xi 为圆心,以 eps 为半径画一个圆圈。这个圆圈被称为 xi 的 eps 邻域
- 对这个圆圈内包含的点进行计数。如果一个圆圈里面的点的数目超过了密度阈值 MinPts,那么将该圆圈的圆心记为核心点,又称核心对象。如果某个点的 eps 邻域内点的个数小于密度阈值但是落在核心点的邻域内,则称该点为边界点。既不是核心点也不是边界点的点,就是噪声点。
- 核心点 xi 的 eps 邻域内的所有的点,都是 xi 的直接密度直达。如果 xj 由 xi 密度直达,xk 由 xj 密度直达。。。xn 由 xk 密度直达,那么,xn 由 xi 密度可达。这个性质说明了由密度直达的传递性,可以推导出密度可达。
- 如果对于 xk,使 xi 和 xj 都可以由 xk 密度可达,那么,就称 xi 和 xj 密度相连。将密度相连的点连接在一起,就形成了我们的聚类簇。
OPTICS
OPTICS(Ordering Points To Identify the Clustering Structure, OPTICS)实际上是DBSCAN算法的一种有效扩展,主要解决对输入参数敏感的问题。即选取有限个邻域参数 进行聚类,这样就能得到不同邻域参数下的聚类结果。
算法流程如下:
其中有个很重要的insert_list
,流程如下:
层次聚类
在聚类算法中,分为2类:一种是自底向上凝聚,一种自上向下分散。如下图:
Agglomerative
Agglomerative(AGNES)层次聚类又称自底向上(bottom-up)的层次聚类,每一个对象最开始都是一个 cluster,每次按一定的准则将最相近的两个 cluster 合并生成一个新的 cluster,如此往复,直至最终所有的对象都属于一个 cluster。
如果簇C1中的一个对象和簇C2中的一个对象之间的距离是所有属于不同簇的对象间欧式距离中最小的,C1和C2可能被合并。这是一种单连接方法,其每个簇可以被簇中的所有对象代表,两个簇之间的相似度由这两个簇中距离最近的数据点对的相似度来确定。
给定数据集 ,Agglomerative层次聚类最简单的实现方法分为以下几步:
Divisive
又称自顶向下(top-down)的层次聚类,最开始所有的对象均属于一个 cluster,每次按一定的准则将某个 cluster 划分为多个 cluster,如此往复,直至每个对象均是一个 cluster。
网格聚类
算法思想
这类方法的原理就是将数据空间划分为网格单元,将数据对象集映射到网格单元中,并计算每个单元的密度。根据预设的阈值判断每个网格单元是否为高密度单元,由邻近的稠密单元组形成”类“。
算法步骤
- 划分网格
- 使用网格单元内数据的统计信息对数据进行压缩表达
- 基于这些统计信息判断高密度网格单元
- 最后将相连的高密度网格单元识别为簇
模型聚类
高斯混合聚类(EM)
参考:https://blog.csdn.net/lotusng/article/details/79990724
- 首先,假设样本集具有一些规律,包括可以以α参数作为比例分为k类且每类内符合高斯分布。
- 然后,根据贝叶斯原理利用极大似然法同时求出决定分类比例的α和决定类内高斯分布的μ、Σ。
- 最后,将样本根据α、μ、Σ通过贝叶斯原理求出样本该分在哪个簇。
谱聚类
参考:https://www.cnblogs.com/pinard/p/6221564.html
输入:样本集D=(x1,x2,…,xn),相似矩阵的生成方式, 降维后的维度k1, 聚类方法,聚类后的维度k2
输出: 簇划分C(c1,c2,…ck2).
算法流程:
- 根据输入的相似矩阵的生成方式构建样本的相似矩阵S
- 根据相似矩阵S构建邻接矩阵W,构建度矩阵D
- 计算出拉普拉斯矩阵L
- 构建标准化后的拉普拉斯矩阵D−1/2LD−1/2
- 计算D−1/2LD−1/2最小的k1个特征值所各自对应的特征向量f
- 将各自对应的特征向量f组成的矩阵按行标准化,最终组成n×k1维的特征矩阵F
- 对F中的每一行作为一个k1维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为k2。
- 得到簇划分C(c1,c2,…ck2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-07-09 两种语言实现设计模式(C++和Java)(十:外观模式)