常见聚类算法总结
1.常见算法
1.原型聚类
“原型”是指样本空间中具有代表性的店。此类算法假设聚类结构能够通过一组原型刻画,通常情形下,算法先对原型进行初始化,然后对原型进行迭代更新求解。–西瓜书
(1).K均值聚类(K-Means)
给定样本集D={x1,x2,..xn},K均值算法针对聚类所得簇划分C={C1,C2,..CK}最小化平方误差,采用的贪心算法来迭代优化求解近似解。
在基本术语中,算法有三个步骤。第一步选择初始质心,最基本的方法是ķ从数据集中选择样本 X。初始化之后,K-means包括在其他两个步骤之间循环。第一步将每个样品分配到最近的质心。第二步通过获取分配给每个先前质心的所有样本的平均值来创建新质心。计算旧的和新的质心之间的差异,并且算法重复这最后两个步骤,直到该值小于阈值。换句话说,它重复直到质心不显着移动。
sklearn的实现:
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
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:簇的个数,即你想聚成几类
init: 初始簇中心的获取方法
n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果。
max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
random_state: 随机生成簇中心的状态条件。
copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_jobs: 并行设置
algorithm: kmeans的实现算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式实现
优点
原理比较简单,实现也是很容易,收敛速度快。
算法的可解释度比较强。
主要需要调参的参数仅仅是簇数k。
缺点、
需要事先确定分类的簇数,即k值。
采用迭代方法,得到的结果只是局部最优。
对初始值的选取比较敏感。(改进1:k-means++(sklearn已经添加该参数的取值);改进2:二分K-means)
当数据量非常大时,算法的时间开销是非常大的(改进:Mini Batch K-Means(精确度会降低,在可接受的范围即可));
若簇中含有异常点,将导致均值偏离严重,对噪声和孤立点数据敏感(改进1:离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响;改进2:改成求点的中位数,这种聚类方式即K-Mediods聚类(K中值));
对于不是凸的数据集比较难收敛(改进:基于密度的聚类算法更加适合,比如DESCAN算法)
(2).学习向量化(LVQ)
假设数据样本带有类别标记,利用这些监督信息来辅助聚类。
(3).高斯混合聚类
与k均值采用原型向量来刻画聚类结构不同的是,高斯混合聚类采用的概率模型来表达聚类原型。–西瓜书
用k-means算法解决聚类问题非常简单,将数据聚为一个一个的点,但这样往往比较粗糙,不适用于很多数据集。所以是采用概率模型来表达原型,即通过统计得到每个样本点属于各个类的概率,而不是判定它完全属于一个类,所以有时也会被称为软聚类。从贝叶斯我们可以看出,给出一个概率来估计比直接得出一个结果要好得多。利用高斯分布函数估计出概率值。
自己理解:
一堆数据,先初始化几个高斯分布,然后根据贝叶斯的后验定理计算每个数据属于该簇的概率,然后将该数据点划分到该簇。一轮之后,重新根据属于该簇的点计算高斯分布,在计算概(E操作)率,重复操作,直到点的聚类信息不再发生变化。(M操作的)
2. 密度聚类
基于密度的聚类假设聚类结构能通过样本分布的紧密程度确定,通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本的不断扩展聚类粗以获得最终的聚类结果。–西瓜书
这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。
(1).DBSCAN
DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵ描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。
假设我的样本集是D=(x1,x2,…,xm),则DBSCAN具体的密度描述定义如下:
1) ϵ-邻域:对于xj∈D,其ϵ-邻域包含样本集D中与xj的距离不大于ϵ的子样本集,即Nϵ(xj)={xi∈D|distance(xi,xj)≤ϵ}, 这个子样本集的个数记为|Nϵ(xj)|
2) 核心对象:对于任一样本xj∈D,如果其ϵ-邻域对应的Nϵ(xj)至少包含MinPts个样本,即如果|Nϵ(xj)|≥MinPts,则xj是核心对象。
3)密度直达:如果xi位于xj的ϵ-邻域中,且xj是核心对象,则称xi由xj密度直达。注意反之不一定成立,即此时不能说xj由xi密度直达, 除非且xi也是核心对象。
4)密度可达:对于xi和xj,如果存在样本样本序列p1,p2,…,pT,满足p1=xi,pT=xj, 且pt+1由pt密度直达,则称xj由xi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本p1,p2,…,pT−1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。
5)密度相连:对于xi和xj,如果存在核心对象样本xk,使xi和xj均由xk密度可达,则称xi和xj密度相连。注意密度相连关系是满足对称性的。
DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。
这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的ϵ-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的ϵ-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的ϵ-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。
那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。
自己理解:
给定一个半径长度r和一个最小点的数目m,然后以某个点为圆心,r为半径,如果在该圆内的点的数目大于m值,则把该点标记为中心点,如果数目小于m值,则被标记为噪声点。重复该步骤,如果一个噪声点存在于某个中心点的圆内,则标记该点为边缘点。直到所有点都被标记了,然后连接在一个圆内中心点以及每个中心点的边缘点组成一个簇。
算法实现流程:
sklearn实现:
DBSCAN算法是确定性的,当以相同的顺序给出相同的数据时,总是生成相同的簇。但是,当以不同顺序提供数据时,结果可能不同。
class sklearn.cluster.DBSCAN(eps=0.5,
min_samples=5,
metric=’euclidean’,
metric_params=None,
algorithm=’auto’,
leaf_size=30,
p=None,
n_jobs=1)
eps:两个样本之间的最大距离,以便将它们视为在同一邻域中。
min_samples:对于要被视为核心点的点,邻域中的样本数(或总权重)。这包括点本身。
metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离
algorithm:最近邻搜索算法参数(暴力实现,kd数,球树实现)
时间复杂度:
(1)DBSCAN的基本时间复杂度是 O(N*找出Eps领域中的点所需要的时间), N是点的个数。最坏情况下时间复杂度是O(N2)
(2)在低维空间数据中,有一些数据结构如KD树,使得可以有效的检索特定点给定距离内的所有点,时间复杂度可以降低到O(NlogN)
空间复杂度:低维和高维数据中,其空间都是O(N),对于每个点它只需要维持少量数据,即簇标号和每个点的标识(核心点或边界点或噪音点)
DBSCAN小结
和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH算法类似。
那么我们什么时候需要用DBSCAN来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。
下面对DBSCAN算法的优缺点做一个总结。
优点:
1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
缺点:
1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。
(1).Mean-Shift
Mean shift 算法是基于核密度估计的爬山算法
(Meanshift算法实际是一个自适应的梯度上升搜索峰值的算法)
自己理解:
对于样本点,给定一个半径r,首先随机选择一个样本,计算以这个点为圆心,落在r为半径的圆内的样本点,然后计算这些样本点到圆心的向量和,该向量和为一个均值偏移,圆心加上这个向量和更新为新的圆心,即圆朝着这个均值方向进行移动。重复该步骤,直到圆心不在移动,标记为一类。如果新类和已有类的中心距离小于半径,则合并。重复操作,直到每个点都被标记,最后把该点归为被某个簇标记次数最多的类。
假设在一个多维空间中有很多数据点需要进行聚类,Mean Shift的过程如下:
1、在未被标记的数据点中随机选择一个点作为中心center;
2、找出离center距离在bandwidth之内的所有点,记做集合M,认为这些点属于簇c。同时,把这些求内点属于这个类的概率加1,这个参数将用于最后步骤的分类
3、以center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加,得到向量shift。
4、center = center+shift。即center沿着shift的方向移动,移动距离是||shift||。
5、重复步骤2、3、4,直到shift的大小很小(就是迭代到收敛),记住此时的center。注意,这个迭代过程中遇到的点都应该归类到簇c。
6、如果收敛时当前簇c的center与其它已经存在的簇c2中心的距离小于阈值,那么把c2和c合并。否则,把c作为新的聚类,增加1类。
6、重复1、2、3、4、5直到所有的点都被标记访问。
7、分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。
简单的说,mean shift就是沿着密度上升的方向寻找同属一个簇的数据点。
加入核函数的漂移向量
核函数的作用,就是把一个高维空间映射到一个低维空间,使之线性可分。
给向量加上了一个权重?
Mean-Shift小结
meanshift方法适合概率密度函数有极值且在某一局部区域内唯一,即选择的特征数据点能够较为明显的判定目标,亦即显著特征点。meanshift的基本形式不适合等概率特征点,即特征点是均匀分布的情况。
优点:
1.不用事先确定分类的个数
2.计算较为简便,对数据中的异常点不敏感。
3.适用于追踪或者图像分割
缺点:
1.受初始值影响较大
2.算法收敛的速度和程度,很大程度上和选取的窗口有关
sklearn实现:
class sklearn.cluster.MeanShift(bandwidth=None,
seeds=None,
bin_seeding=False,
min_bin_freq=1,
cluster_all=True,
n_jobs=1)[source]
3.层次聚类
层次聚类试图在不同的层次上对数据集记性划分,从而形成树形的聚类结构。–西瓜书
(1).AGNES
是一种自底向上聚合策略的层次聚类算法。他先将数据集中的每个样本看做是一个厨师聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并。该过程不断重复,直至达到预设的聚类簇个数。
如何计算簇之间的距离。实际上每个簇是一个样本集合,因此采用关于聚合的某种距离即可。
单链接算法:(最小距离)两个簇中距离最近的样本的距离
全链接算法:(最大距离)两个簇中距离最远的样本的距离
均链接算法:(平均距离)两个簇中每两个样本之间的距离相加求平均的距离
算法流程:
优点:
1,距离和规则的相似度容易定义,限制少;
2,不需要预先制定聚类数;
3,可以发现类的层次关系;
4,可以聚类成其它形状
缺点:
1,计算复杂度太高;
2,奇异值也能产生很大影响;
3,算法很可能聚类成链状
(2).BIRCH
BIRCH算法比较适合于数据量大,类别数K也比较多的情况。它运行速度很快,只需要单遍扫描数据集就能进行聚类。BIRCH算法是个树形结构,这颗树的每一个节点是由若干个聚类特征(Clustering Feature,简称CF)组成。一个聚类特征CF是这样定义的:每一个CF是一个三元组,可以用(N,LS,SS)表示。其中N代表了这个CF中拥有的样本点的数量,这个好理解;LS代表了这个CF中拥有的样本点各特征维度的和向量,SS代表了这个CF中拥有的样本点各特征维度的平方和。
CF有一个很好的性质,就是满足线性关系,也就是CF1+CF2=(N1+N2,LS1+LS2,SS1+SS2)。如果把这个性质放在CF Tree上,也就是说,在CF Tree中,对于每个父节点中的CF节点,它的(N,LS,SS)三元组的值等于这个CF节点所指向的所有子节点的三元组之和。
对于CF Tree,我们一般有几个重要参数,第一个参数是每个内部节点的最大CF数B,第二个参数是每个叶子节点的最大CF数L,第三个参数是针对叶子节点中某个CF中的样本点来说的,它是叶节点每个CF的最大样本半径阈值T,也就是说,在这个CF中的所有样本点一定要在半径小于T的一个超球体内。
聚类特征树CF Tree的生成
自己的理解:
先将第一个点加入进去,成为树的一个节点,再把第二个点加进去,如果第二个点在以第一个点为球心的求体内,则加入,然后依旧加入点,如果所有点都在一个球体内,则作为一个节点,如果不在,则新建立一个节点,放入新点。如果该节点内的样本超过了设定的阈值,则对该节点进行分裂,把该求体内距离最远的两个点分开分别作为新的节点,然后计算剩下的点到哪个节点的距离近就分到那边的节点里去。如果在分裂的时候发现父节点的子节点个数也达到了设定的阈值,则按照上面的分裂步骤,先把该层的节点进行分裂。然后再进行下一步的构建。
总结下CF Tree的插入:
1. 从根节点向下寻找和新样本距离最近的叶子节点和叶子节点里最近的CF节点
2. 如果新样本加入后,这个CF节点对应的超球体半径仍然满足小于阈值T,则更新路径上所有的CF三元组,插入结束。否则转入3.
3. 如果当前叶子节点的CF节点个数小于阈值L,则创建一个新的CF节点,放入新样本,将新的CF节点放入这个叶子节点,更新路径上所有的CF三元组,插入结束。否则转入4。
4.将当前叶子节点划分为两个新叶子节点,选择旧叶子节点中所有CF元组里超球体距离最远的两个CF元组,分布作为两个新叶子节点的第一个CF节点。将其他元组和新样本元组按照距离远近原则放入对应的叶子节点。依次向上检查父节点是否也要分裂,如果需要按和叶子节点分裂方式相同。
将所有的训练集样本建立了CF Tree,一个基本的BIRCH算法就完成了,对应的输出就是若干个CF节点,每个节点里的样本点就是一个聚类的簇。也就是说BIRCH算法的主要过程,就是建立CF Tree的过程。
真实的BIRCH算法除了建立CF Tree来聚类,其实还有一些可选的算法步骤的,现在我们就来看看 BIRCH算法的流程。
1) 将所有的样本依次读入,在内存中建立一颗CF Tree, 建立的方法参考上一节。
2)(可选)将第一步建立的CF Tree进行筛选,去除一些异常CF节点,这些节点一般里面的样本点很少。对于一些超球体距离非常近的元组进行合并
3)(可选)利用其它的一些聚类算法比如K-Means对所有的CF元组进行聚类,得到一颗比较好的CF Tree.这一步的主要目的是消除由于样本读入顺序导致的不合理的树结构,以及一些由于节点CF个数限制导致的树结构分裂。
4)(可选)利用第三步生成的CF Tree的所有CF节点的质心,作为初始质心点,对所有的样本点按距离远近进行聚类。这样进一步减少了由于CF Tree的一些限制导致的聚类不合理的情况。
BIRCH算法小结
BIRCH算法可以不用输入类别数K值,这点和K-Means,Mini Batch K-Means不同。如果不输入K值,则最后的CF元组的组数即为最终的K,否则会按照输入的K值对CF元组按距离大小进行合并。
一般来说,BIRCH算法适用于样本量较大的情况,这点和Mini Batch K-Means类似,但是BIRCH适用于类别数比较大的情况,而Mini Batch K-Means一般用于类别数适中或者较少的时候。BIRCH除了聚类还可以额外做一些异常点检测和数据初步按类别规约的预处理。但是如果数据特征的维度非常大,比如大于20,则BIRCH不太适合,此时Mini Batch K-Means的表现较好。
对于调参,BIRCH要比K-Means,Mini Batch K-Means复杂,因为它需要对CF Tree的几个关键的参数进行调参,这几个参数对CF Tree的最终形式影响很大。
最后总结下BIRCH算法的优缺点:
优点有:
1) 节约内存,所有的样本都在磁盘上,CF Tree仅仅存了CF节点和对应的指针。
2) 聚类速度快,只需要一遍扫描训练集就可以建立CF Tree,CF Tree的增删改都很快。
3) 可以识别噪音点,还可以对数据集进行初步分类的预处理
4)如果需要减少数据实例的数量,或者如果想要将大量子群集作为预处理步骤或其他方式,则Birch比MiniBatchKMeans更有用。
缺点有:
1) 由于CF Tree对每个节点的CF个数有限制,导致聚类的结果可能和真实的类别分布不同.
2) 对高维特征的数据聚类效果不好。此时可以选择Mini Batch K-Means.根据经验,如果 n_features大于20,通常使用MiniBatchKMeans会更好。
3) 如果数据集的分布簇不是类似于超球体,或者说不是凸的,则聚类效果不好。
sklearn的使用
class sklearn.cluster.Birch(threshold=0.5,
branching_factor=50,
n_clusters=3,
compute_labels=True,
copy=True)
1) threshold:即叶节点每个CF的最大样本半径阈值T,它决定了每个CF里所有样本形成的超球体的半径阈值。一般来说threshold越小,则CF Tree的建立阶段的规模会越大,即BIRCH算法第一阶段所花的时间和内存会越多。但是选择多大以达到聚类效果则需要通过调参决定。默认值是0.5.如果样本的方差较大,则一般需要增大这个默认值。
2) branching_factor:即CF Tree内部节点的最大CF数B,以及叶子节点的最大CF数L。这里scikit-learn对这两个参数进行了统一取值。也就是说,branching_factor决定了CF Tree里所有节点的最大CF数。默认是50。如果样本量非常大,比如大于10万,则一般需要增大这个默认值。选择多大的branching_factor以达到聚类效果则需要通过和threshold一起调参决定
3)n_clusters:即类别数K,在BIRCH算法是可选的,如果类别数非常多,我们也没有先验知识,则一般输入None,此时BIRCH算法第4阶段不会运行。但是如果我们有类别的先验知识,则推荐输入这个可选的类别值。默认是3,即最终聚为3类。
4)compute_labels:布尔值,表示是否标示类别输出,默认是True。一般使用默认值挺好,这样可以看到聚类效果。
(3)Chameleon(变色龙)算法
——使用动态建模的多阶段层次聚类
一种层次聚类算法,它采用动态建模来确定一对簇之间的相似度。
算法思想:
首先由数据集构造一个 k-最近邻图 Gk;
再通过一种图的划分算法,将Gk图划分成大量较小的子图,每个子图代表一个初始的子簇;
最后使用凝聚层次聚类算法,基于子簇的相似度反复合并子簇。
**为引出**Chameleon变色龙算法的一些定义,先说一下以往的聚类算法的不足之处:
忽略簇与簇之间的互联性
互联性:簇间距离较近的数据对之间的数量,即临接区域的大小。
忽略簇与簇之间的近似性
近似性:簇间数据对的相似度,即不同簇的对象间最近距离。
如图4所示:如果只看最近邻的链接,即只看近似性,则算法会倾向于合并c和d而不是a和b,但实际上a、b的临接区域较大,距离也不远(相对于a、b内部),即互连性更好,所以应该属于同一个cluster簇。
如图5所示:另一种情况,就是过分强调临接区域的大小,倾向于合并a、c,而不是a、b。
Chameleon算法就是努力保持这两种情况之间平衡,即考虑最近邻节点的靠近程度,也考虑临接区域的大小。
Chameleon算法的聚类步骤:
第一阶段:图划分算法,将数据对象划分成大量子簇;
第二阶段:凝聚层次聚类算法,合并子簇。
3个关键知识点:
1. k-最近邻图Gk的构造(第一阶段)
Gk图中的每个点,表示数据集中的一个数据点。对于数据集中的每一个数据点找出它的所有k-最近邻对象,然后分别在它们之间加带权边。
如何找k-最近邻对象呢??即找离该对象最近的k个对象点,
(定义:若点ai到另一个点bi的距离值是所有数据点到bi的距离值中k个最小值之一,则称ai是bi的k-最近邻对象。)
若一个数据点是另一个数据点的k-最近邻对象之一,则在这两点之间加一条带权边,边的权值表示这两个数据点之间的相似度,即距离越大边权值越小,则近似度越小。
2. 划分k-最近邻图Gk(得到初始子簇)
目的:把Gk图划分为大量的无连接的子图,每一个子图就是第二阶段层次聚类的初始子簇。
划分步骤:首先把图Gk划分成两个近似的等大小的子图,使分区的边的总权重和最小,即(割边最小化);我个人觉得它就是最小二分法。也就是说,簇C划分为两个子簇Ci和Cj时需要割断的边的加权和最小。割边用Ec(Ci,Cj)表示,用于评估簇Ci和Cj之间的绝对互连性。然后把每个子图看成一个初始的子图,重复上述过程直至生成每一个子图中节点数量达到一定标准。
3. 合并成最终的簇(第二阶段)
Chameleon算法根据每对簇Ci和Cj的 相对互连度 RI(Ci,Cj)和 相对接近度
RC(Ci,Cj)来决定两个簇之间的相似度。
两个簇Ci和Cj之间的 相对互连度 RI(Ci,Cj)定义为Ci和Cj之间的绝对互连度关于两个簇Ci和Cj之间的内部互连度的规范化:
绝对互连性:连接子簇Ci和Cj之间的边的权重之和。
相对互连性:一个子簇Ci做最小截断时需要去掉的边的权重和。
两个簇Ci和Cj的的 相对接近度 RC(Ci,Cj)定义为Ci和Cj之间的绝对接近度关于两个簇Ci和Cj的内部接近度的规范化,定义如下:
相对近似度:一个子簇Ci做最小截断时需要去掉的边的平均权重。
绝对近似度:连接子簇Ci和Cj之间的边的平均权重。
相似度函数:是相对互连度与相对近似度两个指标的乘积。
RI(Ci,Cj)* RC(Ci,Cj)^a ,选择使该函数值最大的簇对进行合并。其中,a是用来调节两个参量的比重的参数。a>1,更重视相对近似性,a<1更重视相对互连性。
合并子簇具体过程:
给定度量函数和阀值minMetric(用户指定阀值TRI和TRC);
访问每个簇,计算它与邻近的每个簇的RI和RC,通过度量函数公式计算出值tempMetric,将值存放于一个列表中;
从列表找出最大的tempMetric值,若它超过阀值minMetric,将簇与此值对应的簇合并,(合并RI和RC分别超过TRI和TRC的簇对);
若找到的最大tempMetric没超过阀值,则表明此聚类已合并完成,移除聚簇列表,加入到结果聚簇中,(重复直到没有可合并的簇);
递归步骤2,直到待合并聚簇列表最终大小为空。
总结:
变色龙算法将互连性和近似性都大的簇合并;
可以发现高质量的任意形状的簇
问题:
k-最近邻图中K值难以选取;
最小二等分的选取;
用户指定的阀值的选取;
最坏情况下,高维数据的处理代价可能需要O(n^2)的时间。
Matlab实现
CSDN地址下载:
https://download.csdn.net/download/qiu1440528444/10489144
————————————————
版权声明:本文为CSDN博主「Jomaron」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiu1440528444/article/details/80725142
4.谱聚类
谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。
5.图团体检测
2.性能度量
比较好的聚类结果是,“簇类相似度高”且“簇间相似度低”。
聚类的性能度量大致分为两类,一类是将簇类结果与某个“参考模型”进行比较,称为“外部指标”,另一类是直接参考聚类结果而不利用任何参考模型,称为“内部指标”。
1)外部指标
“外部指标”通常有Jaccard系数(Jaccard Coefficient,简称JC)、FM系数(Fowlkes and Mallows Index,简称FMI)、Rand指数(Rand Index,简称RI)。
DBI的值越小越好,DI的值越大越好
3.常用的距离计算
4.各聚类方法的比较
参考的博客和资料:
1.scikit-learn:cluster
2.刘建平Pinard-DBSCAN,BIRCH,谱聚类
3.常见的六大聚类算法
3.聚类算法深度详解
4.Mean Shift聚类算法
5.机器学习中常用的距离公式
6.机器学习 –周志华
————————————————
版权声明:本文为CSDN博主「raining7989」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010062386/article/details/82499777