机器学习 第9章-聚类

9.1 聚类任务

在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。此类学习任务中研究最多、应用最广的是“聚类”(clustering)。

聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster)。通过这样的划分,每个簇可能对应于一些潜在的概念(类别),如“浅色瓜”“深色瓜”,“有籽瓜”“无籽瓜”,甚至“本地瓜”“外地瓜”等;需说明的是,这些概念对聚类算法而言事先是未知的,聚类过程仅能自动形成簇结构,簇所对应的概念语义需由使用者来把握和命名。

形式化地说,假定样本集D=x1,x2,...,xmD= {x_1,x_2,...,x_m}D=x1​,x2​,...,xm​包含m个无标记样本,每个样本xi=(xi1;xi2;。。。;xin)x_i=(x_{i1};x_{i2};。。。;x_{in})xi​=(xi1​;xi2​;。。。;xin​)是一个nnn维特征向量,则聚类算法将样本集DDD划分为kkk个不相交的簇Cl∣l=1,2,...,k{C_l|l=1,2,...,k}Cl​∣l=1,2,...,k,其中Cl′∩l′≠lCl=∅C_{l'}∩_{l'≠l}C_l=∅Cl′​∩l′=l​Cl​=∅且D=⋃l=1kClD=⋃^k_{l=1}C_lD=⋃l=1k​Cl​。 相应地,我们用λj∈1,2,...,kλ_j∈{1,2,...,k}λj​∈1,2,...,k表示样本xjx_jxj​的“簇标记”(cluster label),即xj∈Cλjx_j∈C_{λ_j}xj​∈Cλj​​,于是,聚类的结果可用包含mmm个元素的簇标记向量λ=(λ1;λ2;...;λm)λ=(λ_1;λ_2;...;λ_m)λ=(λ1​;λ2​;...;λm​)表示。

聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程。例如,在一些商业应用中需对新用户的类型进行判别,但定义“用户类型”对商家来说却可能不太容易,此时往往可先对用户数据进行聚类,根据聚类结果将每个定义为一个类,然后再基于这些类训练分类模型,用于判别新用户的类型。

基于不同的学习策略,人们设计出多种类型的聚类算法。本章后半部分将对不同类型的代表性算法进行介绍,但在此之前,我们先讨论聚类算法涉及的两个基本问题–性能度量和距离计算。

9.2 性能度量

聚类性能度量亦称聚类“有效性指标”。与监督学习中的性能度量作用相似,对聚类结果,我们需通过某种性能度量来评估其好坏;另一方面,若明确了最终将要使用的性能度量,则可直接将其作为聚类过程的优化目标,从而更好地得到符合要求的聚类结果。

聚类是将样本集D划分为若干互不相交的子集,即样本簇。那么,什么样的聚类结果比较好呢?直观上看,我们希望“物以类聚”,即同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同。换言之,聚类结果的“簇内相似度”(intra-cluster similarity)高且“簇间相似度”(inter-cluster similarity)低

聚类性能度量大致有两类,一类是将聚类结果与某个“参考模型”(reference model)进行比较,称为“外部指标”(external index);另一类是直接考察聚类结果而不利用任何参考模型,称为“内部指标”(internalindex)。

对数据集DDD,假定通过聚类给出的簇划分为CCC,参考模型给出的簇划分为C∗C^*C∗,相应地,令λλλ与λ∗λ^*λ∗分别表示与CCC和C∗C^*C∗对应的簇标记向量。我们将样本两两配对考虑,则有定义:
a=∣SS∣,SS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}a=|SS|,SS=\left \{ (x_i,x_j)|\lambda _i=\lambda _j, \lambda _i^*=\lambda _j^* ,i<j\right \}a=∣SS∣,SS={(xi​,xj​)∣λi​=λj​,λi∗​=λj∗​,i<j}
b=∣SD∣,SD={(xi,xj)∣λi=λj,λi∗≠λj∗,i<j}b=|SD|,SD=\left \{ (x_i,x_j)|\lambda _i=\lambda _j, \lambda _i^*\neq \lambda _j^* ,i<j\right \}b=∣SD∣,SD={(xi​,xj​)∣λi​=λj​,λi∗​=λj∗​,i<j}
c=∣DS∣,DS={(xi,xj)∣λi≠λj,λi∗=λj∗,i<j}c=|DS|,DS=\left \{ (x_i,x_j)|\lambda _i\neq \lambda _j, \lambda _i^*=\lambda _j^* ,i<j\right \}c=∣DS∣,DS={(xi​,xj​)∣λi​=λj​,λi∗​=λj∗​,i<j}
d=∣DD∣,DD={(xi,xj)∣λi≠λj,λi∗≠λj∗,i<j}d=|DD|,DD=\left \{ (x_i,x_j)|\lambda _i\neq \lambda _j, \lambda _i^*\neq \lambda _j^* ,i<j\right \}d=∣DD∣,DD={(xi​,xj​)∣λi​=λj​,λi∗​=λj∗​,i<j}
其中集合SS包含了在CCC中隶属于相同簇且在C∗C^*C∗中也隶属于相同簇的样本对,集合SD包含了在CCC中隶属于相同簇但在C∗C^*C∗中隶属于不同簇的样本对。

由于每个样本对(xi,xj)(i<j)(x_i,x_j)(i<j)(xi​,xj​)(i<j)仅能出现在一个集合中,因此有a+b+c+d=m(m−1)/2a+b+c+d=m(m-1)/2a+b+c+d=m(m−1)/2成立

基于以上可以导出下面这些常用的聚类性能度量外部指标:

Jaccard系数
JC=aa+b+cJC=\frac{a}{a+b+c}JC=a+b+ca​
FM指数
FMI=aa+b⋅aa+cFMI=\sqrt{\frac{a}{a+b}\cdot \frac{a}{a+c}}FMI=a+ba​⋅a+ca​​
Rand指数,RI=2(a+d)m(m−1)RI=\frac{2(a+d)}{m(m-1)} RI=m(m−1)2(a+d)​

显然,上述性能度量的结果值均在[0,1]区间,值越大越好

考虑聚类结果的簇划分C=C1,C2,...,CkC={C_1,C_2,...,C_k}C=C1​,C2​,...,Ck​,定义
avg(C)=2∣C∣(∣C∣−1)∑1≤i<j≤∣C∣dist(xi,xj)avg(C)=\frac{2}{|C|(|C|-1)}\sum_{1\leq i<j\leq |C|}dist(x_i,x_j)avg(C)=∣C∣(∣C∣−1)2​1≤i<j≤∣C∣∑​dist(xi​,xj​)
diam(C)=max1≤i<j≤∣C∣dist(xi,xj)diam(C)=max_{1\leq i<j\leq |C|}dist(x_i,x_j)diam(C)=max1≤i<j≤∣C∣​dist(xi​,xj​)
dmin(Ci,Cj)=minxi∈Ci,xj∈Cjdist(xi,xj)d_{min}(C_i,C_j)=min_{x_i\in C_i,x_j\in C_j}dist(x_i,x_j)dmin​(Ci​,Cj​)=minxi​∈Ci​,xj​∈Cj​​dist(xi​,xj​)
dcen(Ci,Cj)=dist(μi,μj)d_{cen}(C_i,C_j)=dist(\mu _i,\mu _j)dcen​(Ci​,Cj​)=dist(μi​,μj​)
其中,dist(⋅,⋅)dist(·,·)dist(⋅,⋅)用于计算两个样本之间的距离;μμμ代表簇CCC的中心点。显然, avg(C)avg(C)avg(C)对应于簇CCC内样本间的平均距离, diam(C)diam(C)diam(C)对应于簇CCC内样本间的最远距离,dmin(Ci,Cj)d_{min}(C_i,C_j)dmin​(Ci​,Cj​)对应于簇CiC_iCi​与簇CjC_jCj​最近样本间的距离, dcen(Ci,Cj)d_{cen}(C_i,C_j)dcen​(Ci​,Cj​) 对应于簇CiC_iCi​与簇CjC_jCj​中心点间的距离

基于以上4个式子,又可导出下面这些常用的聚类性能度量内部指标:
DB指数
DBI=1k∑i=1kmaxj≠i(avg(Ci)+avg(Cj)dcen(μi,μj))DBI=\frac{1}{k}\sum_{i=1}^{k}\underset{j\neq i}{max}(\frac{avg(C_i)+avg(C_j)}{d_{cen}(\mu _i,\mu _j)})DBI=k1​i=1∑k​j=imax​(dcen​(μi​,μj​)avg(Ci​)+avg(Cj​)​)

Dunn指数
DI=mini≤i≤k{minj≠i(dmin(Ci,Cj)max1≤l≤kdiam(Cl))}DI=\underset{i\leq i\leq k}{min}\left \{ \underset{j\neq i}{min}(\frac{d_{min}(C_i,C_j)}{max_{1\leq l\leq k}diam(C_l)})\right \}DI=i≤i≤kmin​{j=imin​(max1≤l≤k​diam(Cl​)dmin​(Ci​,Cj​)​)}

显然,DBIDBIDBI的值越小越好,而DIDIDI则相反,值越大越好

9.3 距离计算

对函数 dist(·,·),若它是一个“距离度量”(distance measure),则需满足些基本性质:非负性、同一性、对称性、直递性

给定样本xi=(xi1;xi2;。。。;xin)x_i=(x_{i1};x_{i2};。。。;x_{in})xi​=(xi1​;xi2​;。。。;xin​)与xj=(xj1;xj2;。。。;xjn)x_j=(x_{j1};x_{j2};。。。;x_{jn})xj​=(xj1​;xj2​;。。。;xjn​),最常用的是“闵可夫斯基距离”(Minkowski distance)
distmk(xi,xj)=(∑u=1n∣xiu−xju∣p)1p dist{mk}(x_i,x_j)=(\sum_{u=1}^{n}|x_{iu}-x_{ju}|^p)^{\frac{1}{p}} distmk(xi​,xj​)=(u=1∑n​∣xiu​−xju​∣p)p1​
p=2时,闵可夫斯基距离即欧氏距离;p=1时,闵可夫斯基距离即曼哈顿距离

我们常将属性划分为“连续属性”(continuous attribute)和“离散属性”(categorical attribute),前者在定义域上有无穷多个可能的取值,后者在定义域上是有限个取值。

然而,在讨论距离计算时,属性上是否定义了“序”关系更为重要。例如定义域为1,2,3{1,2,3}1,2,3的离散属性与连续属性的性质更接近一些能直接在属性值上计算距离:“1”与“2”比较接近、与“3”比较远,这样的属性称为“有序属性”(ordinal attribute);而定义域为飞机,火车,轮船{飞机,火车,轮船}飞机,火车,轮船这样的离散属性则不能直接在属性值上计算距离,称为“无序属性”(non-ordinalattribute)。显然,闵可夫斯基距离可用于有序属性,

对于无序属性采用的是VDM,令mu,am_{u,a}mu,a​表示在属性uuu上取值为aaa的样本,mu,a,im_{u,a,i}mu,a,i​表示在第iii个样本簇中在属性uuu上取值为aaa的样本数,kkk为样本簇数,那么属性uuu上两个离散值aaa和bbb之间的VDM距离可定义为:
VDMp(a,b)=∑i=1k∣mu,a,imu,a−mu,b,imu,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=1∑k​∣mu,a​mu,a,i​​−mu,b​mu,b,i​​∣p
于是,将闵可夫斯基距离和 VDM 结合即可处理混合属性。假定有ncn_cnc​个有序属性、n−ncn-n_cn−nc​个无序属性,不失一般性,令有序属性排列在无序属性之前,则
MinkovDMp(xi,xj)=(∑u=1nc∣xiu−xju∣p+∑u=nc+1nVDMp(xiu,xju))1p MinkovDM_p(x_i,x_j)=(\sum _{u=1}^{n_c}|x_{iu}-x_{ju}|^p+\sum _{u=n_c+1}^{n}VDM_p(x_{iu},x_{ju}))^\frac{1}{p} MinkovDMp​(xi​,xj​)=(u=1∑nc​​∣xiu​−xju​∣p+u=nc​+1∑n​VDMp​(xiu​,xju​))p1​

然而,用于相似度度量的距离未必一定要满足距离度量的所有基本性质,;这样的距离称为"非度量距离"

9.4 原型聚类

原型聚类亦称“基于原型的聚类”(prototype-based clustering),此类算法假设聚类结构能通过一组原型刻画,在现实聚类任务中极为常用。通常情形下算法先对原型进行初始化,然后对原型进行迭代更新求解。采用不同的原型表示、不同的求解方式,将产生不同的算法,下面介绍几种著名的原型聚类算法

9.4.1 k均值算法

给定样本集DDD,“k均值”(k-means)算法针对聚类所得簇划分C=C1,C2,..,CkC={C_1,C_2,..,C_k}C=C1​,C2​,..,Ck​最小化平方误差
E=∑i=1k∑x∈Ci∣∣x−ui∣∣22 E=\sum _{i=1}^{k}\sum _{x\in C_i}||x-u_i||_2^2 E=i=1∑k​x∈Ci​∑​∣∣x−ui​∣∣22​
k 均值算法采用了贪心策略,通过迭代优化来近似求解式。算法流程如图 9.2所示
在这里插入图片描述
其中第1行对均值向量进行初始化,在第4-8行与第9-16行依次对当前簇划分及均值向量选代更新,若迭代更新后聚类结果保持不变,则在第 18 行将当前簇划分结果返回。

在这里插入图片描述
实验代码:

import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
 
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=0.60, random_state=0)
 
k_means = KMeans(n_clusters=4)
k_means.fit(X)
 

centers = k_means.cluster_centers_
labels = k_means.labels_
 

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], marker='o', s=200, color='red')
plt.show()
plt.savefig("output.png")

在这里插入图片描述

实验图1 k均值算法结果图

9.4.2 学习向量量化

与k均值算法类似,“学习向量量化”(Learning Vector Quantization,简称 LVQ)也是试图找到一组原型向量来刻画聚类结构,但与一般聚类算法不同的是,LVQ假设数据样本带有类别标记,学习过程利用样本的这些监督信息来辅助聚类。

其算法流程如下图所示:
在这里插入图片描述

9.4.3 高斯混合聚类

对nnn维样本空间XXX中的随机向量xxx, 若xxx服从高斯分布,其概率密度函数为
p(x)=1(2π)n2∣Σ∣12e−12(x−u)TΣ−1(x−u) p(x)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma |^\frac{1}{2}}e^{-\frac{1}{2}(x-u)^T\Sigma ^{-1}(x-u)} p(x)=(2π)2n​∣Σ∣21​1​e−21​(x−u)TΣ−1(x−u)
将其记为p(x∣μ,∑)p(x|μ,∑)p(x∣μ,∑)

定义高斯混合分布:
pM(x)=∑i=1kαi⋅p(x∣μi,Σi) p_M(x)=\sum _{i=1}^{k}\alpha _i\cdot p(x|\mu _i,\Sigma _i) pM​(x)=i=1∑k​αi​⋅p(x∣μi​,Σi​)
其中α\alphaα为混合系数,该分布共由 k个混合成分组成,每个混合成分对应一个高斯分布。

假设样本的生成过程由高斯混合分布给出:首先,根据 α1,α2,。。。,αk\alpha_1,\alpha_2,。。。,\alpha_kα1​,α2​,。。。,αk​定义的先验分布选择高斯混合成分,其中αi\alpha_iαi​为选择第iii个混合成分的概率;然后,根据被选择的混合成分的概率密度函数进行采样,从而生成相应的样本。
其算法流程如下:
在这里插入图片描述

9.5 密度聚类

密度聚类亦称“基于密度的聚类”(density-based clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。

DBSCAN是一种著名的密度聚类算法,它基于一组“邻域”(neigh-borhood)参数(ϵ,MinPts)(\epsilon,MinPts)(ϵ,MinPts)来刻画样本分布的紧密程度。给定数据集D=x1,x2,...,xmD= {x_1,x_2,...,x_m}D=x1​,x2​,...,xm​,定义下面这几个概念:

ϵ−邻域,对xj∈D,其ϵ−邻域包含样本集D中与xj的距离不大于ϵ的样本,即Nϵ(xj)={xi∈D∣dist(xi,xj)≤ϵ}\epsilon-邻域,对x_j\in D,其\epsilon-邻域包含样本集D中与x_j的距离不大于\epsilon的样本,即N_\epsilon (x_j)=\left \{ x_i\in D|dist(x_i,x_j)\leq \epsilon \right \}ϵ−邻域,对xj​∈D,其ϵ−邻域包含样本集D中与xj​的距离不大于ϵ的样本,即Nϵ​(xj​)={xi​∈D∣dist(xi​,xj​)≤ϵ}
核心对象,若xj的ϵ−邻域至少包含MinPts个样本,即∣Nϵ(xj)∣≥MinPts,则xj是一个核心对象核心对象,若x_j的\epsilon-邻域至少包含MinPts个样本,即|N_\epsilon (x_j)|\geq MinPts,则x_j是一个核心对象核心对象,若xj​的ϵ−邻域至少包含MinPts个样本,即∣Nϵ​(xj​)∣≥MinPts,则xj​是一个核心对象
密度直达,若xj位于xi的ϵ−邻域中,其xi是核心对象,则xi和xj密度直达密度直达,若x_j位于x_i的\epsilon-邻域中,其x_i是核心对象,则x_i和x_j密度直达密度直达,若xj​位于xi​的ϵ−邻域中,其xi​是核心对象,则xi​和xj​密度直达
密度可达,对xi和xj,若存在样本序列p1,p2,⋯⋯ ,pn,其中p1=xi,pn=xj,且pi+1和pi密度直达,那么xi和xj密度可达密度可达,对x_i和x_j,若存在样本序列p_1,p_2,\cdots \cdots ,p_n,其中p_1=x_i,p_n=x_j,且p_{i+1}和p_i密度直达,那么x_i和x_j密度可达密度可达,对xi​和xj​,若存在样本序列p1​,p2​,⋯⋯,pn​,其中p1​=xi​,pn​=xj​,且pi+1​和pi​密度直达,那么xi​和xj​密度可达
密度相连,对xi和xj,若存在xk使得xi和xj均由xk密度可达,那么xi和xj密度相连密度相连,对x_i和x_j,若存在x_k使得x_i和x_j均由x_k密度可达,那么x_i和x_j密度相连密度相连,对xi​和xj​,若存在xk​使得xi​和xj​均由xk​密度可达,那么xi​和xj​密度相连

上述概念的直观显示:

在这里插入图片描述基于这些概念,DBSCAN将“簇”定义为:由密度可达关系导出的最大的密度相连样本集合.形式化地说,给定邻域参数(ϵ,MinPts)(\epsilon,MinPts)(ϵ,MinPts),簇C⊆DC⊆DC⊆D是满足连接性和最大性的非空样本子集.

DBSCAN算法先任选数据集中的一个核心对象为“种子”(seed)再由此出发确定相应的聚类簇,算法描述如图9.9所示。在第1-7行中,算法先根据给定的邻域参数(ϵ,MinPts)(\epsilon,MinPts)(ϵ,MinPts)找出所有核心对象;然后在第 10-24 行中以任一核心对象为出发点,找出由其密度可达的样本生成聚类簇,直到所有核心对象均被访问过为止。
在这里插入图片描述

9.6 层次聚类

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

AGNES 是一种采用自底向上聚合策略的层次聚类算法:它先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直至达到预设的聚类簇个数。这里的关键是如何计算聚类簇之间的距离。实际上,每个簇是一个样本集合,因此,只需采用关于集合的某种距离即可。例如,给定聚类簇CiC_iCi​与CjC_jCj​,可通过下面的式子来计算距离:
最小距离dmin(Ci,Cj)=minx∈Ci,z∈Cjdist(x,z)d_{min}(C_i,C_j)=\underset{x\in C_i,z\in C_j}{min}dist(x,z)dmin​(Ci​,Cj​)=x∈Ci​,z∈Cj​min​dist(x,z)

最大距离dmax(Ci,Cj)=maxx∈Ci,z∈Cjdist(x,z)d_{max}(C_i,C_j)=\underset{x\in C_i,z\in C_j}{max}dist(x,z)dmax​(Ci​,Cj​)=x∈Ci​,z∈Cj​max​dist(x,z)

平均距离davg(Ci,Cj)=1∣Ci∣∣Cj∣∑x∈Ci∑z∈Cjdist(x,z)d_{avg}(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum _{x\in C_i}\sum _{z\in C_j}dist(x,z)davg​(Ci​,Cj​)=∣Ci​∣∣Cj​∣1​x∈Ci​∑​z∈Cj​∑​dist(x,z)

显然,最小距离由两个簇的最近样本决定,最大距离由两个簇的最远样本决定,而平均距离则由两个簇的所有样本共同决定。

其算法流程如下图所示:
在这里插入图片描述

更多推荐