聚类算法

1. 聚类任务

聚类是一种常见的无监督算法,其主要任务是将数据集根据特征自动分为若干个不相交的子集,达到“物以聚类”的效果。每个子集称为一个“簇”,每个簇中的元素具有一定的相似性。聚类主要分为kmeans聚类、密度聚类(DBSCAN)、层次聚类等。

2. 性能度量

对于聚类的效果,我们也需要使用一些指标来评估其好坏,作为无监督算法,其无法像有监督学习一样,通过误差率等指标来衡量模型效果,直观上看,其度量标准为:簇内相似度高,簇间相似度低

周志华的《机器学习》里提到了2种用于衡量聚类的方法:

  • 外部指标:将结果与某个“参考模型”比较,如领域专家给出的划分结果
  • 内部指标:直接考察聚类结果

2.1 外部指标

在给出具体的指标前,书上给出了一些参数的意义如下:
在这里插入图片描述
给出具体的例子,一共有5个样本,

聚类结果:
( x 1 , x 2 , x 3 ) ∈ C 1 (x_1,x_2,x_3) \in C_1 (x1,x2,x3)C1
( x 4 , x 5 ) ∈ C 2 (x_4,x_5) \in C_2 (x4,x5)C2

参考模型:
( x 1 , x 2 , x 4 ) ∈ C 1 (x_1,x_2,x_4) \in C_1 (x1,x2,x4)C1
( x 3 , x 5 ) ∈ C 2 (x_3,x_5) \in C_2 (x3,x5)C2

a = ∣ S S ∣ = ∣ ( x 1 , x 2 ) ∣ = 1 a = |SS| = |(x_1,x_2)| = 1 a=SS=(x1,x2)=1
b = ∣ S D ∣ = ∣ ( x 1 , x 3 ) , ( x 2 , x 3 ) , ( x 4 , x 5 ) ∣ = 3 b = |SD| = |(x_1,x_3),(x_2,x_3),(x_4,x_5)| = 3 b=SD=(x1,x3),(x2,x3),(x4,x5)=3
c = ∣ D S ∣ = ∣ ( x 1 , x 4 ) , ( x 2 , x 4 ) ∣ , ( x 3 , x 5 ) ∣ = 3 c = |DS| = |(x_1,x_4),(x_2,x_4)|,(x_3,x_5)| =3 c=DS=(x1,x4)(x2,x4)(x3,x5)=3
d = ∣ D D ∣ = ∣ ( x 1 , x 5 ) , x 2 , x 5 ) , x 3 , x 4 ) ∣ = 3 d = |DD| = |(x_1,x_5),x_2,x_5),x_3,x_4)| = 3 d=DD=(x1,x5),x2,x5),x3,x4)=3
a + b + c + d = m ( m − 1 ) 2 a+b+c+d = \frac{m(m-1)}{2} a+b+c+d=2m(m1)
基于这些参数,有以下用于衡量聚类效果的外部指标:

  • Jaccard系数(JC)
    J C = a a + b + c JC = \frac{a}{a+b+c} JC=a+b+ca
  • FM指数
    F M I = a a + b ⋅ a a + c FMI = \sqrt{\frac{a}{a+b}\cdot\frac{a}{a+c}} FMI=a+baa+ca
  • Rand指数
    R a n d = a + b m ( m − 1 ) 2 = 2 ( a + d ) m ( m − 1 ) Rand= \frac{a+b}{\frac{m(m-1)}{2}} = \frac{2(a+d)}{m(m-1)} Rand=2m(m1)a+b=m(m1)2(a+d)
    显然,上述三个指标都是[0,1]区间,且值越大越好

2.2 内部指标

聚类没有参考的模型,因此更多参考内部指标,先给出以下定义:
在这里插入图片描述
给出以下例子,假设在一维空间中,有以下8个样本,共有3类(C=3)
在这里插入图片描述
a v g ( C ) avg(C) avg(C)表示簇内样本平均距离
a v g ( C 1 ) = ∣ x 1 − x 2 ∣ + ∣ x 1 − x 3 ∣ + ∣ x 2 − x 3 ∣ C 3 2 = ∣ x 1 − x 2 ∣ + ∣ x 1 − x 3 ∣ + ∣ x 2 − x 3 ∣ 3 \begin{aligned} avg(C_1) = \frac{|x_1-x_2|+|x_1-x_3|+ |x_2-x_3|}{C_3^2} \\ = \frac{|x_1-x_2|+|x_1-x_3|+ |x_2-x_3|}{3} \end{aligned} avg(C1)=C32x1x2+x1x3+x2x3=3x1x2+x1x3+x2x3

d i a m ( C ) diam(C) diam(C)表示簇内样本最大距离
d i a m ( C 1 ) = ∣ x 1 − x 3 ∣ diam(C_1) = |x_1 - x_3| diam(C1)=x1x3

d m i n ( C i , C j ) dmin(C_i,C_j) dmin(Ci,Cj)表示簇内 C i C_i Ci和簇 C j C_j Cj最小距离
d m i n ( C 1 , C 2 ) = ∣ x 3 − x 4 ∣ dmin(C_1,C_2)= |x_3 - x_4| dmin(C1,C2)=x3x4

d c e n ( C i , C j ) dcen(C_i,C_j) dcen(Ci,Cj)表示簇内 C i C_i Ci和簇 C j C_j Cj中心点的距离
μ 1 = x 1 + x 2 + x 3 3 μ 2 = x 4 + x 5 2 d c e n ( C 1 , C 2 ) = ∣ μ 1 − μ 2 ∣ \begin{aligned} \mu_1 &= \frac{x_1+x_2+x_3}{3} \\ \mu_2 &= \frac{x_4+x_5}{2} \\ dcen(C_1,&C_2) =|\mu_1 - \mu_2| \end{aligned} μ1μ2dcen(C1,=3x1+x2+x3=2x4+x5C2)=μ1μ2

内部指标主要是以下几个:

  • DB指数(DBI)
    D B I = 1 k ∑ i = 1 k m a x j ≠ i ( a v g ( C i ) + a v g ( C j ) d c e n ( μ i , μ j ) ) DBI= \frac1k\sum_{i=1}^k\underset{j \ne i}{max}(\frac{avg(C_i)+avg(C_j)}{dcen(\mu_i,\mu_j)}) DBI=k1i=1kj=imax(dcen(μi,μj)avg(Ci)+avg(Cj))
    DBI指数取了簇内平均距离和簇间中心点距离比值是最大值,由于我们希望簇内平均距离更小,簇间中心点距离更大,于是这个比值是越小越好
  • Dunn指数(DI)
    D I = m i n 1 ≤ i ≤ k [ m i n j ≠ i ( d m i n ( C i , C j ) m i n 1 ≤ l ≤ k d i a m ( C l ) ) ] DI = \underset{1 \le i \le k}{min} [\underset{j \ne i}{min}(\frac{dmin(C_i,C_j)}{ \underset{1 \le l \le k}{min}diam(C_l)})] DI=1ikmin[j=imin(1lkmindiam(Cl)dmin(Ci,Cj))]
    DI算法是取簇间距离最小值与簇内间距最大比值的最小值,此时,DI指数应该是越大越好

3. 距离计算

3.1 有序数据

对于取值连续的数据,距离的计算比较直观和简单。

距离的定义必须要满足以下几个性质:
非负性: d i s t ( x i , x j ) ≥ 0 dist(x_i,x_j) \ge 0 dist(xi,xj)0
同一性: d i s t ( x i , x j ) = 0 dist(x_i,x_j) = 0 dist(xi,xj)=0 当且仅当 x i = x j x_i = x_j xi=xj
对称性: d i s t ( x i , x j ) = 0 = d i s t ( x j , x i ) dist(x_i,x_j) = 0 = dist(x_j,x_i) dist(xi,xj)=0=dist(xj,xi)
直递性: d i s t ( x i , x j ) ≤ d i s t ( x i , x k ) + d i s t ( x k , x j ) dist(x_i,x_j) \le dist(x_i,x_k) + dist(x_k,x_j) dist(xi,xj)dist(xi,xk)+dist(xk,xj)
z
由于在knn中有关于距离的介绍,这里不再赘述,可以参考:
分类算法 - k近邻算法(原理、kd树)

3.2 无序数据

如果变量的取值为离散值,如{火车、飞机、轮船}这样的无序数据,不能直接采用3.1节的距离,可以用VDM距离来度量属性取值的差异
V D M p ( a , b ) = ∑ i = 1 k ∣ m u , a , i m u , a − m u , b , i m u , b ∣ p VDM_p(a,b) = \sum_{i=1}^k|\frac{m_{u,a,i}}{m_{u,a}}- \frac{m_{u,b,i}}{m_{u,b}}|^p VDMp(a,b)=i=1kmu,amu,a,imu,bmu,b,ip
m u , a , i m_{u,a,i} mu,a,i表示在第 i i i个样本簇中在属性 u u u上取值为a的样本数,k为簇数, m u , a m_{u,a} mu,a表示属性u上取值为a的样本数

3.3 混合数据

对于混合数据,可以采用闵可夫斯基距离和VDM结合的方式,
在这里插入图片描述

4. 原型聚类

4.1 k-means聚类

给定样本集 D = { x 1 , x 2 . . . , x n } D= \lbrace x_1,x_2...,x_n \rbrace D={x1,x2...,xn}, k均值算法针对聚类所得簇划分 C = { C 1 , C 2 , . . . , C k } C=\lbrace C_1,C_2,...,C_k \rbrace C={C1,C2,...,Ck},最小化平方误差
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E = \sum_{i=1}^k\sum_{x \in C_i} ||x - \mu_i||_2^2 E=i=1kxCixμi22
其中, μ i = 1 C i ∑ x ∈ C i x \mu_i = \frac{1}{C_i}\sum_{x \in C_i} x μi=Ci1xCix是簇 C i C_i Ci的均值向量,直观上看,刻画了簇内样本围绕簇均值向量的紧密程度,E越小,簇内样本相似程度越高。

由于这是一个NP难的问题,k-means采用贪心策略,用迭代的方式进行求解。算法的具体流程如下:

输入:样本集 D = { x 1 , x 2 . . . , x n } D= \lbrace x_1,x_2...,x_n \rbrace D={x1,x2...,xn}、簇个数k
过程:

  1. 从D中随机选择k个样本作为初始均值向量 { μ 1 , μ 2 . . . , μ k } \lbrace \mu_1,\mu_2...,\mu_k \rbrace {μ1,μ2...,μk},
  2. C = ∅ C = \emptyset C=
  3. for j = 1,2, …, m(每个样本)
    计算样本 x j x_j xj与各均值向量 μ i ( i ≤ i ≤ k ) \mu_i(i \le i \le k) μi(iik)的距离: d i j = ∣ ∣ x j − μ i ∣ ∣ 2 2 d_{ij} = ||x_j - \mu_i||_2^2 dij=xjμi22
    根据距离最近的均值向量确定 x j x_j xj的簇标记
    将样本 x j x_j xj划入对应簇
    end
  4. for i = 1,2,…,k(每个簇)
    计算新的均值向量 μ i ′ \mu_i' μi
    if μ i ≠ μ i ′ \mu_i \ne \mu_i' μi=μi then
    \quad 将当前均值更新为 μ i ′ \mu_i' μi
    else
    \quad 保持当前均值
    end
  5. if 当前均值均未更新 then
    \quad 输出簇划分C = { C 1 , C 2 , . . . , C k C_1,C_2,...,C_k C1,C2,...,Ck}
    else
    \quad 返回第2步

为避免运行时间过长,通常设置一个最小调整阈值或者最大运行次数,在保证精度的同时减少运行次数

迭代过程的效果如下图:
在这里插入图片描述

4.2 学习向量化

学习向量化(learning vector quantization,LVQ)也是一种原型聚类,其核心思想是通过找到一组原型向量来代表聚类的中心,与kmeans不同,LVQ参考了样本的标签(或者假设的标签)来辅助聚类, 使得相同标签的样本更加靠近。

聚类的伪代码如下:
在这里插入图片描述
在每一轮迭代中,算法随机选取一个训练样本,并计算与其最近的原型向量,如果与原型向量类别一致,原型向量 p i ∗ p_i* pi向样本 x j x_j xj靠拢,
p ′ = p i ∗ + η ⋅ ( x j − p i ∗ ) p' = p_i* +\eta \cdot(x_j - p_i*) p=pi+η(xjpi)
此时 p ′ p' p x j x_j xj的距离为:
∣ ∣ p ′ − x j ∣ ∣ 2 = ∣ ∣ p i ∗ + η ⋅ ( x j − p i ∗ ) − x j ∣ ∣ 2 = ( 1 − η ) ∣ ∣ p i ∗ − x j ∣ ∣ 2 \begin{aligned} ||p'-x_j||_2 &= ||p_i* +\eta \cdot(x_j - p_i*) - x_j ||_2\\ &= (1 - \eta)||p_i* -x_j||_2 \end{aligned} pxj2=pi+η(xjpi)xj2=(1η)pixj2
η ∈ ( 0 , 1 ) \eta \in (0,1) η(0,1),那么更新后原型向量更接近 x j x_j xj
类似的,如果标记不同,更新后原型向量更远离 x j x_j xj

具体可以参考下例:
在这里插入图片描述
令9~21号样本的标签为 c 1 c_1 c1,其他为 c 2 c_2 c2,假定共分为q = 5个簇,目标为找到五个原型向量 p 1 , p 2 . p 3 , p 4 , p 5 p_1,p_2.p_3,p_4,p_5 p1,p2.p3,p4,p5,我们希望好瓜3个簇,坏瓜2个簇,初始化样本为 x 5 , x 12 , x 18 , x 23 , x 29 x_5,x_{12},x_{18},x_{23},x_{29} x5,x12,x18,x23,x29,对应标记为 c 1 , c 2 , c 2 , c 1 , c 1 , c_1,c_2,c_2,c_1,c_1, c1,c2,c2,c1,c1,.

假定随机选取的样本为 x 1 x_1 x1,类别为 c 1 c_1 c1, 与p的距离如下
n 距离 标签 p 1 0.183 c 1 p 2 0.506 c 2 p 3 0.434 c 2 p 4 0.260 c 1 p 5 0.032 c 1 \begin{array}{c|lcr} n & \text{距离} & \text{标签} \\ \hline p_1 & 0.183 & c_1 &\\ p_2 & 0.506 & c_2& \\ p_3 & 0.434 & c_2&\\ p_4 & 0.260 & c_1\\ p_5 & 0.032 &c_1 \end{array} np1p2p3p4p5距离0.1830.5060.4340.2600.032标签c1c2c2c1c1
x 1 x_1 x1 p 5 p_5 p5的距离最近,且标签相同,假定学习率 η = 0.1 \eta = 0.1 η=0.1 p 5 p_5 p5更新得到
p 5 ′ = p 5 + η ⋅ ( x 1 − p 5 ) = ( 0.725 , 0.445 ) + 0.1 ⋅ ( ( 0.697 , 0.460 ) − ( 0.725 , 0.445 ) ) = ( 0.722 , 0.442 ) \begin{aligned} p_5' &= p_5 + \eta \cdot (x_1 - p_5) \\ &=(0.725,0.445) + 0.1\cdot ((0.697, 0.460) - (0.725,0.445))\\ &=(0.722,0.442) \end{aligned} p5=p5+η(x1p5)=(0.725,0.445)+0.1((0.697,0.460)(0.725,0.445))=(0.722,0.442)
继续选取下一样本进行相同操作,得到迭代的效果如下图:
在这里插入图片描述

5. 密度聚类

密度聚类假设样本簇能够通过样本的紧密程度来确定,从样本角度密度的角度考察样本间的可连续性,并基于可连接样本不断扩展聚类簇以获取最终聚类结果。

DBSCAN是著名的密度聚类算法,DBSCAN使用一组关于“邻域”概念的参数来描述样本分布的紧密程度,将具有足够密度的区域划分成簇,且能在有噪声的条件下发现任意形状的簇。

先用一个图来引入DBSCAN的定义的几个概念,
在这里插入图片描述

  • ϵ \epsilon ϵ邻域:对 x i ∈ D x_i \in D xiD,其 ϵ \epsilon ϵ邻域为在样本集D中,与 x i x_i xi距离不大于 ϵ \epsilon ϵ的样本,记为 N ϵ ( x i ) = { x j ∈ D ∣ d i s t ( x i , x j ) ≤ ϵ } N_\epsilon(x_i) =\lbrace x_j \in D | dist(x_i,x_j) \le \epsilon \rbrace Nϵ(xi)={xjDdist(xi,xj)ϵ},如上图, x 1 x_1 x1 ϵ \epsilon ϵ邻域就包含5个样本

  • 核心对象:若 x i x_i xi ϵ \epsilon ϵ邻域至少包含 M i n p t s Minpts Minpts个样本,即 ∣ ∣ N ϵ ( x i ) ∣ ∣ ≥ M i n p t s ||N_\epsilon(x_i) || \ge Minpts Nϵ(xi)Minpts,则称 x i x_i xi是一个核心对象,如上图,如果 M i n p t s Minpts Minpts取4,那么 x 1 x_1 x1就是一个核心对象

  • 密度直达 x j x_j xj x i x_i xi ϵ \epsilon ϵ邻域中,且 x i x_i xi是核心对象,就称 x j x_j xj x i x_i xi密度直达,如上图的 x 1 x_1 x1 x 2 x_2 x2

  • 密度可达:对 x i x_i xi, x j x_j xj,若存在样本序列 p 1 , p 1 , . . . , p n p_1,p_1,...,p_n p1,p1,...,pn,其中, p 1 = x i , p n = x j p_1 = x_i,p_n = x_j p1=xi,pn=xj,且 p i + 1 p_{i+1} pi+1 p i p_i pi密度直达,则称 x j x_j xj x i x_i xi密度k可达,如上图的 x 1 x_1 x1 x 3 x_3 x3

  • 密度相连:对于 x i x_i xi, x j x_j xj,如果存在 x k x_k xk,使得 x i x_i xi, x j x_j xj均由 x k x_k xk密度可达,则称 x i x_i xi, x j x_j xj密度相连,如上图的 x 3 x_3 x3 x 4 x_4 x4

DBSCAN对簇的定义为:由密度可达关系导出的最大的密度相连的样本集合

步骤:一开始任意选择一个没有被标记的核心对象,找到它的所有密度可达对象,即一个簇,这些核心对象以及它们ε邻域内的点被标记为同一个类;然后再找一个未标记过的核心对象,重复上边的步骤,直到所有核心对象都被标记为止。

伪代码如下:
在这里插入图片描述
为了更好理解,我们看4.2节中西瓜的例子,聚类的过程如下:

  • 先找出核心对象集合 { x 3 , x 5 , x 6 , x 8 , x 9 , . . . , x 29 } \lbrace x_3,x_5,x_6,x_8,x_9,...,x_{29}\rbrace {x3,x5,x6,x8,x9,...,x29}
  • 随机选择一个作为种子,假定为 x 8 x_8 x8
  • 则生成的簇为 C 1 = { x 6 , x 7 , x 8 , x 10 , x 12 , x 18 , x 19 , x 20 , x 23 } C_1 = \lbrace x_6,x_7,x_8,x_{10},x_{12},x_{18},x_{19},x_{20},x_{23}\rbrace C1={x6,x7,x8,x10,x12,x18,x19,x20,x23}
  • C 1 C_1 C1中包含的核心对象从核心对象集合中剔除
  • 从对象集合中随机选择一个核心对象作为种子来生成下一个簇
  • 重复上述过程,直到核心对象集合没有元素为止

聚类过程各阶段的结果如下:
在这里插入图片描述

6. 层次聚类

层次聚类试图在不同层次对数据进行划分,从而形成树形的聚类结构,可采用“自底向上”或“自顶向下”的策略。

AGNES是一种采用自底向上的层次聚类算法,它先将每个样本看做是一个簇,在运行的每一步中找出距离最近的两个簇进行合并,不断重复上述过程,直至达到预设的簇个数。距离可以选择最小距离、最远距离或者平均距离。

伪代码如下:
在这里插入图片描述
上面西瓜的例子聚类的过程用树状图可以表示如下图:
在这里插入图片描述
聚类的效果图如下:
在这里插入图片描述

7. 参考

周志华《机器学习》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值