1、聚类算法概述

(1)什么是聚类?
聚类就是对大量未知标注的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据比较相似,类别之间的数据相似度比较小,属于无监督学习。
聚类算法的重点是计算样本项之间的相似度,有时候也称为样本间的距离。
聚类算法和分类算法的区别:

  • 分类算法是有监督学习,基于有标注的历史数据进行算法模型构建
  • 聚类算法是无监督学习,数据集中的数据是没有标注的

(2)相似度/距离公式

闵可夫斯基距离(Minkowski)

d i s t ( X , Y ) = ∑ i = 1 n ∣ x i − y i ∣ p p dist(X, Y)=\sqrt[p]{\sum_{i=1}^n|x_i-y_i|^p} dist(X,Y)=pi=1∑n​∣xi​−yi​∣p ​

  • 当p为1的时候是曼哈顿距离(Manhattan)
    M _ d i s t = ∑ i = 1 n ∣ x i − y i ∣ M\_dist=\sum_{i=1}^n|x_i-y_i| M_dist=i=1∑n​∣xi​−yi​∣
  • 当p为2的时候是欧式距离(Euclidean)
    E _ d i s t = ∑ i = 1 n ( x i − y i ) 2 E\_dist=\sqrt{\sum_{i=1}^n(x_i-y_i)^2} E_dist=i=1∑n​(xi​−yi​)2 ​
  • 当p为无穷大的时候是切比雪夫距离(Chebyshev)
    C _ d i s t = max ⁡ i ( ∣ x i − y i ∣ ) C\_dist=\max_i{(|x_i-y_i|)} C_dist=imax​(∣xi​−yi​∣)
标准化欧式距离(Standardized Euclidean Distance)

X ∗ = X − X ‾ s s = ∑ i = 1 n ( s i − s ‾ ) 2 n S _ E _ D = ∑ i = 1 n ( x i − y i s i ) 2 \begin{aligned} X^{\ast}&=\frac{X-\overline{X}}{s} \\ s&=\sqrt{\frac{\sum_{i=1}^n(s_i-\overline{s})^2}{n}} \\ S\_E\_D&=\sqrt{\sum_{i=1}^n(\frac{x_i-y_i}{s_i})^2} \end{aligned} X∗sS_E_D​=sX−X​=n∑i=1n​(si​−s)2​ ​=i=1∑n​(si​xi​−yi​​)2 ​​

夹角余弦相似度(Cosine)

a = ( x 11 , x 12 , … , x 1 n ) b = ( x 21 , x 22 , … , x 2 n ) cos ⁡ ( θ ) = ∑ i = 1 n x 1 k x 2 k ∑ k = 1 n x 1 k 2 ⋅ ∑ k = 1 n x 2 k 2 = a T ⋅ b ∣ a ∣ ∣ b ∣ \begin{aligned} a&=(x_{11}, x_{12},\dots, x_{1n}) \\ b&=(x_{21}, x_{22},\dots, x_{2n}) \\ \cos(\theta)&=\frac{\sum_{i=1}^nx_{1k}x_{2k}}{\sqrt{\sum_{k=1}^nx_{1k}^2}\cdot\sqrt{\sum_{k=1}^nx_{2k}^2}} &=\frac{a^T\cdot b}{|a||b|} \end{aligned} abcos(θ)​=(x11​,x12​,…,x1n​)=(x21​,x22​,…,x2n​)=∑k=1n​x1k2​ ​⋅∑k=1n​x2k2​ ​∑i=1n​x1k​x2k​​​=∣a∣∣b∣aT⋅b​​

KL距离(相对熵)

D ( P ∣ ∣ Q ) = ∑ x P ( x ) log ⁡ ( P ( x ) Q ( x ) ) D(P||Q)=\sum_xP(x)\log(\frac{P(x)}{Q(x)}) D(P∣∣Q)=x∑​P(x)log(Q(x)P(x)​)

杰卡德相似系数(Jaccard)

J ( A , B ) = ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ d i s t ( A , B ) = 1 − J ( A , B ) = ∣ A ⋃ B ∣ − ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ \begin{aligned} J(A, B)&=\frac{|A\bigcap B|}{|A\bigcup B|} \\ dist(A, B)&=1-J(A, B) \\ &=\frac{|A\bigcup B|-|A\bigcap B|}{|A\bigcup B|} \end{aligned} J(A,B)dist(A,B)​=∣A⋃B∣∣A⋂B∣​=1−J(A,B)=∣A⋃B∣∣A⋃B∣−∣A⋂B∣​​

Pearson相关系数

ρ X Y = C o v ( X , Y ) D ( X ) ⋅ D ( Y ) = E ( X − E ( X ) ) ( Y − E ( Y ) ) D ( X ) ⋅ D ( Y ) = ∑ i = 1 n ( X i − μ X ) ( Y i − μ Y ) ∑ i = 1 n ( X i − μ X ) 2 ⋅ ∑ i = 1 n ( Y i − μ Y ) 2 d i s t ( X , Y ) = 1 − ρ X Y \begin{aligned} \rho_{XY}&=\frac{Cov(X,Y)}{\sqrt{D(X)}\cdot\sqrt{D(Y)}} \\ &=\frac{E{(X-E(X))(Y-E(Y))}}{\sqrt{D(X)}\cdot\sqrt{D(Y)}} \\ &=\frac{\sum_{i=1}^n(X_i-\mu_X)(Y_i-\mu_Y)}{\sqrt{\sum_{i=1}^n(X_i-\mu_X)^2}\cdot\sqrt{\sum_{i=1}^n(Y_i-\mu_Y)^2}} \\ dist(X,Y)&=1-\rho_{XY} \end{aligned} ρXY​dist(X,Y)​=D(X) ​⋅D(Y) ​Cov(X,Y)​=D(X) ​⋅D(Y) ​E(X−E(X))(Y−E(Y))​=∑i=1n​(Xi​−μX​)2 ​⋅∑i=1n​(Yi​−μY​)2 ​∑i=1n​(Xi​−μX​)(Yi​−μY​)​=1−ρXY​​
(3)聚类的思想
给定一个有M个对象的数据集,构建一个具有k个簇的模型,其中k<=M。满足以下条件:

  • 每个簇至少包含一个对象
  • 每个对象属于且仅属于一个簇

将满足上述条件的k个簇称为一个合理的聚类划分。
对于给定的类别数目k,首先给定初始划分,通过迭代改变样本和簇的隶属关系,使得每次处理后得到的划分方式比上一次的好(总的数据集之间的距离和变小了)。

2、K-Means算法

(1)K-Means算法的原理
K-Means算法,也称为K-平均或者K-均值,是一种使用广泛的最基础的聚类算法,一般作为掌握聚类算法的第一个算法。
假设输入样本为 T = X 1 , X 2 , . . . , X m T=X_1, X_2 ,..., X_m T=X1​,X2​,...,Xm​,则算法步骤为(使用欧几里得距离公式):

  • 选择初始化的k个类别中心 a 1 , a 2 , … , a k a_1, a_2,\dots,a_k a1​,a2​,…,ak​
  • 对于每个样本 X i X_i Xi​,将其标记为距离类别中心 a j a_j aj​最近的类别j
  • 更新每个类别的中心点 a j a_j aj​为隶属该类别的所有样本的均值
  • 重复上面两步操作,直到达到某个中止条件

中止条件:迭代次数大于阈值,或者最小平方误差MSE小于阈值,或者簇中心点变化率小于阈值。
最小平方误差:
M S E = arg ⁡ min ⁡ 1 ≤ j ≤ k ∑ i = 1 n ( x i − a j ) 2 MSE=\arg\min_{1\le j\le k}{\sqrt{\sum_{i=1}^n(x_i-a_j)^2}} MSE=arg1≤j≤kmin​i=1∑n​(xi​−aj​)2 ​
簇中心点变化率:
a j = 1 N ( c j ) ∑ i ∈ c j x j a_j=\frac{1}{N(c_j)}\sum_{i\in c_j}x_j aj​=N(cj​)1​i∈cj​∑​xj​
记K个簇中心分别为 a 1 , a 2 , … a k a_1, a_2,\dots a_k a1​,a2​,…ak​,每个簇的样本数量为 N 1 , N 2 , … , N K N_1, N_2,\dots,N_K N1​,N2​,…,NK​,使用欧几里得距离公式,平方误差作为目标函数,目标函数公式为:
J ( a 1 , a 2 , … , a k ) = 1 2 ∑ j = 1 K ∑ i = 1 n ( x i − a j ) 2 J(a_1, a_2, \dots, a_k)=\frac{1}{2}\sum_{j=1}^K\sum_{i=1}^n(x_i-a_j)^2 J(a1​,a2​,…,ak​)=21​j=1∑K​i=1∑n​(xi​−aj​)2
要获取最优解,也就是目标函数需要尽可能的小,对J函数求偏导数,可以得到簇中心点a更新的公式为:
∂ J ∂ a j = ∑ i = 1 n ( x i − a j ) 令 → 0 ⇒ a j = 1 N j ∑ i = 1 N j x j \begin{aligned} \frac{\partial J}{\partial a_j}&=\sum_{i=1}^n(x_i-a_j)\underrightarrow{令} 0 \\ \Rightarrow a_j&=\frac{1}{N_j}\sum_{i=1}^{N_j}x_j \end{aligned} ∂aj​∂J​⇒aj​​=i=1∑n​(xi​−aj​) 令​0=Nj​1​i=1∑Nj​​xj​​
K-Means算法在迭代的过程中使用所有点的均值作为新的质点(中心点),如果簇中存在异常点,将导致均值偏差比较严重。比如一个簇中有2、4、6、8、100五个数据,那么新的质点为24,显然这个质点离绝大多数点都比较远。在当前情况下,使用中位数6可能比使用均值更好,使用中位数的聚类方式叫做K-Mediods聚类(K中值聚类)。
K-Means算法是初值敏感的,选择不同的初始值可能导致不同的簇划分规则。为了避免这种敏感性导致的最终结果异常性,可以采用初始化多套初始点构造不同的分类规则,然后选择最优的构造规则。
(2)K-Means算法的优缺点
优点:

  • 理解容易,聚类效果不错
  • 处理大数据集的时候,该算法可以保证较好的伸缩性和高效率
  • 当簇近似高斯分布的时候,效果非常不错

缺点:

  • K值是用户给定的,在进行数据处理前,K值是未知的,不同的K值得到的结果也不一样
  • 对初始簇中心点是敏感的
  • 不适合发现非凸形状的簇或者大小差别较大的簇
  • 特殊值(离群值)对模型的影响比较大

(3)二分K-Means算法
二分K-Means解决K-Means算法对初始簇心比较敏感的问题,二分K-Means算法是一种弱化初始质心的算法。具体思路步骤如下:

  • 将所有样本数据作为一个簇放到一个队列中
  • 从队列中选择一个簇进行K-Means算法划分,划分为两个子簇,并将子簇添加到队列中
  • 循环迭代第二步操作,直到中止条件达到(聚簇数量、最小平方误差、迭代次数等)
  • 队列中的簇就是最终的分类簇集合

从队列中选择划分聚簇的规则一般有两种方式,分别如下:

  • 对所有簇计算误差和SSE(SSE也可以认为是距离函数的一种变种),选择SSE最大的聚簇进行划分操作(优选这种策略)
    S S E = ∑ i = 1 n w i ( y i − y ^ i ) 2 SSE=\sum_{i=1}^nw_i(y_i-\hat y_i)^2 SSE=i=1∑n​wi​(yi​−y^​i​)2
  • 选择样本数据量最多的簇进行划分操作

(4)K-Means++算法
解决K-Means算法对初始簇心比较敏感的问题,K-Means++算法和K-Means算法的区别主要在于初始的K个中心点的选择方面。K-Means算法使用随机给定的方式,K-Means++算法采用下列步骤给定K个初始质点:

  • 从数据集中任选一个节点作为第一个聚类中心
  • 对数据集中的每个点x,计算x到所有已有聚类中心点的距离和D(X),基于D(X)采用线性概率选择出下一个聚类中心点(距离较远的一个点成为新增的一个聚类中心点)
  • 重复步骤2直到找到k个聚类中心点

K-Means++算法的缺点:由于聚类中心点选择过程中的内在有序性,在扩展方面存在着性能方面的问题,即第k个聚类中心点的选择依赖前k-1个聚类中心点的值。
(5)K-Means||算法
解决K-Means++算法缺点而产生的一种算法,主要思路是改变每次遍历时候的取样规则,并非按照K-Means++算法每次遍历只获取一个样本,而是每次获取K个样本,重复该取样操作O(logn)次,然后再将这些抽样出来的样本聚类出K个点,最后使用这K个点作为K-Means算法的初始聚簇中心点。实践证明:一般5次重复采样就可以保证一个比较好的聚簇中心点。
(6)Canopy算法
1)Canopy算法的原理
Canopy算法属于一种“粗”聚类算法,执行速度较快,但精度较低,算法执行
步骤如下:

  • 给定样本列表 L = x 1 , x 2 , … , x m L=x_1, x_2,\dots, x_m L=x1​,x2​,…,xm​以及先验值 r 1 r_1 r1​和 r 2 r_2 r2​( r 1 > r 2 r_1\gt r_2 r1​>r2​)
  • 从列表L中获取一个节点P,计算P到所有聚簇中心点的距离(如果不存在聚簇中心,那么此时点P形成一个新的聚簇),并选择出最小距离 D ( P , a j ) D(P, a_j) D(P,aj​)
  • 如果距离D小于 r 1 r_1 r1​,表示该节点属于该聚簇,添加到该聚簇列表中
  • 如果距离D小于 r 2 r_2 r2​,表示该节点不仅仅属于该聚簇,还表示和当前聚簇中心点非常近,所以将该聚簇的中心点设置为P,并将P从列表L中删除
  • 如果距离D大于 r 1 r_1 r1​,那么节点P形成一个新的聚簇
  • 直到列表L中的元素数据不再有变化或者元素数量为0的时候,结束循环操作

Canopy算法得到的最终结果,聚簇之间是可能存在重叠的,但是不会存在某个对象不属于任何聚簇的情况。
2)Canopy算法常用应用场景
由于K-Means算法存在初始聚簇中心点敏感的问题,常用使用Canopy+K-Means算法混合形式进行模型构建。先使用Canopy算法进行“粗”聚类得到K个聚类中心点,K-Means算法使用Canopy算法得到的K个聚类中心点作为初始中心点,进行“细”聚类。
3)Canopy算法优点

  • 执行速度快(先进行了一次聚簇中心点选择的预处理)
  • 不需要给定K值,应用场景多
  • 能够缓解K-Means算法对于初始聚类中心点敏感的问题

(7)Mini Batch K-Means算法
Mini Batch K-Means算法是K-Means算法的一种优化变种,采用小规模的数据子集,每次训练使用的数据集是在训练算法的时候随机抽取的数据子集,以减少计算时间,同时试图优化目标函数。Mini Batch K-Means算法可以减少K-Means算法的收敛时间,而且产生的结果的效果只是略差于标准K-Means算法。
Mini Batch K-Means算法步骤如下:

  • 首先抽取部分数据集,使用K-Means算法构建出K个聚簇点的模型
  • 继续抽取训练数据集中的部分数据集样本数据,并将其添加到模型中,分配给距离最近的聚簇中心点
  • 更新聚簇的中心点值
  • 循环迭代第二步和第三步操作,直到中心点稳定或者达到迭代次数,停止计算操作

3、聚类算法的衡量指标

(1)均一性
一个簇中只包含一个类别的样本,则满足均一性。也可以认为就是正确率(每个聚簇中正确分类的样本数占该聚簇总样本数的比例和)。
p = 1 k ∑ i = 1 k N ( C i = = K i ) N ( K i ) p=\frac{1}{k}\sum_{i=1}^k\frac{N(C_i==K_i)}{N(K_i)} p=k1​i=1∑k​N(Ki​)N(Ci​==Ki​)​
(2)完整性
同类别样本被归类到相同簇中,则满足完整性。每个聚簇中正确分类的样本数占该类型的总样本数比例的和。
r = 1 k ∑ i = 1 k N ( C i = = K i ) N ( C i ) r=\frac{1}{k}\sum_{i=1}^k\frac{N(C_i==K_i)}{N(C_i)} r=k1​i=1∑k​N(Ci​)N(Ci​==Ki​)​
(3)V-measure
均一性和完整性的加权平均。
v β = ( 1 + β 2 ) ⋅ p r β 2 ⋅ p + r v_\beta=\frac{(1+\beta^2)\cdot pr}{\beta^2\cdot p+r} vβ​=β2⋅p+r(1+β2)⋅pr​
(4)Rand index(兰德指数,RI)
RI取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。
R I = a + b c 2 n s a m p l e s RI=\frac{a+b}{c_2^{n_{samples}}} RI=c2nsamples​​a+b​
其中C表示实际类别信息,K表示聚类结果,a表示在C与K中都是同类别的元素的对数,b表示在C与K中都是不同类别的元素的对数, c 2 n s a m p l e s c_2^{n_{samples}} c2nsamples​​表示数据集中可以组成的对数。
(5)调整兰德系数(ARI,Adjusted Rnd Index)
ARI取值范围为[-1,1],值越大表示聚类结果和真实情况越吻合。从广义的角度来讲,ARI是衡量两个数据分布的吻合程度的。
A R I = R I − E [ R I ] max ⁡ ( R I ) − E ( R I ) ARI=\frac{RI-E[RI]}{\max{(RI)}-E(RI)} ARI=max(RI)−E(RI)RI−E[RI]​
(6)轮廓系数
簇内不相似度:计算样本i到同簇其它样本的平均距离 a i a_i ai​, a i a_i ai​越小,表示样本i越应该被聚类到该簇,簇C中的所有样本的 a i a_i ai​的均值被称为簇C的簇不相似度。
簇间不相似度:计算样本i到其它簇 C j C_j Cj​的所有样本的平均距离 b i j b_{ij} bij​, b i = min ⁡ { b i 1 , b i 2 , … , b i k } b_i=\min\{b_{i1}, b_{i2},\dots, b_{ik}\} bi​=min{bi1​,bi2​,…,bik​}, b i b_i bi​越大,表示样本i越不属于其它簇。
轮廓系数: s i s_i si​值越接近1表示样本i聚类越合理,越接近-1,表示样本i应该分类到另外的簇中,近似为0,表示样本i应该在边界上。所有样本的 s i s_i si​的均值被称为聚类结果的轮廓系数。
s ( i ) = b ( i ) − a ( i ) max ⁡ { a ( i ) , b ( i ) } s ( i ) = { 1 − a ( i ) b ( i ) , a ( i ) < b ( i ) 0 , a ( i ) = b ( i ) b ( i ) a ( i ) − 1 , a ( i ) > b ( i ) \begin{aligned} s(i)&=\frac{b(i)-a(i)}{\max\{a(i), b(i)\}} \\ s(i)&=\begin{cases}1-\frac{a(i)}{b(i)}, &a(i)\lt b(i) \\ 0, &a(i)=b(i) \\ \frac{b(i)}{a(i)}-1, &a(i)\gt b(i)\end{cases} \end{aligned} s(i)s(i)​=max{a(i),b(i)}b(i)−a(i)​=⎩⎪⎨⎪⎧​1−b(i)a(i)​,0,a(i)b(i)​−1,​a(i)<b(i)a(i)=b(i)a(i)>b(i)​​

4、层次聚类方法

(1)传统的层次聚类算法
层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止。传统的层次聚类算法主要分为两大类算法:

  • 凝聚的层次聚类:AGNES算法(AGglomerative NESting)采用自底向上的策略。 最初将每个对象作为一个簇,然后这些簇根据某些准则被一步一步合并,两个簇间的距离可以由这两个不同簇中距离最近的数据点的相似度来确定。聚类的合并过程反复进行直到所有的对象满足簇数目
  • 分裂的层次聚类:DIANA算法(DIvisive ANALysis)采用自顶向下的策略。首先将所有对象置于一个簇中,然后按照某种既定的规则逐渐细分为越来越小的簇(比如最大的欧式距离),直到达到某个终结条件(簇数目或者簇距离达到阈值)

AGNES算法中的簇间距离:

  1. 最小距离(SL聚类)
  • 两个聚簇中最近的两个样本之间的距离(single/word-linkage聚类法)
  • 最终得到模型容易形成链式结构
  1. 最大距离(CL聚类)
  • 两个聚簇中最远的两个样本的距离(complete-linkage聚类法)
  • 如果存在异常值,那么构建可能不太稳定
  1. 平均距离(AL聚类)
  • 两个聚簇中样本间两两距离的平均值(average-linkage聚类法)
  • 两个聚簇中样本间两两距离的中值(median-linkage聚类法)

AGNES和DIANA算法的优缺点:

  • 简单,理解容易
  • 合并点/分裂点选择不太容易
  • 合并/分类的操作不能进行撤销
  • 大数据集不太适合
  • 执行效率较低 O ( t × n 2 ) O(t\times n^2 ) O(t×n2),t为迭代次数,n为样本点数

(2)BIRCH算法(平衡迭代削减聚类法)
BIRCH算法的聚类特征使用3元组记录一个簇的相关信息,通过构建满足分枝因子和簇直径限制的聚类特征树来求聚类。聚类特征树其实是一个具有两个参数分枝因子和类直径的高度平衡树。分枝因子规定了树的每个节点的子女的最多个数,而类直径体现了对这一类点的距离范围。非叶子节点为它的子女的最大特征值。聚类特征树的构建可以是动态过程的,可以随时根据数据对模型进行更新操作。
BIRCH算法的优缺点:

  • 适合大规模数据集,线性效率
  • 只适合分布呈凸形或者球形的数据集,需要给定聚类个数和簇直径的限制

(3)CURE算法(使用代表点的聚类法)
CURE算法先把每个数据点看成一类,然后合并距离最近的类直至类个数为所要求的个数为止。但是和AGNES算法的区别是:取消了使用所有点或用中心点+距离来表示一个类,而是从每个类中抽取固定数量、分布较好的点作为此类的代表点,并将这些代表点乘以一个适当的收缩因子,使它们更加靠近类中心点。代表点的收缩特性可以调整模型可以匹配那些非球形的场景,而且收缩因子的使用可以减少噪音对聚类的影响。
CURE算法的优缺点:

  • 能够处理非球形分布的应用场景
  • 采用随机抽样和分区的方式可以提高算法的执行效率

5、密度聚类方法

密度聚类方法的指导思想:只要样本点的密度大于某个阈值,则将该样本添加到最近的簇中。这类算法可以克服基于距离的算法只能发现凸聚类的缺点,可以发现任意形状的聚类,而且对噪声数据不敏感。但是计算复杂度高,计算量大。
常用密度聚类算法:

  • DBSCAN
  • 密度最大值算法

(1)DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法,相比于基于划分的聚类方法和层次聚类方法,DBSCAN算法将簇定义为密度相连的点的最大集合,能够将足够高密度的区域划分为簇,并且在具有噪声的空间数据上能够发现任意形状的簇。
DBSCAN算法的核心思想是:用一个点的ε邻域内的邻居点数衡量该点所在空间的密度,该算法可以找出形状不规则的cluster,而且聚类的时候事先不需要给定cluster的数量。

DBSCAN算法基本概念
ε邻域

ε邻域(ε neighborhood,也称为Eps),给定对象在半径ε内的区域。
N ε ( x ) = { y ∈ X : d i s t ( x , y ) ≤ ε } N_\varepsilon(x)=\{y\in X:dist(x,y)\le\varepsilon\} Nε​(x)={y∈X:dist(x,y)≤ε}

密度(density)

ε邻域中x的密度是一个整数值,依赖于半径ε。
p ( x ) = ∣ N ε ( x ) ∣ p(x)=|N_\varepsilon(x)| p(x)=∣Nε​(x)∣

MinPts

MinPts定义核心点的阈值,简记为M。

核心点(core point)

如果p(x)>=M,那么称x为X的核心点。记由X中所有核心点构成的集合为 X c X_c Xc​,并记 X n c = X ∖ X c X_{nc}=X\setminus X_c Xnc​=X∖Xc​表示由X中所有非核心点构成的集合。直白来讲,核心点对应于稠密区域内部的点。

边界点(border point)

如果非核心点x的ε邻域中存在核心点,那么认为x为X的边界点。由X中所有的边界点构成的集合为 X b d X_{bd} Xbd​。直白来讲,边界点对应稠密区域边缘的点。
x ∈ X n c ∃ y ∈ X y ∈ N ε ( x ) ∩ X c x\in X_{nc} \\ \exists y\in X \\ y\in N_\varepsilon(x)\cap X_c x∈Xnc​∃y∈Xy∈Nε​(x)∩Xc​

噪音点(noise point)

集合中除了边界点和核心点之外的点都是噪音点,所有噪音点组成的集合叫做 X n o i X_{noi} Xnoi​。直白来讲,噪音点对应稀疏区域的点。
X n o i = X ∖ ( X c ⋃ X b d ) X_{noi}=X\setminus (X_c\bigcup X_{bd}) Xnoi​=X∖(Xc​⋃Xbd​)

直接密度可达(directly density-reachable)

给定一个对象集合X,如果y是在x的ε邻域内,而且x是一个核心对象,可以说对象y从对象x出发是直接密度可达的。
x , y ∈ X x ∈ X c , y ∈ N ε ( x ) x,y\in X \\ x\in X_c, y\in N_\varepsilon(x) x,y∈Xx∈Xc​,y∈Nε​(x)

密度可达(density-reachable)

如果存在一个对象链 p 1 , p 2 , … p m p_1, p_2,\dots p_m p1​,p2​,…pm​,如果满足 p i + 1 p _{i+1} pi+1​是从 p i p_i pi​直接密度可达的,那么称 p m p_m pm​是从 p 1 p_1 p1​密度可达的。

密度相连(density-connected)

在集合X中,如果存在一个对象o,使得对象x和y是从o关于ε和m密度可达的,那么对象x和y是关于ε和m密度相连的。

簇(cluster)

一个基于密度的簇是最大的密度相连对象的集合C。满足以下两个条件:

  • Maximality:若x属于C,而且y是从x密度可达的,那么y也属于C
  • Connectivity:若x属于C,y也属于C,则x和y是密度相连的
DBSCAN算法流程
  • 如果一个点x的 ε邻域包含多于m个对象,则创建一个x作为核心对象的新簇
  • 寻找并合并核心对象直接密度可达的对象
  • 没有新点可以更新簇的时候,算法结束
算法特征描述
  • 每个簇至少包含一个核心对象
  • 非核心对象可以是簇的一部分,构成簇的边缘
  • 包含过少对象的簇被认为是噪声
DBSCAN算法的优点
  • 不需要事先给定cluster的数目
  • 可以发现任意形状的cluster
  • 能够找出数据中的噪音,且对噪音不敏感
  • 算法只需要两个输入参数
  • 聚类结果几乎不依赖节点的遍历顺序
DBSCAN算法的缺点
  • DBSCAN算法聚类效果依赖距离公式的选取,最常用的距离公式为欧几里得距离。但是对于高维数据,由于维数太多,距离的度量已变得不是那么重要
  • DBSCAN算法不适合数据集中密度差异很大的情况

(2)密度最大值聚类算法(MDCA)
MDCA(Maximum Density Clustering Application)算法基于密度的思想引入划分聚类中,使用密度而不是初始点作为考察簇归属情况的依据,能够自动确定簇数量并发现任意形状的簇。另外MDCA一般不保留噪声,因此也避免了阈值选择不当情况下造成的对象丢弃情况。
MDCA算法的基本思路是寻找最高密度的对象和它所在的稠密区域。MDCA算法在原理上来讲,和密度的定义没有关系,采用任意一种密度定义公式均可,一般情况下采用DBSCAN算法中的密度定义方式。

MDCA概念
最大密度点

x m a x = { x ∣ x ∈ X ; ∀ y ∈ X , d e n s i t y ( x ) ≥ d e n s i t y ( y ) } x_{max}=\{x|x\in X; \forall y\in X, density(x)\ge density(y)\} xmax​={x∣x∈X;∀y∈X,density(x)≥density(y)}

有序序列

根据所有对象与 p m a x p_{max} pmax​的距离对数据重新排序。
S p m a x = { x 1 , x 2 , … , x n ∣ d i s t ( x m a x , x 1 ) ≤ d i s t ( x m a x , x 2 ) ≤ ⋯ ≤ d i s t ( x m a x , x n ) } S_{p_{max}}=\{x_1, x_2, \dots, x_n|dist(x_{max}, x_1)\le dist(x_{max}, x_2)\le\dots\le dist(x_{max}, x_n)\} Spmax​​={x1​,x2​,…,xn​∣dist(xmax​,x1​)≤dist(xmax​,x2​)≤⋯≤dist(xmax​,xn​)}

密度阈值 d e n s i t y 0 density_0 density0​

当节点的密度值大于密度阈值的时候,认为该节点属于一个比较固定的簇,在第一次构建基本簇的时候,就将这些节点添加到对应簇中,如果小于这个值的时候,暂时认为该节点为噪声节点。

簇间距离

对于两个簇 C 1 C_1 C1​和 C 2 C_2 C2​之间的距离,采用两个簇中最近两个节点之间的距离作为簇间距离。
d i s t ( C 1 , C 2 ) = min ⁡ ( d i s t ( p , q ) ) ; p ∈ C 1 , q ∈ C 2 dist(C_1, C_2)=\min(dist(p, q)); p\in C_1, q\in C_2 dist(C1​,C2​)=min(dist(p,q));p∈C1​,q∈C2​

聚簇距离阈值 d i s t 0 dist_0 dist0​

当两个簇的簇间距离小于给定阈值的时候,这两个簇的结果数据会进行合并操作。

M值

初始簇中最多数据样本个数。

MDCA算法聚类过程步骤
  • 将数据集划分为基本簇。对数据集X选取最大密度点 P m a x P_{max} Pmax​,形成以最大密度点为核心的新簇 C i C_i Ci​,按照距离排序计算出序列 S p m a x S_{pmax} Spmax​,对序列的前M个样本数据进行循环判断,如果节点的密度大于等于 d e n s i t y 0 density_0 density0​,那么将当前节点添加到 C i C_i Ci​中
  • 循环处理剩下的数据集X,选择最大密度点 P m a x P_{max} Pmax​,并构建基本簇 C i + 1 C_{i+1} Ci+1​,直到X中剩余的样本数据的密度均小于 d e n s i t y 0 density_0 density0​
  • 使用凝聚层次聚类的思想,合并较近的基本簇,得到最终的簇划分。在所有簇中选择距离最近的两个簇进行合并,合并要求是:簇间距小于等于 d i s t 0 dist_0 dist0​,如果所有簇中没有簇间距小于 d i s t 0 dist_0 dist0​的时候,结束合并操作
  • 处理剩余节点,归入最近的簇

6、谱聚类方法

(1)谱聚类基本概念
谱聚类是基于谱图理论基础上的一种聚类方法,与传统的聚类方法相比,具有在任意形状的样本空间上聚类并且收敛于全局最优解的优点。
通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而达到对样本数据进行聚类的目的。其本质是将聚类问题转换为图的最优划分问题,是一种点对聚类算法。
谱聚类算法将数据集中的每个对象看做图的顶点V,将顶点间的相似度量化为相应顶点连接边E的权值w,这样就构成了一个基于相似度的无向加权图G(V,E),于是聚类问题就转换为图的划分问题。基于图的最优划分规则就是子图内的相似度最大,子图间的相似度最小。
(2)谱聚类的构建过程

  • 构建表示对象相似度的矩阵W
  • 构建度矩阵D(对角矩阵)
  • 构建拉普拉斯矩阵L
  • 计算矩阵L的前k个特征值的特征向量(k个列向量)
  • 将k个列向量组成矩阵U
  • 对矩阵U中的n行数据利用K-means或其它经典聚类算法进行聚类得出最终结果

(3)拉普拉斯矩阵变形
拉普拉斯矩阵:
L = D − W L=D-W L=D−W
对称拉普拉斯矩阵:
L s y m = D − 1 2 ( D − W ) D − 1 2 = I − D − 1 2 W D − 1 2 \begin{aligned} L_{sym}&=D^{-\frac{1}{2}}(D-W)D^{-\frac{1}{2}} \\ &=I-D^{-\frac{1}{2}}WD^{-\frac{1}{2}} \end{aligned} Lsym​​=D−21​(D−W)D−21​=I−D−21​WD−21​​
随机游走拉普拉斯矩阵:
L r w = D − 1 ( D − W ) L_{rw}=D^{-1}(D-W) Lrw​=D−1(D−W)
(4)谱聚类应用场景及面临的问题
应用场景:

  • 图形聚类
  • 计算机视觉
  • 非凸球形数据聚类等

面临的问题:

  • 相似度矩阵的构建问题:业界一般使用高斯相似函数或者k近邻来作为相似度量,一般建议使用k近邻的方式来计算相似度权值
  • 聚类数目需要给定
  • 如何选择特征向量
  • 如何提高谱聚类的执行效率

K-Means算法、层次聚类、密度聚类及谱聚类方法详述相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. 聚类(下) 谱聚类算法

    谱聚类算法 该算法首先根据给定的样本数据集定义一个描述成对数据点相似度的亲合矩阵,并且计算矩阵的特征值和特征向量 , 然后选择合适 的特征向量聚类不同的数据点.谱聚类算法最初用于计算机视觉 .VLS ...

  3. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  4. 谱聚类python代码_Python 谱聚类算法从零开始

    谱聚类算法是一种常用的无监督机器学习算法,其性能优于其他聚类方法. 此外,谱聚类实现起来非常简单,并且可以通过标准线性代数方法有效地求解. 在谱聚类算法中,根据数据点之间的相似性而不是k-均值中的绝对 ...

  5. python实现k core算法_python实现密度聚类(模板代码+sklearn代码)

    本人在此就不搬运书上关于密度聚类的理论知识了,仅仅实现密度聚类的模板代码和调用skelarn的密度聚类算法. 有人好奇,为什么有sklearn库了还要自己去实现呢?其实,库的代码是比自己写的高效且容易 ...

  6. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  7. Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)

    Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...

  8. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...

    谱聚类(Spectal Clustering)算法是聚类算法的一种,比起传统的K-Means聚类算法,谱聚类算法的效果更优秀,其计算量也小很多,除了谱聚类和K-Means聚类算法,另外还有密度聚类和层 ...

  9. 聚类算法 距离矩阵_理解谱聚类

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的. 其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习-原理.算法与应用>,清华大学出版社,雷明 ...

  10. 聚类算法 距离矩阵_论文阅读9——AP聚类算法

    Affinity Learning for Mixed Data Clustering 论文提出了基于混合对数据进行聚类的学习框架,具体研究内容包括:1)如何处理具有混合类型属性的数据.2)如何学习数 ...

最新文章

  1. 做 Java 工程师,挺!好!
  2. 《全球创新观察》研究报告3月刊下发布
  3. C# Redis写入程序
  4. wxWidgets:wxSystemOptions类用法
  5. python高级编程装饰器_Python装饰器
  6. falcon适配ldap密码同步
  7. 缓存与数据库一致性保证
  8. 小甲鱼c语言 23课指针 数组和数组指针
  9. 计算机毕业设计Android的计算器app设计(源码+系统+mysql数据库+Lw文档)
  10. 特价机票退票费高达80% 律师称航班延误应补偿-特价机票-退票费-霸王条款
  11. java遍历excel 表格
  12. 会员计费系统c语言_c语言课程设计报告 会员卡计费系统源代码
  13. (原创)自编protel99se鼠标增强工具,支持dxp2004
  14. linux 0.0.1
  15. 毕业生或者新工作不久,如何填写期望月薪?
  16. CUDA10.1安装 +VS2015开发环境搭建
  17. win7开机黑屏,但能看到鼠标
  18. 不畏浮云遮望眼 自缘身在云栖会
  19. 1、Melodic驱动笔记本摄像头和USB摄像头
  20. Apifox下载安装【官方版】

热门文章

  1. java 如何创建项目 包 类
  2. 【计算机毕业设计】社区医疗服务系统
  3. 利用枚举类型变量求从5种颜色球中取3个不同颜色球的取法
  4. 使用n管理Node版本
  5. 行业现状令人失望,工作之后我又回到UC伯克利读博了
  6. 几组公用的DNS服务器
  7. 高分子聚合物DBCO-PEG-ACRL,DBCO-PEG-丙烯酸酯,无刺激性,味微苦
  8. linux误删除文件后的恢复操作
  9. 神经风格迁移 (吴恩达老师_学习笔记)
  10. 计算机信息处理的基础知识,计算机和信息处理基础知识.ppt