聚类分析
在"无监督学习" (unsupervised learning) 中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。此类学习任务中研究最多、应用最广的是"聚类"(clustering)
聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个"簇" (cluster)。通过这样的划分,每个簇可能对应于一些潜在的概念(类别)。需说明的是,这些概念对聚类算法而言事先是未知的,聚类过程仅能自动形成簇结构,簇所对应的概念语义需由使用者来把握和命名
形式化地说,假定样本集 D = { x 1 , x 2 , … , x m } D=\left\{\boldsymbol{x}_{1}, \boldsymbol{x}_{2}, \ldots, \boldsymbol{x}_{m}\right\} D={x1,x2,…,xm}包含 m m m个无标记样本,每个样本 x i = ( x i 1 , x i 2 , … , x i n ) \boldsymbol{x}_{i}=\left(x_{i 1}, x_{i 2}, \ldots, x_{i n}\right) xi=(xi1,xi2,…,xin)是一个 n n n维特征向量,则聚类算法将样本集 D D D划分为 k k k个不相交的簇 { C l ∣ l = 1 , 2 ; … , k } \left\{C_{l} \mid l=1,2 ; \ldots, k\right\} {Cl∣l=1,2;…,k}, 其中 C l ′ ⋂ l ′ ≠ l C l = ∅ C_{l^{\prime}} \bigcap_{l^{\prime} \neq l} C_{l}=\varnothing Cl′⋂l′=lCl=∅且 D = ⋃ l = 1 k C l D=\bigcup_{l=1}^{k} C_{l} D=⋃l=1kCl, 相应地,我们用 λ j ∈ { 1 , 2 , … , k } \lambda_{j} \in\{1,2, \ldots, k\} λj∈{1,2,…,k}来表示样本 x j \boldsymbol{x}_{\boldsymbol{j}} xj的"簇标记" (cluster label) ,即 x j ∈ C λ j \boldsymbol{x}_{j} \in C_{\lambda_{j}} xj∈Cλj, 于是,聚类的结果可用包含 m m m个元素的簇标记向量 λ = ( λ 1 ; λ 2 ; … ; λ m ) \boldsymbol{\lambda}=\left(\lambda_{1} ; \lambda_{2} ; \ldots ; \lambda_{m}\right) λ=(λ1;λ2;…;λm)表示
聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程。例如,在一些商业应用中需对新用户的类型进行判别,且定义"用户类型"对商家来说却可能不太容易,此时往往可先对用户数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类模型,用于判别新用户的类型
基于不同的学习策略,人们设计出多种类型的聚类算法,主要代表为K-means和DBSCAN,在讲解这两个聚类算法前,先谈谈聚类算法涉及的两个基本问题:性能度量和距离计算
性能度量
与监督学习中的性能度量作用相似,对聚类结果,我们需通过某种性能度量来评估其好坏,另一方面,若明确了最终将要使用的性能度量,则可直接将其作为聚类过程的优化目标,从而更好地得到符合要求的聚类结果
聚类是将样本集 D D D划分为若干互不相交的子集,即样本簇,那么什么样的聚类结果比较好呢?直观上看,我们希望"物以类聚",即同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同。换言之,聚类结果的"簇内相似度" (intra-cluster similarity) 高且"簇间相似度" (inter-cluster similarity) 低
聚类性能度量大致有两类:一类是将聚类结果与某个"参考模型" (reference model)进行比较,称为"外部指标" (external index)、另一类是直接考察聚类结果而不利用任何参考模型,称为"内部指标" (internal index)
对具体的一些性能度量指标感兴趣可查看西瓜书
距离计算
-
闵可夫斯基距离
dist m k ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 p \operatorname{dist}_{\mathrm{mk}}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left(\sum_{u=1}^{n}\left|x_{i u}-x_{j u}\right|^{p}\right)^{\frac{1}{p}} distmk(xi,xj)=(u=1∑n∣xiu−xju∣p)p1
p = 2 p=2 p=2即为欧氏距离, p = 1 p=1 p=1即为曼哈顿距离,也称出租车距离定义域为 { 飞机,火车,轮船 } \{飞机,火车,轮船\} {飞机,火车,轮船}这样的离散属性则不能直接在属性值上计算闵可夫斯基距离距离,称为"无序属性"
-
对无序属性可采用VDM距离,对VDM距离感兴趣可查看西瓜书
-
需注意的是,通常我们是基于某种形式的距离来定义"相似度度量" (similarity measure) ,距离越大,相似度越小。然而,用于相似度度量的距离未必一定要满足距离度量的所有基本性质,尤其是三角不等式,例如在某些任务中我们可能希望有这样的相似度度量:“人”、 " 马" 分别与"人马"相似,但"人"与" 马"很不相似。要达到这个目的,可以令"人"、“马"与"人马"之间的距离都比较小,但"人"与"马"之间的距离很大,如下图所示,此时该距离不再满足三角不等式,这样的距离称为"非度量距离”(non-metric distance)
K-means
算法推导
原型聚类亦称"基于原型的聚类" (prototype based clustering)) 此类算法假设聚类结构能通过一组原型刻画,在现实聚类任务中极为常用.通常情形下,算法先对原型进行初始化,然后对原型进行迭代更新求解。K-means是原型聚类算法最经典的代表
给定样本集
D
=
{
x
1
,
x
2
,
…
,
x
m
}
D=\left\{\boldsymbol{x}_{1}, \boldsymbol{x}_{2}, \ldots, \boldsymbol{x}_{m}\right\}
D={x1,x2,…,xm}, K-means算法针对聚类所得簇划分
C
=
{
C
1
,
C
2
,
…
,
C
k
}
\mathcal{C}=\left\{C_{1}, C_{2}, \ldots, C_{k}\right\}
C={C1,C2,…,Ck}最小化平方误差
E
=
∑
i
=
1
k
∑
x
∈
C
i
∥
x
−
μ
i
∥
2
2
E=\sum_{i=1}^{k} \sum_{\boldsymbol{x} \in C_{i}}\left\|\boldsymbol{x}-\boldsymbol{\mu}_{i}\right\|_{2}^{2}
E=i=1∑kx∈Ci∑∥x−μi∥22
其中
μ
i
=
1
∣
C
i
∣
∑
x
∈
C
i
x
\boldsymbol{\mu}_{i}=\frac{1}{\left|C_{i}\right|} \sum_{\boldsymbol{x} \in C_{i}} \boldsymbol{x}
μi=∣Ci∣1∑x∈Cix是簇
C
i
C_{i}
Ci的均值向量,直观来看
E
E
E在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度,
E
E
E值越小则簇内样本相似度越高。找到它的最优解需考察样本集
D
D
D所有可能的簇划分,这是一个NP难问题,因此,K-means算法采用了贪心策略,通过迭代优化来近似求解
算法流程
算法流程如下:
算法小结
- K-means算法采用了贪心策略,通过迭代优化来近似求解,算法收敛速度较快
- K-means聚合出来的族更倾向于球状或者说凸形的簇,不容易发现基于连通性的簇、K-means对异常值敏感、K-means需要调K值
DBSCAN
算法推导
密度聚类亦称"基于密度的聚类" (density-based clustering) ,此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果,DBSCAN是密度聚类算法最经典的代表
给定数据集 D = { x 1 , x 2 , … , x m } D=\left\{\boldsymbol{x}_{1}, \boldsymbol{x}_{2}, \ldots, \boldsymbol{x}_{m}\right\} D={x1,x2,…,xm}, 定义下面这几个概念:
-
ϵ \epsilon ϵ-邻域
N ϵ ( x j ) = { x i ∈ D ∣ dist ( x i , x j ) ⩽ ϵ } N_{\epsilon}\left(\boldsymbol{x}_{j}\right)=\left\{\boldsymbol{x}_{i} \in D \mid \operatorname{dist}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right) \leqslant \epsilon\right\} Nϵ(xj)={xi∈D∣dist(xi,xj)⩽ϵ} -
核心对象(core object):若 x j \boldsymbol{x}_{j} xj的 ϵ \epsilon ϵ-邻域至少包含 M i n P t s MinPts MinPts个样本,即 ∣ N ϵ ( x j ) ∣ ⩾ M i n P t s \left|N_{\epsilon}\left(\boldsymbol{x}_{j}\right)\right| \geqslant MinPts ∣Nϵ(xj)∣⩾MinPts, 则 x j \boldsymbol{x}_{j} xj是一个核心对象
-
密度直达(directly density-reachable):若 x j \boldsymbol{x}_{j} xj位于 x i \boldsymbol{x}_{i} xi的 ϵ \epsilon ϵ-邻域中,且 x i \boldsymbol{x}_{i} xi是核心对象,则称 x j \boldsymbol{x}_{j} xj由 x i \boldsymbol{x}_{i} xi密度直达
-
密度可达(density-reachable):对 x i \boldsymbol{x}_{i} xi与 x j \boldsymbol{x}_{j} xj, 若存在样本序列 p 1 , p 2 , … , p n \boldsymbol{p}_{1}, \boldsymbol{p}_{2}, \ldots, \boldsymbol{p}_{n} p1,p2,…,pn, 其中 p 1 = x i , p n = x j \boldsymbol{p}_{1}=\boldsymbol{x}_{i}, \boldsymbol{p}_{n}=\boldsymbol{x}_{j} p1=xi,pn=xj且 p i + 1 \boldsymbol{p}_{i+1} pi+1由 p i \boldsymbol{p}_{i} pi密度直达,则称 x j \boldsymbol{x}_{j} xj由 x i \boldsymbol{x}_{i} xi密度可达
-
密度相连(density-connected):对 x i \boldsymbol{x}_{i} xi与 x j \boldsymbol{x}_{j} xj, 若存在 x k \boldsymbol{x}_{k} xk使得 x i \boldsymbol{x}_{i} xi与 x j \boldsymbol{x}_{j} xj均由 x k \boldsymbol{x}_{k} xk密度可达,则称 x i \boldsymbol{x}_{i} xi与 x j \boldsymbol{x}_{j} xj密度相连
下图给出了上述概念的直观显示
基于这些概念,DBSCAN 将"簇"定义为:由密度可达关系导出的最大的密度相连样本集合,形式化地说,给定邻域参数 ( ϵ , M i n P t s ) (\epsilon, MinPts) (ϵ,MinPts), 簇 C ⊆ D C \subseteq D C⊆D是满足以下性质的非空样本子集:
- 连接性(connectivity): x i ∈ C , x j ∈ C ⇒ x i 与 x j 密度相连 \boldsymbol{x}_{i} \in C, \boldsymbol{x}_{j} \in C \Rightarrow \boldsymbol{x}_{i} \text { 与 } \boldsymbol{x}_{j} \text { 密度相连 } xi∈C,xj∈C⇒xi 与 xj 密度相连
- 最大性(maximality): x i ∈ C , x j 由 x i 密度可达 ⇒ x j ∈ C \boldsymbol{x}_{i} \in C, \boldsymbol{x}_{j} \text { 由 } \boldsymbol{x}_{i} \text { 密度可达 } \Rightarrow \boldsymbol{x}_{j} \in C xi∈C,xj 由 xi 密度可达 ⇒xj∈C
若
x
\boldsymbol{x}
x为核心对象,由
x
\boldsymbol{x}
x密度可达的所有样本组成的集合记为
X
=
{
x
′
∈
D
∣
x
′
由
x
密度可达
}
X=\left\{\boldsymbol{x}^{\prime} \in D \mid \boldsymbol{x}^{\prime} \text { 由 } \boldsymbol{x} \text { 密度可达 }\right\}
X={x′∈D∣x′ 由 x 密度可达 }
则不难证明
X
X
X即为满足连接性与最大性的簇
于是,DBSCAN算法先任选数据集中的一个核心对象为"种子" (seed),再由此出发确定相应的聚类簇
算法流程
算法流程如下:
算法小结
- DBSCAN是基于密度的聚类,容易发现基于连通性的簇,但也容易被连通性引导导致聚合结果某些情况下不是我们想要的
- DBSCAN随数据点数增多而计算量显著增大,收敛速度较慢(相比K-means而言)
- DBSCAN对噪声数据不敏感,需要调节 ϵ , M i n P t s \epsilon,MinPts ϵ,MinPts参数,对输入参数 ϵ , M i n P t s \epsilon,MinPts ϵ,MinPts敏感,可以自动排除一部分噪声数据,不需要调节 k k k值,聚合结果的簇数是自动生成的
- 为了辅助参数 ϵ \epsilon ϵ的确定,可以采用如下方法:给定 k k k值(比如取 k = M i n P t s k=MinPts k=MinPts),计算数据中每个对象与其第 k k k最近邻居之间的距 k d i s t kdist kdist,并对 k d i s t kdist kdist值由大到小排序,随后以对象在排序后的 k d i s t kdist kdist序列中的序号作为横坐标,对应的 k d i s t kdist kdist值作为纵坐标,绘制出二维 k d i s t kdist kdist曲线图。用户将 k d i s t kdist kdist曲线由陡峭转为平缓的拐点处的 k d i s t kdist kdist值设置为参数Eps。在实际操作中,通过这种交互式方法确定的 ϵ \epsilon ϵ具有一定的合理性,但需要过多的人工参与
参考资料
- Ester, M. , et al. “A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise.” AAAI Press(1996).
AGNES
算法推导
层次聚类(hierarchical clustering)试图在不同层次对数据集进行划分,从而形成树形的聚类结构。数据集的划分可采用"自底向上"的聚合策略,也可采用"自顶向下" 的分拆策略
AGNES是一种采用自底向上聚合策略的层次聚类算法。它先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个簇进行合并,该过程不断重复,直至达到预设的聚类簇个数。这里的关键是如何计算聚类簇之间的距离。实际上每个簇是一个样本集合,因此,只需采用关于集合的某种距离即可。例如,给定聚类簇
C
i
C_{i}
Ci与
C
j
C_{j}
Cj, 可通过下面的式子来计算距离:
最小距离:
d
min
(
C
i
,
C
j
)
=
min
x
∈
C
i
,
z
∈
C
j
dist
(
x
,
z
)
,
最大距离:
d
max
(
C
i
,
C
j
)
=
max
x
∈
C
i
,
z
∈
C
j
dist
(
x
,
z
)
,
平均距离:
d
avg
(
C
i
,
C
j
)
=
1
∣
C
i
∣
∣
C
j
∣
∑
x
∈
C
i
∑
z
∈
C
j
dist
(
x
,
z
)
.
\begin{aligned} &\text { 最小距离: } d_{\min }\left(C_{i}, C_{j}\right)=\min _{\boldsymbol{x} \in C_{i}, \boldsymbol{z} \in C_{j}} \operatorname{dist}(\boldsymbol{x}, \boldsymbol{z}),\\ &\text { 最大距离: } d_{\max }\left(C_{i}, C_{j}\right)=\max _{x \in C_{i}, \boldsymbol{z} \in C_{j}} \operatorname{dist}(\boldsymbol{x}, \boldsymbol{z}),\\ &\text { 平均距离: } d_{\text {avg }}\left(C_{i}, C_{j}\right)=\frac{1}{\left|C_{i}\right|\left|C_{j}\right|} \sum_{\boldsymbol{x} \in C_{i}} \sum_{z \in C_{j}} \operatorname{dist}(\boldsymbol{x}, \boldsymbol{z}) \text { . } \end{aligned}
最小距离: dmin(Ci,Cj)=x∈Ci,z∈Cjmindist(x,z), 最大距离: dmax(Ci,Cj)=x∈Ci,z∈Cjmaxdist(x,z), 平均距离: davg (Ci,Cj)=∣Ci∣∣Cj∣1x∈Ci∑z∈Cj∑dist(x,z) .
显然最小距离由两个簇的最近样本决定,最大距离由两个簇的最远样本决定,而平均距离则由两个簇的所有样本共同决定。当采用最小距离、最大距离和平均距离时,AGNES算法被相应地称为"单链接" (single-linkage) 、“全链接” (complete-linkage) 或"均链接" (average-linkage) 算法
算法流程
算法流程如下:
算法小结
- AGNES是一种采用自底向上聚合策略的层次聚类算法,简单易于理解,聚类效果较好
- AGNES需要计算聚类簇之间的距离,所以速度较慢
- AGNES需要调 k k k值,需要调节采用的聚类簇之间的距离度量,对聚类簇之间的距离度量选取敏感,不同的聚类簇之间的距离度量的选取会导致不同的效果,所以如果没有选择到合适的距离度量,可能结果不是我们想要的
- 采用最小距离,即"单链接" (single-linkage)时,AGNES可以起到和DBSCAN类似的效果,即聚类结果能够体现连通性