周志华《机器学习》西瓜书
第9章 聚类
文章目录
一、为什么要聚类
在无监督学习中,训练样本的标记信息是未知的。目标是对无标记的训练样本的学习,来揭示数据的内在性质和规律,为进一步的数据分析提供基础。包括有:
- 聚类(研究和应用最多的)
- 密度估计
- 异常检测
二、什么是聚类
将相似的对象归入同一个“类”。
“Birds of a feather flock together. ”
“物以类聚,人以群分。”
- 发现数据的结构,使得同一个类中的对象互相之间关联更强。
- 同一个类中的对象相似(similarity)
- 不同类中的对象有明显的差异
- 核心问题:相似度的度量(这就牵扯到相似度的定义)
- 簇/类内(intra-cluster)相似度(相似性要尽可能大)
- 簇/类间(inter-cluster)相似度(相似性要尽可能小,或者是差异性要尽可能大)
三、性能度量
为什么需要性能度量
首先我们要明确一个指标(性能度量)来评估其好坏;其次 ,在明确了要使用的性能度量,可以将其作为性能优化的目标,从而更好的得到符合要求的聚类结果。
性能度量的分类
外部指标
- Jaccard系数
- FM指数
- Rand指数
内部指标
- DB指数
- Dunn指数
四、原型聚类
通常情况下,算法先对原型进行初始化,再对原型进行迭代更新求解。采用不同的原型表示、不同的求解方式将产生不同的算法
k-mean算法
核心逻辑
k-mean算法的基本逻辑是最小化E值
算法流程
- 初始化:从样本集D中随机选择k个样本作为初始均值向量 { u 1 , u 2 , … , u k } \{u_1, u_2, \dots, u_k\} {u1,u2,…,uk}
- 循环部分
- 将各类内的样本清空
- 将均值向量(到样本最近的那一个)作为该样本的类标记,并将该样本划入相应的类
- 更新各类的均值向量
- 循环步骤2,直至每个类的均值向量都未更新
- 输出聚类结果
算法特点
优点:
- 原理简单,容易实现
- 可解释度较强
缺点:
- K值很难确定可能陷入局部最优
- 对噪音和异常点敏感
- 聚类效果依赖于聚类中心的初始化
- 对于非凸数据集或类别规模差异太大的数据效果不好
学习向量量化(Learning Vector Quantization)
核心逻辑
学习向量量化同k-means聚类类似,也是试图找到一组原型向量来刻画聚类结构。不同的是,LVQ针对于带有类别标记的数据样本,学习过程利用样本的监督信息(类别标记)来辅助聚类。
算法流程
- 初始化:从样本集D中随机选择q个样本作为原型向量 { p 1 , p 2 , … , p q } \{p_1, p_2, \dots, p_q\} {p1,p2,…,pq}
- 循环部分
- 随机选取一个样本 : x j x_j xj
- 找到原型向量: p p p(到样本最近的那一个)
- 更新该原型向量
- 原型向量与该样本为同一类: p ′ = p + η ( x j − p ) p'=p+\eta(x_j-p) p′=p+η(xj−p)(更新后 p ′ p' p′更接近 x j x_j xj)
- 原型向量与该样本为不同类: p ′ = p − η ( x j − p ) p'=p-\eta(x_j-p) p′=p−η(xj−p)(更新后 p ′ p' p′更远离 x j x_j xj)
- 循环步骤2,直至满足停止条件
- 输出原型向量
高斯混合聚类
核心逻辑
假设每个类中的样本都服从一个多维高斯分布,那么空间中的样本可以看作由k个多维高斯分布混合而成
- 多维高斯分布
- 高斯混合分布
该分布共由 k k k 个混合成分组成,每个混合成分对应一个高斯分布。其中 μ i \mu_i μi 与 Σ i \Sigma_i Σi 是第 i i i 个高斯混合成分的参数,而 α i \alpha_i αi>0为相应的“混合系数”(mixturecoeficient), ∑ i = 1 k a i = 1 \sum_{i=1}^ka_i=1 ∑i=1kai=1.所以我们假设样本的生产过程如下:-
首先根据 α 1 , α 2 , … , α k \alpha_1,\alpha_2,\dots,\alpha_k α1,α2,…,αk定义的先验分布(k个类在整个样本空间的分布概率,显然满足 ∑ i = 1 k α i = 1 \displaystyle \sum_{i=1}^k \alpha_i =1 i=1∑kαi=1)
-
然后根据每个类的概率密度函数进行采样,进而生成相应的样本。
-
若训练集 D = { x 1 , x 1 , … , x m } D=\{x_1,x_1,\dots,x_m\} D={x1,x1,…,xm}由上述过程(高斯混合分布)生成,对于样本 x j ( j ∈ 1 , 2 , … , k ) x_j(j\in1,2,\dots,k) xj(j∈1,2,…,k)的高斯混合成分由随机变量 z j z_j zj 给出。显然, z j z_j zj 的先验概率( z j z_j zj是第 i i i 类的概率) P ( z j = i ) ( i ∈ 1 , 2 , … , k ) P(z_j=i)(i\in1,2,\dots,k) P(zj=i)(i∈1,2,…,k),对应于 α i ( i ∈ 1 , 2 , … , k ) \alpha_i(i\in1,2,\dots,k) αi(i∈1,2,…,k)。
我们现在想知道对于某一个数据应该划入哪个类,我们的做法是在高斯混合分布中哪个高斯分布的概率大,那么该数据就划分为该高斯分布对应的类中,也就对应条件概率
p
m
(
z
j
=
i
∣
x
j
)
p_m(z_j=i|x_j)
pm(zj=i∣xj) ,意思就是在知道
x
j
x_j
xj 的前提,由第
i
i
i 个高斯分布生成的概率,根据贝叶斯公式有:
p
m
(
z
j
=
i
∣
x
j
)
=
P
(
z
j
=
i
)
⋅
p
m
(
x
j
∣
z
j
=
i
)
p
m
(
x
j
)
=
α
i
⋅
p
(
x
j
∣
μ
i
,
Σ
i
)
∑
l
=
1
k
α
l
⋅
p
(
x
j
∣
μ
l
,
Σ
l
)
\begin{align*} p_m(z_j=i|x_j)&=\frac {P(z_j=i)\cdot p_m(x_j|z_j=i)}{p_m(x_j)} \\ &=\frac {\alpha_i\cdot p(x_j|\mu_i,\Sigma _i)}{\displaystyle \sum _{l=1}^{k}\alpha_l\cdot p(x_j|\mu_l, \textstyle \Sigma_l)} \end{align*}
pm(zj=i∣xj)=pm(xj)P(zj=i)⋅pm(xj∣zj=i)=l=1∑kαl⋅p(xj∣μl,Σl)αi⋅p(xj∣μi,Σi)
但是问题来了,在求该概率时,公式分子和分母都存在某一分布的概率密度,我们只是知道符合高斯分布,但是具体的参数(均值向量
μ
\mu
μ和协方差矩阵
Σ
\Sigma
Σ)是不知道的,那么怎么获得概率密度函数呢?
采用极大似然估计的方式,就是我们的样本数据出现在对应分布的概率乘积达到最大,所以我们就要进行最大化(对数)似然:
L
L
(
D
)
=
ln
(
∏
j
=
1
m
p
m
(
x
j
)
)
=
∑
j
=
1
m
ln
(
∑
i
=
1
k
α
i
⋅
p
(
x
j
∣
μ
i
,
Σ
i
)
)
\begin{align*} LL(D)&=\ln\big(\prod_{j=1}^{m}p_m(x_j)\big)\\ &=\sum_{j=1}^{m}\ln\big(\sum_{i=1}^k\alpha_i\cdot p(x_j|\mu_i,\Sigma_i)\big) \end{align*}
LL(D)=ln(j=1∏mpm(xj))=j=1∑mln(i=1∑kαi⋅p(xj∣μi,Σi))
什么是极大似然估计?
上面我们说有些情况,我们只是知道数据符合的分布,但是不知道具体符合的参数为多少,就是我们只知道某某数据符合正态分布,但是正态分布的均值和方差我们是不知道的,所以要根据已有样本进行估计,其实就是将所有样本数据带入概率密度公式,会获得每个数据的概率,然后将各概率相乘,最终优化就是使该式子达到最大,为什么是最大?因为我们的数据符合该分布,也就是要我们的样本数据大概率的出现在该分布中,然后求出使概率乘积最大的参数。
对上述函数进行求导,然后令导数为0,分别求出对应的
μ
i
\mu_i
μi 和
Σ
i
\Sigma_i
Σi。然后求得:
算法流程
-
初始化:首先在算法开始前需要确立类的个数k,这也就对应着k个不同的高斯分布。初始化每个簇的高斯分布参数: μ , Σ , α , \mu,\Sigma,\alpha, μ,Σ,α, 用于构建高斯混合概率密度函数,由于是开始还没有数据,肯定是要随机给值的
-
循环部分:
- 计算每个样本由样本空间每个高斯混合成分生成的后验概率 γ j i = p m ( z j = i ∣ x j ) ( 1 ≤ i ≤ k ) \gamma_{ji}=p_m(z_j=i|x_j)(1\leq i \leq k) γji=pm(zj=i∣xj)(1≤i≤k)
- 然后利用计算好的 γ j i \gamma_{ji} γji 去计算新的 μ , Σ , α , \mu,\Sigma,\alpha, μ,Σ,α, 用新的参数去更新我们的高斯混合分布模型,获得新的概率密度函数
-
利用新的高斯混合分布模型计算每个样本的条件概率,重复循环部分,不断地进行更新模型分布参数直到模型收敛,达到一定精度,停止迭代。得到高斯混合分布模型。
-
根据我们新的模型参数获取每个样本的条件概率,然后获取的最大值,即 λ j = arg max i ∈ { 1 , 2 , … , k } γ j i \lambda_j=\displaystyle \argmax_{i\in\{1,2,\dots,k\}}\gamma_{ji} λj=i∈{1,2,…,k}argmaxγji,将其划分到相应的类中。输入类划分结果
五、密度聚类
密度聚类是一种基于密度的聚类算法。此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇来获得最终的聚类结果。
DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是具有噪声的基于密度的聚类方法。它基于一组“领域”参数 ( ϵ , M i n P t s ) (\epsilon ,MinPts) (ϵ,MinPts) 来刻画样本分布的紧密程度。给出一些概念:
- ϵ \epsilon ϵ-领域:样本集中与某一样本距离不大于 ϵ \epsilon ϵ 的样本子集(领域的半径,由我们给出,是超参数)
- M i n P t s MinPts MinPts:在所有样本的 ϵ \epsilon ϵ-领域中的最少点数 (领域的最小点数,以此来判定核心对象,由我们给出,是超参数)
- 核心对象:一个对象的 ϵ \epsilon ϵ-领域的点数 ≥ M i n P t s \geq MinPts ≥MinPts
- 噪声:不属于任何簇的对象(孤立点)
- 边界点:不是核心对象,但落在某个核心对象的
ϵ
\epsilon
ϵ-领域内的对象
- 密度直达/直接密度可达:若 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 i − > x j x_i ->x_j xi−>xj)间接的达到,称 x j x_j xj由 x i x_i xi密度可达。
- 密度相连:对于 x i x_i xi和 x j x_j xj,如果他们相互密度可达(双向密度可达),称为密度相连。
核心逻辑
基于以上概念,DBSCAN给出类的定义:由密度可达关系导出的最大的密度相连样本集合。而实际上我们需要做的是:对于任意核心对象,找出其所有密度可达的样本集合,这个集合就是一个满足连接性与最大性的簇/类。
算法流程
- 初始化:根据给定的领域参数 ( ϵ , M i n P t s ) (\epsilon ,MinPts) (ϵ,MinPts) 找出核心对象集合
- 循环部分:从核心对象集合中随机挑选一个核心对象,根据密度可达,找出最大的密度相连的样本集合(簇/类),然后把被划分到该簇中的核心对象和样本从核心对象集合和样本集合中去除。
- 重复循环部分,直至核心对象集合为空。输出类划分结果。
算法特点
优点:
- 生成任意形状的簇:能克服基于距离的算法只能发现“类圆形”的聚类的缺点可发现任意形状的聚类
- 抗噪声:有效地处理数据集中的噪声数据
- 数据输入顺序不敏感
缺点:
- 由于在DBSCAN算法中,变量ε,MinPts是全局惟一的, 当样本集的密度不均匀、聚类间距离相差很大时,聚类质量较差。
- 如果样本集较大时,聚类收敛时间长:计算密度单元的计算复杂度大,需要建立空间索引来降低计算量,且对数据维数的伸缩性较差。这类方法需要扫描整个数据库,每个数据对象都可能引起一次查询,因此当数据量大时会造成频繁的I/O操作。
- 相对于传统的k-mean之类的聚类算法,调参复杂,主要对
(
ϵ
,
M
i
n
P
t
s
)
(\epsilon ,MinPts)
(ϵ,MinPts) 联合调参,不同的参数组合对最后的聚类结果有较大影响。
**密度阀值 M i n P t s MinPts MinPts的选取:**指导性原则是 M ≥ d i m + 1 M\geq dim+1 M≥dim+1 ,dim为数据空间维度
六、层次聚类
层次聚类通过对数据集在不同层次进行划分,从而形成树形的聚类结构。数据集的划分可采用“自底向上”的聚合(agglomerative)策略,也可采用“自顶向下”的分拆(divisive)策略。“自底而上”的算法开始时把每一个原始数据看作一个单一的聚类簇,然后不断聚合小的聚类簇成为大的聚类。“自顶向下”的算法开始把所有数据看作一个聚类,通过不断分割大的聚类直到每一个单一的数据都被划分。
根据聚类簇之间距离的计算方法的不同,层次聚类算法可以大致分为:单链接(Single-link)算法,全链接算法(complete-link)或均链接算法(average-link)
- 单链接算法用两个聚类簇中最近的样本距离作为两个簇之间的距离;
- 而全链接使用计算两个聚类簇中最远的样本距离;
- 均链接算法中两个聚类之间的距离由两个簇中所有的样本共同决定。
AGNES算法
核心逻辑
AGNES 是一种采用自底向上聚合策略的层次聚类算法。它先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直至达到预设的聚类簇个数。这里的关键是如何计算聚类簇之间的距离。实际上,每个簇是一个样本集合,因此,只需采用关于集合的某种距离即可。就是我们上面提到的聚类簇之间距离的计算方法。
算法流程
- 初始化:初始化样本,每个样本作为一个初始聚类簇,初始化簇间距离矩阵。
- 循环部分:合并距离最近的聚类簇,并对合并得到的聚类簇的距离矩阵进行更新。
- 重复循环部分直到达到预设的聚类簇数。