前言
最近工作忙起来了,看书的进度都拉下了……
第九章
在本章之前,我们所有的训练方式都是有监督的训练,本章我们将接触到无监督学习的一种——聚类任务
9.1 聚类与度量
在现实世界中,获取大量的已标记 数据通常是昂贵且耗时 的过程,甚至需要依赖专业人士进行标注;相比之下,未标记的数据在自然界和工业场景中非常普遍且容易获取 。这些未标记的数据可以通过聚类算法 自动发现数据中潜在的模式或规律,从而实现对样本的自动分类。这种分类结果既可以作为其他机器学习任务的预处理步骤 ,也能帮助识别那些不属于任何类别的异常样本(通常被视为噪声)。
聚类分析的核心目标 是:在完全没有先验知识 (即没有任何标记信息)的条件下,自动 将数据集划分为若干个具有明确意义的子集(簇) 。这些子集需要满足以下特性:同一簇内的样本应当尽可能相似 ,而不同簇之间的样本应当尽可能不同 。
在聚类任务中,我们需要明确以下数学表示:
将划分得到的子集 称为簇(cluster) ,用符号表示为C l , l ∈ { 1 , 2 , … , k } C_{l}, \quad l \in \{1,2,\dots,k\} C l , l ∈ { 1 , 2 , … , k } 其中k k k 表示簇的总数。
样本集(不含任何标记)记为D = { x 1 , x 2 , … , x m } D = \{\mathbf{x}_{1}, \mathbf{x}_{2}, \dots, \mathbf{x}_{m}\} D = { x 1 , x 2 , … , x m } 其中每个样本x i = ( x i 1 , x i 2 , … , x i n ) T \mathbf{x}_{i} = (x_{i1}, x_{i2}, \dots, x_{in})^{T} x i = ( x i 1 , x i 2 , … , x in ) T 用一个n n n 维特征向量表示其属性。
使用簇标记 来表示样本与簇的归属关系:对于样本x j \mathbf{x}_{j} x j ,若它属于簇C λ j C_{\lambda_{j}} C λ j ,则其簇标记为λ j ∈ { 1 , 2 , … , k } \lambda_{j} \in \{1,2,\dots,k\} λ j ∈ { 1 , 2 , … , k } 例如,若样本x 5 \mathbf{x}_{5} x 5 被划分到第8个簇,则记为x 5 ∈ C 8 \mathbf{x}_{5} \in C_{8} x 5 ∈ C 8 此时λ 5 = 8 \lambda_{5} = 8 λ 5 = 8
和有监督任务类似,我们需要性能度量来评估我们的模型,之前的2.1节中我们主要介绍的都是有监督的性能度量,对于无监督任务,我们一般分为2 2 2 大类:外部指标和内部指标。
外部指标
外部指标的核心思想是:将聚类算法给出的结果与一个已知的“真实”或“理想”的划分进行比较。 这个“真实划分”通常被称为参考模型 或 真实类别信息 。只有当这样的参考模型存在时,我们才能使用外部指标。
例如,假设我们有一批客户数据,并且已经通过人工标注或业务规则将这些客户划分为“高价值客户”、“潜力客户”、“一般客户”和“流失风险客户”四个类别(即参考模型)。现在,我们使用一个新的聚类算法对这些客户进行聚类,也得到了四个簇。外部指标的作用就是量化评估算法生成的簇划分与参考模型之间的匹配程度 ,从而判断聚类结果的准确性。
为了比较聚类模型和参考模型之间的差异,我们需要对同一组样本进行双重划分:
设聚类算法给出的簇划分为 C = { C 1 , C 2 , … , C k } C = \{C_1, C_2, \dots, C_k\} C = { C 1 , C 2 , … , C k }
参考模型的簇划分为 C ∗ = { C 1 ∗ , C 2 ∗ , … , C s ∗ } C^* = \{C_1^*, C_2^*, \dots, C_s^*\} C ∗ = { C 1 ∗ , C 2 ∗ , … , C s ∗ }
对于任意两个样本 ( x i , x j ) (\mathbf{x}_i, \mathbf{x}_j) ( x i , x j ) ,可以通过对比它们在 C C C 和 C ∗ C^* C ∗ 中的归属关系,得到以下四种情况:
SS(Same-Same) :x i \mathbf{x}_i x i 和 x j \mathbf{x}_j x j 在 C C C 中属于同一个簇,且在 C ∗ C^* C ∗ 中也属于同一个簇。
SD(Same-Different) :x i \mathbf{x}_i x i 和 x j \mathbf{x}_j x j 在 C C C 中属于同一个簇,但在 C ∗ C^* C ∗ 中属于不同簇。
DS(Different-Same) :x i \mathbf{x}_i x i 和 x j \mathbf{x}_j x j 在 C C C 中属于不同簇,但在 C ∗ C^* C ∗ 中属于同一个簇。
DD(Different-Different) :x i \mathbf{x}_i x i 和 x j \mathbf{x}_j x j 在 C C C 中属于不同簇,且在 C ∗ C^* C ∗ 中也属于不同簇。
统计满足以上四种情况的样本对数量,分别记为 a a a (SS)、b b b (SD)、c c c (DS)、d d d (DD)。由于每一对样本只能属于其中一种情况,因此有:
a + b + c + d = m ( m − 1 ) 2 a + b + c + d = \frac{m(m-1)}{2} a + b + c + d = 2 m ( m − 1 )
其中 m m m 是样本总数。
下面说明常见的外部指标
Jaccard 系数(JC)
公式:J C = a a + b + c JC = \frac{a}{a + b + c} J C = a + b + c a
分母 a + b + c a + b + c a + b + c 表示在聚类结果或参考模型中至少有一个模型将样本对划分为同簇的总对数,分子 a a a 表示两个模型均正确划分为同簇的对数。因此,JC 衡量的是聚类结果与参考模型在同簇判断上的一致性比例 。
取值范围 :[ 0 , 1 ] [0, 1] [ 0 , 1 ] ,值越大表示聚类结果与参考模型越吻合。
Fowlkes-Mallows 指数(FMI)
公式:F M I = a a + b ⋅ a a + c FMI = \sqrt{\frac{a}{a + b} \cdot \frac{a}{a + c}} FM I = a + b a ⋅ a + c a
解释 :
第一项 a a + b \frac{a}{a + b} a + b a 是精准率 ,表示聚类结果中同簇的样本对有多少在参考模型中也同簇。
第二项 a a + c \frac{a}{a + c} a + c a 是召回率 ,表示参考模型中同簇的样本对有多少在聚类结果中也同簇。
FMI 是两者的几何平均数,综合衡量聚类结果的精确性和完整性。
取值范围 :[ 0 , 1 ] [0, 1] [ 0 , 1 ] ,值越大表示聚类结果与参考模型的一致性越高。
Rand 指数(RI)
公式:R I = a + d a + b + c + d = 2 ( a + d ) m ( m − 1 ) RI = \frac{a + d}{a + b + c + d} = \frac{2(a + d)}{m(m - 1)} R I = a + b + c + d a + d = m ( m − 1 ) 2 ( a + d )
解释 :RI 计算的是所有样本对中,聚类结果与参考模型判断一致的比例 (包括同簇和不同簇)。可以理解为聚类结果的“整体准确率”。
取值范围 :[ 0 , 1 ] [0, 1] [ 0 , 1 ] ,值越大表示聚类结果越准确。
内部指标
接下来讨论在没有参考模型的情况下如何评估聚类效果,这时我们需要定义一个关键函数 d i s t dist d i s t ,它能够计算两个样本(向量)之间的距离 ,这种函数称为距离度量 。关于距离度量的具体细节会在下一节展开,这里先定义几个重要的量:
簇内平均距离 a v g ( C l ) avg(C_l) a vg ( C l )
该变量用于衡量簇 C l C_l C l 内所有样本距离的均值,即所有样本两两之间的距离求和再除以样本对的总数。这里需要注意样本对的计算方式 :对于大小为 ∣ C l ∣ |C_l| ∣ C l ∣ 的簇,共有 ∣ C l ∣ ( ∣ C l ∣ − 1 ) 2 \frac{|C_l|(|C_l|-1)}{2} 2 ∣ C l ∣ ( ∣ C l ∣ − 1 ) 个不同的样本对。其数学表达式为:
a v g ( C l ) = ∑ 1 ⩽ i < j ⩽ ∣ C l ∣ d i s t ( x i , x j ) ∣ C l ∣ ( ∣ C l ∣ − 1 ) / 2 = 2 ∣ C l ∣ ( ∣ C l ∣ − 1 ) ∑ 1 ⩽ i < j ⩽ ∣ C l ∣ d i s t ( x i , x j ) avg(C_{l})=\frac{\sum_{1\leqslant i<j\leqslant|C_l|}dist(\mathbf{x}_i,\mathbf{x}_j)}{|C_{l}|(|C_{l}|-1)/2}=\frac{2}{|C_l|(|C_l|-1)}\sum_{1\leqslant i<j\leqslant|C_l|}dist(\mathbf{x}_i,\mathbf{x}_j) a vg ( C l ) = ∣ C l ∣ ( ∣ C l ∣ − 1 ) /2 ∑ 1 ⩽ i < j ⩽ ∣ C l ∣ d i s t ( x i , x j ) = ∣ C l ∣ ( ∣ C l ∣ − 1 ) 2 1 ⩽ i < j ⩽ ∣ C l ∣ ∑ d i s t ( x i , x j )
直径 d i a m ( C l ) diam(C_{l}) d iam ( C l )
该变量用于衡量簇 C l C_{l} C l 内最远的两个样本之间的距离 ,即所有样本对距离的最大值。其数学表达式为:
d i a m ( C l ) = max 1 ≤ i < j ≤ ∣ C l ∣ d i s t ( x i , x j ) diam(C_{l})=\max_{1\leq i<j\leq |C_l|}dist(\mathbf{x}_{i},\mathbf{x}_{j}) d iam ( C l ) = 1 ≤ i < j ≤ ∣ C l ∣ max d i s t ( x i , x j )
簇间最短距离 d m i n ( C i , C j ) d_{min}(C_{i},C_{j}) d min ( C i , C j )
该变量用于衡量两个不同簇 C i C_i C i 和 C j C_j C j 之间最近的样本对距离 ,即从两个簇中各取一个样本,找到它们之间距离的最小值。其数学表达式为:
d m i n ( C i , C j ) = min x i ∈ C i , x j ∈ C j d i s t ( x i , x j ) d_{min}(C_{i},C_{j})=\min_{\mathbf{x}_{i}\in C_{i},\mathbf{x}_{j}\in C_{j}}dist(\mathbf{x}_{i},\mathbf{x}_{j}) d min ( C i , C j ) = x i ∈ C i , x j ∈ C j min d i s t ( x i , x j )
中心点 μ i \mu_{i} μ i
定义为簇 C i C_{i} C i 所有样本的向量均值(类比质心),其数学表达式为:
μ i = 1 ∣ C i ∣ ∑ x i ∈ C i x i \mu_{i} = \frac{1}{|C_{i}|}\sum_{\mathbf{x}_{i}\in C_{i}}\mathbf{x}_{i} μ i = ∣ C i ∣ 1 x i ∈ C i ∑ x i
两簇中心点的距离 d c e n ( C i , C j ) d_{cen}(C_{i},C_{j}) d ce n ( C i , C j )
直接计算两个簇中心点之间的距离:
d c e n ( C i , C j ) = d i s t ( μ i , μ j ) d_{cen}(C_{i},C_{j})=dist(\mu_{i},\mu_{j}) d ce n ( C i , C j ) = d i s t ( μ i , μ j )
也可以用中心点来定义簇内平均距离:a v g ( C l ) = 1 ∣ C l ∣ ∑ x ∈ C l d i s t ( x , μ l ) avg(C_l) = \frac{1}{|C_l|} \sum_{\mathbf{x} \in C_l} dist(\mathbf{x}, \mu_{l}) a vg ( C l ) = ∣ C l ∣ 1 ∑ x ∈ C l d i s t ( x , μ l ) ,但这种定义方式和上述定义并不等价,原因在于dist函数不一定具有线性性质
借助上述变量,我们可以定义常见的性能度量:
Davies-Bouldin 指数 (DBI)
其数学表达式为:
D B I = 1 k ∑ i = 1 k max j ≠ i ( a v g ( C i ) + a v g ( C j ) d i s t ( μ i , μ j ) ) DBI = \frac{1}{k} \sum_{i=1}^{k} \max_{j \neq i} \left( \frac{avg(C_i) + avg(C_j)}{dist(\mu_i, \mu_j)} \right) D B I = k 1 i = 1 ∑ k j = i max ( d i s t ( μ i , μ j ) a vg ( C i ) + a vg ( C j ) )
DBI 衡量的是每个簇的内部紧密度与其最相似簇的分离度之间的比值 。具体来说:
如果一个簇内部很分散(即 a v g ( C i ) avg(C_i) a vg ( C i ) 较大),或者它离某个其他簇很近(即 d i s t ( μ i , μ j ) dist(\mu_i, \mu_j) d i s t ( μ i , μ j ) 较小),都会导致 DBI 增大。
DBI 的值越小越好 ,0 是理论上的最优值,取值范围为 [ 0 , ∞ ) [0, \infty) [ 0 , ∞ ) 。
Dunn 指数 (DI)
其数学表达式为:
DI = min 1 ⩽ i ⩽ k { min j ≠ i ( d min ( C i , C j ) max 1 ⩽ l ⩽ k diam ( C l ) ) } \text{DI} = \min_{1\leqslant i\leqslant k}\left\{\min_{j\neq i}\left(\frac{d_{\min}(C_i, C_j)}{\max_{1\leqslant l\leqslant k}\text{diam}(C_l)}\right)\right\} DI = 1 ⩽ i ⩽ k min { j = i min ( max 1 ⩽ l ⩽ k diam ( C l ) d m i n ( C i , C j ) ) }
DI 的计算过程可以分解为以下几步来理解:
max 1 ⩽ l ⩽ k diam ( C l ) \max_{1\leqslant l\leqslant k}\text{diam}(C_l) max 1 ⩽ l ⩽ k diam ( C l ) :遍历所有的 k k k 个簇,找出其中最大的那个簇直径 ,这代表了整个聚类结果中最分散的簇的规模。
min j ≠ i ( d min ( C i , C j ) max 1 ⩽ l ⩽ k diam ( C l ) ) \min_{j\neq i}\left(\frac{d_{\min}(C_i, C_j)}{\max_{1\leqslant l\leqslant k}\text{diam}(C_l)}\right) min j = i ( m a x 1 ⩽ l ⩽ k diam ( C l ) d m i n ( C i , C j ) ) :对于簇 C i C_i C i 而言,这个值反映了它与它“最近的”或“最难区分的”邻居簇 C j C_j C j 之间的分离情况(以全局最大直径为参照)。如果一个簇 C i C_i C i 即便与它最难区分的邻居簇相比,分离度仍然很高,那么这个最小值就会比较大。
最后,取所有簇的上述值中的最小值作为 DI 的最终结果。
DI 的值越大,聚类效果越好 ,理论上没有上限。较大的 DI 值表示簇间分离度较好且簇内紧密度较高。
9.2 距离计算
上一章我们通过距离函数 定义了几个内部指标,现在我们就来仔细研究一下这个距离函数的具体定义和性质。
在高中的时候,我们已经学过如何计算两个向量(样本)x i \mathbf{x}_{i} x i 和x j \mathbf{x}_{j} x j 之间的距离,最常用的计算方式是欧式距离 (Euclidean distance),其公式为:
d i s t ( x i , x j ) = ∑ k = 1 n ( x i k − x j k ) 2 dist(\mathbf{x}_{i},\mathbf{x}_{j}) = \sqrt{\sum_{k=1}^{n}(x_{ik} - x_{jk})^2} d i s t ( x i , x j ) = k = 1 ∑ n ( x ik − x jk ) 2
其中n n n 表示向量的维度,x i k x_{ik} x ik 和x j k x_{jk} x jk 分别表示第i i i 个和第j j j 个向量在第k k k 维上的取值。
但欧式距离只是距离函数的一种特例 ,实际上向量之间的距离可以有多种不同的计算方式。要成为一个合法的距离函数,必须满足以下四个基本性质 :
非负性 :任意两个向量的距离必须大于等于零,即d i s t ( x i , x j ) ≥ 0 dist(\mathbf{x}_{i},\mathbf{x}_{j})\geq 0 d i s t ( x i , x j ) ≥ 0 。这个性质保证了距离值是有意义的正数。
同一性 :当且仅当两个向量完全相同时,它们的距离为零,即d i s t ( x i , x j ) = 0 ⟺ x i = x j dist(\mathbf{x}_{i},\mathbf{x}_{j})=0 \iff \mathbf{x}_{i}=\mathbf{x}_{j} d i s t ( x i , x j ) = 0 ⟺ x i = x j 。这个性质保证了距离函数能够区分不同的向量。
对称性 :两个向量之间的距离与计算顺序无关,即d i s t ( x i , x j ) = d i s t ( x j , x i ) dist(\mathbf{x}_{i},\mathbf{x}_{j})=dist(\mathbf{x}_{j},\mathbf{x}_{i}) d i s t ( x i , x j ) = d i s t ( x j , x i ) 。这个性质符合我们对距离的直观理解。
三角不等式 :对于任意三个向量,两边之和大于第三边,即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(\mathbf{x}_{i},\mathbf{x}_{j})\leq dist(\mathbf{x}_{i},\mathbf{x}_{k}) + dist(\mathbf{x}_{k},\mathbf{x}_{j}) d i s t ( x i , x j ) ≤ d i s t ( x i , x k ) + d i s t ( x k , x j ) 。这个性质保证了距离函数在几何上的合理性。
任何满足距离函数四个基本条件的函数都可以作为有效的距离度量。在机器学习领域,最常用的距离函数是闵可夫斯基距离 ,其数学表达式为:
d i s t m k ( x i , x j ) = ( ∑ k = 1 n ∣ x i k − x j k ∣ p ) 1 p dist_{mk}(\mathbf{x}_{i},\mathbf{x}_{j})=\left( \sum_{k=1}^{n} |x_{ik}-x_{jk}|^{p} \right)^{ \frac{1}{p} } d i s t mk ( x i , x j ) = ( k = 1 ∑ n ∣ x ik − x jk ∣ p ) p 1
这里需要特别注意的是参数 p p p 的取值:
当 p = 2 p=2 p = 2 时,闵可夫斯基距离退化为欧氏距离 ,这是最常用的几何距离形式。
当 p = 1 p=1 p = 1 时,距离公式变为曼哈顿距离 (也称为城市街区距离):
d i s t m a n ( x i , x j ) = ∣ ∣ x i − x j ∣ ∣ 1 = ∑ k = 1 n ∣ x i k − x j k ∣ dist_{man}(\mathbf{x}_{i},\mathbf{x}_{j})=||\mathbf{x}_{i}-\mathbf{x}_{j}||_{1}=\sum_{k=1}^{n} |x_{ik}-x_{jk}| d i s t man ( x i , x j ) = ∣∣ x i − x j ∣ ∣ 1 = k = 1 ∑ n ∣ x ik − x jk ∣
关于 p p p 值的影响需要特别注意:
当 p p p 取较小值 (如 p = 1 p=1 p = 1 )时,距离计算会对少数差异较大(取值范围大)的维度 更加敏感。这意味着如果两个向量在少数维度上有显著差异,即使其他维度很相似,也会产生较大的距离值。
当 p p p 取较大值 时,距离计算会更关注多个维度上的整体差异 。此时,在多个维度上都有中等差异的向量对距离的贡献会更明显。
随着 p p p 增大 ,距离计算会越来越由差异最大的那个维度 主导,其他维度的差异对最终距离的影响会相对减弱。
我们之前讨论过离散属性的数值化方法,其中提到对于有序离散属性 ,可以通过简单的数值映射来保持其顺序关系,这样仍然可以使用闵氏距离 进行计算。但对于无序离散属性 (比如颜色、品牌等类别数据),则需要采用其他方法,其中最常用的就是VDM(Value Difference Metric)方法 。
在VDM方法中,我们定义以下统计量:
m u , a m_{u,a} m u , a 表示在属性 u u u 上取值为 a a a 的总样本数
m u , a , i m_{u,a,i} m u , a , i 表示在第 i i i 个类别簇中,属性 u u u 取值为 a a a 的样本数
k k k 表示类别簇的总数
对于某个特定类别 i i i ,属性 u u u 取值为 a a a 和 b b b 的条件概率 可以表示为:
P ( i ∣ a ) = m u , a , i m u , a , P ( i ∣ b ) = m u , b , i m u , b P(i|a) = \frac{m_{u,a,i}}{m_{u,a}}, \quad P(i|b) = \frac{m_{u,b,i}}{m_{u,b}} P ( i ∣ a ) = m u , a m u , a , i , P ( i ∣ b ) = m u , b m u , b , i
VDM的核心思想是:如果两个不同的属性值在不同类别上的分布相似,则认为它们在距离度量上是"接近的" 。例如,"瓜蒂蜷缩"和"瓜蒂稍蜷"如果在"好瓜"和"坏瓜"的分类中表现出相似的统计规律,那么它们的VDM距离就会很小;反之,如果它们的统计分布差异很大,VDM距离就会很大。
因此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} \left|\frac{m_{u,a,i}}{m_{u,a}}- \frac{m_{u,b,i}}{m_{u,b}}\right |^{p} V D M p ( a , b ) = i = 1 ∑ k m u , a m u , a , i − m u , b m u , b , i p
其中 p p p 是一个可调参数,通常取1 1 1 或2 2 2 。当 p = 1 p=1 p = 1 时为曼哈顿距离形式,p = 2 p=2 p = 2 时为欧氏距离形式。于是可以和闵氏距离结合处理所有样本。
假设一个样本前n c n_{c} n c 个属性都是有序的,那么有:
m i n k o v D M p ( x i , x j ) = ( ∑ u = 1 n c ∣ x i u − x j u ∣ p + ∑ u = n c + 1 n V D M p ( x i u , x j u ) ) 1 p minkovDM_{p}(\mathbf{x}_{i},\mathbf{x}_{j})=\left( \sum_{u=1}^{n_{c}} |x_{iu}-x_{ju}|^{p} + \sum_{u=n_{c}+1}^{n} VDM_{p}(x_{iu},x_{ju}) \right)^{\frac{1}{p}} mink o v D M p ( x i , x j ) = ( u = 1 ∑ n c ∣ x i u − x j u ∣ p + u = n c + 1 ∑ n V D M p ( x i u , x j u ) ) p 1
另外,如果不同属性的重要程度不同的话,可以加上权重w i w_{i} w i ,通常要求权重满足归一化条件∑ w i = 1 \sum w_{i}=1 ∑ w i = 1 。
此时公式可以表示为:
w e i g h t e d M i n k o v D M p ( x i , x j ) = ( ∑ u = 1 n c w u ⋅ ∣ x i u − x j u ∣ p + ∑ u = n c + 1 n w u ⋅ V D M p ( x i u , x j u ) ) 1 p weightedMinkovDM_{p}(\mathbf{x}_{i},\mathbf{x}_{j})=\left( \sum_{u=1}^{n_{c}} w_{u} \cdot |x_{iu}-x_{ju}|^{p} + \sum_{u=n_{c}+1}^{n} w_{u} \cdot VDM_{p}(x_{iu},x_{ju}) \right)^{\frac{1}{p}} w e i g h t e d M ink o v D M p ( x i , x j ) = ( u = 1 ∑ n c w u ⋅ ∣ x i u − x j u ∣ p + u = n c + 1 ∑ n w u ⋅ V D M p ( x i u , x j u ) ) p 1
最后,我们通常通过距离函数来定义相似度度量 ,这种情况下距离值越大表示相似度越小 。然而相似度度量也可以不依赖于传统的距离函数 ,此时虽然我们仍然使用"距离"这个术语来描述相似程度,但这类距离被称为非度量距离 。在实际应用中,合适的距离计算方式 可以通过距离度量学习 的方法,根据具体的数据样本来自动确定。
9.3 原型聚类
现在我们进入聚类方法的学习,在现实聚类任务中,极为常用的一种聚类方法就是原型聚类 。它的核心思想是:假设每个簇都可以通过一个“原型” (Prototype) 来代表 。采用不同的原型表示,不同的求解方式将产生不同的算法,下面介绍几个常见算法:
9.3.1 k均值算法
给定一个包含 m m m 个样本的数据集 D = { x 1 , x 2 , … , x m } D = \{\boldsymbol{x}_1, \boldsymbol{x}_2, \dots, \boldsymbol{x}_m\} D = { x 1 , x 2 , … , x m } ,其中每个样本 x i \boldsymbol{x}_i x i 都是一个 d d d 维的实数向量。我们的目标是将这些样本划分成 k k k 个簇 C 1 , C 2 , … , C k C_1, C_2, \dots, C_k C 1 , C 2 , … , C k
K均值算法的核心思想是通过均值向量 (即簇中心)来表征每个簇的特征。对于簇C i C_{i} C i ,其均值向量 的数学定义为:
μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \boldsymbol{\mu}_{i}=\frac{1}{|C_{i}|}\sum_{\mathbf{x} \in C_{i}}\mathbf{x} μ i = ∣ C i ∣ 1 x ∈ C i ∑ x
该算法的目标是找到k k k 个均值向量 ,并将每个数据样本分配到与之欧式距离最近 的均值向量对应的簇中。这一过程实质上是最小化平方误差目标函数 :
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E = \sum_{i=1}^{k} \sum_{\mathbf{x}\in C_{i}}||\mathbf{x}-\boldsymbol{\mu}_{i}||^{2}_{2} E = i = 1 ∑ k x ∈ C i ∑ ∣∣ x − μ i ∣ ∣ 2 2
需要特别说明的是:
这里使用的距离度量是L 2 L_2 L 2 范数(p = 2 p=2 p = 2 )**,平方操作是为了简化求导计算
该问题本质是NP难问题 ,因此实际采用贪心迭代策略 求近似解
具体迭代流程 如下:
初始化阶段 :从数据集D D D 中随机选取k k k 个样本作为初始均值向量 μ 1 , μ 2 , … , μ k \boldsymbol{\mu}_1, \boldsymbol{\mu}_2, \dots, \boldsymbol{\mu}_k μ 1 , μ 2 , … , μ k
迭代阶段 :
簇分配 :对每个样本x i \boldsymbol{x}_i x i ,计算其与所有均值向量的平方欧式距离∣ ∣ x i − μ j ∣ ∣ 2 2 ||\boldsymbol{x}_i - \boldsymbol{\mu}_j||^2_2 ∣∣ x i − μ j ∣ ∣ 2 2 ,将其归入距离最小 的簇C j C_j C j
原型更新 :重新计算每个簇的均值向量μ j \boldsymbol{\mu}_j μ j ,更新为当前簇内所有样本的几何中心
终止判断 :当满足以下任一条件时停止迭代:
均值向量变化量 小于预设阈值ϵ \epsilon ϵ :max j ∣ ∣ μ j ( t ) − μ j ( t − 1 ) ∣ ∣ < ϵ \max_j||\boldsymbol{\mu}_j^{(t)} - \boldsymbol{\mu}_j^{(t-1)}|| < \epsilon max j ∣∣ μ j ( t ) − μ j ( t − 1 ) ∣∣ < ϵ
达到最大迭代次数 T m a x T_{max} T ma x
目标函数E E E 的变化率 低于阈值δ \delta δ
9.3.2 学习向量化
与k均值聚类算法类似,学习向量量化(Learning Vector Quantization, LVQ )也是通过一组原型向量 来表示数据特征。但区别 在于:LVQ要求训练样本必须带有预先标注的类别标签 ,这使其本质上属于有监督学习 范畴。
LVQ的工作机制 是在k均值算法框架基础上,利用样本标签信息 来动态调整原型向量的位置。其调整策略具有明确的分类导向性:
当某样本被当前原型向量正确分类 时,该原型向量会向样本方向移动
当出现分类错误 时,原型向量则会主动远离误分类样本
这种基于标签反馈的迭代机制 使得最终得到的原型向量能够同时满足两个目标:
作为各类别的典型代表(类似聚类中心);
在特征空间中形成最优分类边界
我们假设有一个训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D = \{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \dots, (\mathbf{x}_m, y_m)\} D = {( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m )} ,其中 x i \mathbf{x}_i x i 是一个 d d d 维特征向量 ,y i y_i y i 是其对应的类别标签 。我们的目标是学习 q q q 个原型向量 ,构成原型向量集合 P = { p 1 , p 2 , … , p q } P = \{\mathbf{p}_1, \mathbf{p}_2, \dots, \mathbf{p}_q\} P = { p 1 , p 2 , … , p q } ,其中每个原型向量 p i \mathbf{p}_{i} p i 都对应着一个预设的真实类别 。这里的 q q q 通常与真实类别数相关,可能存在两种关系:
一一对应 :q q q 等于类别数,此时每个预设类别 t i t_{i} t i 严格对应一个原型向量。
多对一 :q q q 是类别数的倍数,此时多个原型向量(如 t i , t j , … t_{i},t_{j},\dots t i , t j , … )可能对应同一个真实类别,用于表示该类别的内部复杂结构或子类 。
具体实现步骤如下:
初始化原型向量 :从训练数据中为每个类别随机选择若干样本 作为初始的原型向量,并为它们打上对应的类别标签。
迭代学习过程 :
寻找最近的原型向量 :随机选取一个样本 x i \mathbf{x}_i x i ,计算它与所有当前原型向量 p j \mathbf{p}_j p j (j = 1 , … , q j=1, \dots, q j = 1 , … , q )之间的距离 (通常使用欧式距离),找到距离最小的原型向量,称为胜出原型向量 p j ∗ \mathbf{p}_{j^*} p j ∗ 。
更新胜出的原型向量 p j ∗ \mathbf{p}_{j^*} p j ∗ :
类别匹配 (y i = t j ∗ y_i = t_{j^*} y i = t j ∗ ):说明 p j ∗ \mathbf{p}_{j^*} p j ∗ 能够正确代表样本 x i \mathbf{x}_i x i 的类别。此时,我们希望拉近 原型向量与样本的距离,增强其代表性。更新公式为:p j ∗ new = p j ∗ old + η ⋅ ( x i − p j ∗ old ) \mathbf{p}_{j^*}^{\text{new}} = \mathbf{p}_{j^*}^{\text{old}} + \eta \cdot (\mathbf{x}_i - \mathbf{p}_{j^*}^{\text{old}}) p j ∗ new = p j ∗ old + η ⋅ ( x i − p j ∗ old )
类别不匹配 (y i ≠ t j ∗ y_i \neq t_{j^*} y i = t j ∗ ):说明 p j ∗ \mathbf{p}_{j^*} p j ∗ 错误地吸引了样本 x i \mathbf{x}_i x i 。此时,我们希望推远 原型向量与样本的距离,减少未来错误。更新公式为:p j ∗ new = p j ∗ old − η ⋅ ( x i − p j ∗ old ) \mathbf{p}_{j^*}^{\text{new}} = \mathbf{p}_{j^*}^{\text{old}} - \eta \cdot (\mathbf{x}_i - \mathbf{p}_{j^*}^{\text{old}}) p j ∗ new = p j ∗ old − η ⋅ ( x i − p j ∗ old )
其中,η \eta η 是熟悉的学习率 ,取值范围为 ( 0 , 1 ) (0,1) ( 0 , 1 ) ,并会随着迭代轮数逐渐衰减。
终止条件 :迭代过程在以下情况之一满足时停止:
达到预设的最大迭代轮数 T max_epochs T_{\text{max\_epochs}} T max_epochs 。
原型向量的位置变化非常小 ,或学习率 η \eta η 衰减到足够小的阈值。
在LVQ(学习向量量化)算法训练完成后,我们会得到一组优化后的原型向量 { p 1 , … , p q } \{\mathbf{p}_1, \dots, \mathbf{p}_q\} { p 1 , … , p q } ,以及它们对应的类别标签 { t 1 , … , t q } \{t_1, \dots, t_q\} { t 1 , … , t q } 。当需要对一个新的未标记样本 x new \mathbf{x}_{\text{new}} x new 进行分类时,需要按照以下步骤操作:
计算距离 :首先,需要计算 x new \mathbf{x}_{\text{new}} x new 与每一个原型向量 p j \mathbf{p}_j p j 之间的距离。这里的距离通常可以是欧氏距离
寻找最近原型 :在所有计算得到的距离中,找到与 x new \mathbf{x}_{\text{new}} x new 距离最近的原型向量 p j ∗ \mathbf{p}_{j^*} p j ∗
分配类别标签 :最后,将 x new \mathbf{x}_{\text{new}} x new 的预测类别直接赋值为 p j ∗ \mathbf{p}_{j^*} p j ∗ 对应的类别标签 t j ∗ t_{j^*} t j ∗ 。这一步的本质是基于最近邻原则进行分类 ,即认为样本的类别由其最近的原型向量决定。
这种决策与K均值共享了相同的几何基础,即Voronoi剖分 :
每个原型向量 p j \mathbf{p}_j p j 在样本空间 χ \chi χ 中定义了与其相关的一个区域 R j R_j R j ,该区域内的所有点在分类时都会被赋予原型 p j \mathbf{p}_j p j 的类别标签 t j t_j t j 。具体来说,区域 R j R_j R j 可以表示为:
R j = { x ∈ χ ∣ d ( x , p j ) ≤ d ( x , p k ) , ∀ k ≠ j } R_j = \{\mathbf{x} \in \chi \mid d(\mathbf{x}, \mathbf{p}_j) \leq d(\mathbf{x}, \mathbf{p}_k), \forall k \neq j\} R j = { x ∈ χ ∣ d ( x , p j ) ≤ d ( x , p k ) , ∀ k = j }
这些区域具有以下性质:
不重叠性 :任意两个不同的区域 R j R_j R j 和 R k R_k R k (j ≠ k j \neq k j = k )的交集为空,即 R j ∩ R k = ∅ R_j \cap R_k = \emptyset R j ∩ R k = ∅ 。这确保了分类结果的唯一性,避免了重叠区域中样本类别归属不明确的问题。
全覆盖性 :所有区域的并集覆盖整个样本空间 χ \chi χ ,即 ⋃ j = 1 q R j = χ \bigcup_{j=1}^q R_j = \chi ⋃ j = 1 q R j = χ 。这意味着样本空间中的每一个点都必然属于某个原型向量的区域,不会出现未被覆盖的区域。
因此,Voronoi剖分实际上是对样本空间 χ \chi χ 的一种完整且无重叠的划分 。
注意,虽然假设了一簇的样本点按照圆分布,但划分的区域边界 不是圆而是一系列超平面组成的多面体。可以以2 2 2 个均值向量为例,展开上述不等式后得到一个线性不等式。
9.3.3 高斯混合聚类
与前者聚类方法不同,高斯混合聚类(GMM) 的核心思想是基于概率建模 。这种概率化的原型表示能更好地描述现实中的复杂数据分布情况:
第一 ,现实数据中不同簇可能具有完全不同的分布形态。比如某些簇可能呈现椭圆形分布(而非标准的球形分布),此时传统的均值法使用的线性决策边界就难以准确描述这种复杂形状。高斯混合模型通过协方差矩阵 Σ \Sigma Σ 可以灵活地刻画不同方向的分布差异 。
第二 ,实际场景中簇与簇之间往往存在概率化重叠 。在重叠区域内的样本点并非绝对属于某个簇,而是以一定概率分属不同簇(例如一个样本40%概率属于小说爱好者,60%概率属于电视剧爱好者,不是说该样本只能喜欢小说或者电视剧)。相比之下,均值法的硬划分会丢失这种不确定性信息。
高斯混合模型正是为了克服这些限制而提出的。核心思想是假设观测到的数据点是由若干个高斯分布的混合生成 的。每一个高斯分布就对应一个簇 。
我们假设有 K K K 个高斯分布 ,每个高斯分布对应一个权重系数(混合系数)π k \pi_k π k ,这些权重满足概率归一化条件 ∑ k = 1 K π k = 1 \sum_{k=1}^{K}\pi_{k}=1 ∑ k = 1 K π k = 1 。生成数据的过程分为两步 :首先以概率 π k \pi_k π k 选择第 k k k 个高斯分布,然后从该分布中采样生成数据点 x i \mathbf{x}_i x i 。每个高斯分布由均值向量 μ k \mathbf{\mu}_k μ k 和 协方差矩阵 Σ k \mathbf{\Sigma}_k Σ k 完全定义:
μ k \mathbf{\mu}_k μ k 决定了该高斯分布的中心位置 ,即数据点最可能出现的区域。
Σ k \mathbf{\Sigma}_k Σ k 控制了分布的形状、方向 和离散程度
因此,整个数据集可以看作是这 K K K 个高斯分布的加权混合(混合模型) 。对于任意一个数据点 x i \mathbf{x}_i x i ,其概率密度函数 可以表示为所有高斯分布的加权和:
p ( x i ∣ π , μ , Σ ) = ∑ k = 1 K π k N ( x i ∣ μ k , Σ k ) = ∑ k = 1 K π k 1 ( 2 π ) n 2 ∣ Σ k ∣ 1 2 e ( − 1 2 ( x i − μ k ) T Σ k − 1 ( x i − μ k ) ) , \begin{align}
p(\mathbf{x}_i | \mathbf{\pi}, \mathbf{\mu}, \mathbf{\Sigma}) &= \sum_{k=1}^K \pi_k \mathcal{N}(\mathbf{x}_i | \mathbf{\mu}_k, \mathbf{\Sigma}_k) \\
&= \sum_{k=1}^{K} \pi_{k} \frac{1}{(2\pi)^{\frac{n}{2}} |\mathbf{\Sigma}_k|^{\frac{1}{2}}} e^{\left(-\frac{1}{2} (\mathbf{x}_i - \mathbf{\mu}_k)^T \mathbf{\Sigma}_k^{-1} (\mathbf{x}_i - \mathbf{\mu}_k)\right)},
\end{align} p ( x i ∣ π , μ , Σ ) = k = 1 ∑ K π k N ( x i ∣ μ k , Σ k ) = k = 1 ∑ K π k ( 2 π ) 2 n ∣ Σ k ∣ 2 1 1 e ( − 2 1 ( x i − μ k ) T Σ k − 1 ( x i − μ k ) ) ,
模型的学习目标 是通过训练数据 D = { x 1 , x 2 , … , x N } D = \{\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_N\} D = { x 1 , x 2 , … , x N } 估计参数 π k \pi_k π k 、μ k \mathbf{\mu}_k μ k 和 Σ k \mathbf{\Sigma}_k Σ k 。这里采用极大似然估计法 ,即最大化对数似然函数(假设数据点独立同分布):
ln P ( X ∣ π , μ , Σ ) = ∑ i = 1 N ln ( ∑ k = 1 K π k N ( x i ∣ μ k , Σ k ) ) . \ln P(X | \mathbf{\pi}, \mathbf{\mu}, \mathbf{\Sigma}) = \sum_{i=1}^N \ln \left( \sum_{k=1}^K \pi_k \mathcal{N}(\mathbf{x}_i | \mathbf{\mu}_k, \mathbf{\Sigma}_k) \right). ln P ( X ∣ π , μ , Σ ) = i = 1 ∑ N ln ( k = 1 ∑ K π k N ( x i ∣ μ k , Σ k ) ) .
由于直接对该函数求导难以得到解析解 ,因此采用EM算法 进行迭代求解(详细内容可参考7.5节)。
初始化阶段 :首先需要初始化一组参数 ( π , μ , Σ ) (\mathbf{\pi}, \mathbf{\mu}, \mathbf{\Sigma}) ( π , μ , Σ ) 。初始化方法可以是随机初始化,也可以先使用k均值算法 得到K K K 个簇,然后用这些簇的中心和协方差作为初始值。
迭代过程 分为E步和M步,具体如下:
E步:根据当前第t t t 轮迭代的参数估计 ( π ( t ) , μ ( t ) , Σ ( t ) ) (\mathbf{\pi}^{(t)}, \mathbf{\mu}^{(t)}, \mathbf{\Sigma}^{(t)}) ( π ( t ) , μ ( t ) , Σ ( t ) ) ,计算每个数据点 x i \mathbf{x}_i x i 由第 k k k 个高斯分量生成的后验概率,记为 γ ( z i k ) \gamma(z_{ik}) γ ( z ik ) 。具体计算基于贝叶斯定理:
γ ( z i k ) ( t + 1 ) = P ( z i k = 1 ∣ x i ; π ( t ) , μ ( t ) , Σ ( t ) ) = π k ( t ) N ( x i ∣ μ k ( t ) , Σ k ( t ) ) ∑ j = 1 K π j ( t ) N ( x i ∣ μ j ( t ) , Σ j ( t ) ) . \gamma(z_{ik})^{(t+1)} = P(z_{ik}=1 | \mathbf{x}_i; \mathbf{\pi}^{(t)}, \mathbf{\mu}^{(t)}, \mathbf{\Sigma}^{(t)}) = \frac{\pi_k^{(t)} \mathcal{N}(\mathbf{x}_i | \mathbf{\mu}_k^{(t)}, \mathbf{\Sigma}_k^{(t)})}{\sum_{j=1}^K \pi_j^{(t)} \mathcal{N}(\mathbf{x}_i | \mathbf{\mu}_j^{(t)}, \mathbf{\Sigma}_j^{(t)})}. γ ( z ik ) ( t + 1 ) = P ( z ik = 1∣ x i ; π ( t ) , μ ( t ) , Σ ( t ) ) = ∑ j = 1 K π j ( t ) N ( x i ∣ μ j ( t ) , Σ j ( t ) ) π k ( t ) N ( x i ∣ μ k ( t ) , Σ k ( t ) ) .
其中,z i k = 1 z_{ik}=1 z ik = 1 是一个指示变量 ,表示数据点 x i \mathbf{x}_i x i 由第 k k k 个高斯分量生成。
-M步:利用E步计算得到的 γ ( z i k ) ( t + 1 ) \gamma(z_{ik})^{(t+1)} γ ( z ik ) ( t + 1 ) ,重新估计模型参数 ( π , μ , Σ ) (\mathbf{\pi}, \mathbf{\mu}, \mathbf{\Sigma}) ( π , μ , Σ ) ,以最大化期望的对数似然函数。具体更新步骤如下:
更新混合系数 π k \pi_k π k :新的 π k \pi_k π k 反映第 k k k 个高斯分量“负责”的数据点的比例。首先计算“有效点数”:
N k ( t + 1 ) = ∑ i = 1 N γ ( z i k ) ( t + 1 ) , N_k^{(t+1)} = \sum_{i=1}^N \gamma(z_{ik})^{(t+1)}, N k ( t + 1 ) = i = 1 ∑ N γ ( z ik ) ( t + 1 ) ,
然后更新:
π k ( t + 1 ) = N k ( t + 1 ) N , 其中 N = ∑ k = 1 K N k ( t + 1 ) . \pi_k^{(t+1)} = \frac{N_k^{(t+1)}}{N}, \quad \text{其中} \quad N = \sum_{k=1}^K N_k^{(t+1)}. π k ( t + 1 ) = N N k ( t + 1 ) , 其中 N = k = 1 ∑ K N k ( t + 1 ) .
更新均值 μ k \mathbf{\mu}_k μ k :新的均值是所有数据点 x i \mathbf{x}_i x i 的加权平均,权重为 γ ( z i k ) ( t + 1 ) \gamma(z_{ik})^{(t+1)} γ ( z ik ) ( t + 1 ) :
μ k ( t + 1 ) = ∑ i = 1 N γ ( z i k ) ( t + 1 ) x i N k ( t + 1 ) . \mathbf{\mu}_k^{(t+1)} = \frac{\sum_{i=1}^N \gamma(z_{ik})^{(t+1)} \mathbf{x}_i}{N_k^{(t+1)}}. μ k ( t + 1 ) = N k ( t + 1 ) ∑ i = 1 N γ ( z ik ) ( t + 1 ) x i .
更新协方差矩阵 Σ k \mathbf{\Sigma}_k Σ k :新的协方差矩阵是所有数据点 x i \mathbf{x}_i x i 相对于新均值 μ k ( t + 1 ) \mathbf{\mu}_k^{(t+1)} μ k ( t + 1 ) 的加权协方差:
Σ k ( t + 1 ) = ∑ i = 1 N γ ( z i k ) ( t + 1 ) ( x i − μ k ( t + 1 ) ) ( x i − μ k ( t + 1 ) ) T N k ( t + 1 ) . \mathbf{\Sigma}_k^{(t+1)} = \frac{\sum_{i=1}^N \gamma(z_{ik})^{(t+1)} (\mathbf{x}_i - \mathbf{\mu}_k^{(t+1)})(\mathbf{x}_i - \mathbf{\mu}_k^{(t+1)})^T}{N_k^{(t+1)}}. Σ k ( t + 1 ) = N k ( t + 1 ) ∑ i = 1 N γ ( z ik ) ( t + 1 ) ( x i − μ k ( t + 1 ) ) ( x i − μ k ( t + 1 ) ) T .
终止条件 :迭代过程会在达到预设的最大轮次 或参数变化小于某个阈值 时终止。
9.4 密度聚类
密度聚类 是一种基于样本分布密度进行分类的算法,其将簇定义为数据空间中被低密度区域分隔开的高密度区域 。其中最著名的算法是 DBSCAN (Density-Based Spatial Clliustering of Applications with Noise),它通过分析数据点的局部密度分布来实现聚类,无需预先指定簇的数量 (与K-Means等算法不同)。
DBSCAN的工作原理 依赖于两个关键参数:
ϵ \epsilon ϵ (邻域半径) :对于任意点 x i \mathbf{x}_{i} x i ,其 ϵ \epsilon ϵ -邻域定义为所有与 x i \mathbf{x}_{i} x i 的距离不超过 ϵ \epsilon ϵ 的点集,即 N ϵ ( x i ) = { x j ∈ D ∣ dist ( x i , x j ) ≤ ϵ } N_{\epsilon}(\mathbf{x}_{i}) = \{\mathbf{x}_{j} \in D \mid \text{dist}(\mathbf{x}_{i}, \mathbf{x}_{j}) \le \epsilon\} N ϵ ( x i ) = { x j ∈ D ∣ dist ( x i , x j ) ≤ ϵ } 其中 D D D 是数据集,dist ( ⋅ ) \text{dist}(\cdot) dist ( ⋅ ) 是距离度量。
MinPts(最小点数) :判断一个点是否为核心点的密度阈值。
根据这两个参数,DBSCAN将数据点分为三类:
核心点 (Core Point) :满足 ∣ N ϵ ( x i ) ∣ ≥ MinPts |N_{\epsilon}(\mathbf{x}_{i})| \ge \text{MinPts} ∣ N ϵ ( x i ) ∣ ≥ MinPts 的点 x i \mathbf{x}_{i} x i 。这类点位于簇的高密度区域 ,是簇形成的"种子"。例如,若 MinPts = 5 \text{MinPts}=5 MinPts = 5 ,则一个点的 ϵ \epsilon ϵ 邻域内至少需要包含5个点(含自身)才能成为核心点。
边界点 (Border Point) :不满足核心点条件,但落在某个核心点的 ϵ \epsilon ϵ -邻域内的点 x j \mathbf{x}_{j} x j 。这类点位于簇的边缘区域 ,其密度不足以独立形成簇,但仍属于某个簇。数学表示为:∣ N ϵ ( x j ) ∣ < MinPts and ∃ x i (核心点) , x j ∈ N ϵ ( x i ) |N_{\epsilon}(\mathbf{x}_{j})| < \text{MinPts} \quad \text{and} \quad \exists \mathbf{x}_{i} \text{(核心点)}, \mathbf{x}_{j} \in N_{\epsilon}(\mathbf{x}_{i}) ∣ N ϵ ( x j ) ∣ < MinPts and ∃ x i (核心点) , x j ∈ N ϵ ( x i )
噪声点 (Noise Point) :既非核心点也非边界点的点 x k \mathbf{x}_{k} x k 。这类点位于低密度区域 ,不被任何簇包含,通常对应异常值或噪声。判断条件为:∣ N ϵ ( x k ) ∣ < MinPts and ∀ x i , x k ∉ N ϵ ( x i ) |N_{\epsilon}(\mathbf{x}_{k})| < \text{MinPts} \quad \text{and} \quad \forall \mathbf{x}_{i}, \mathbf{x}_{k} \notin N_{\epsilon}(\mathbf{x}_{i}) ∣ N ϵ ( x k ) ∣ < MinPts and ∀ x i , x k ∈ / N ϵ ( x i )
点与点之间的关系可以总结为:
密度直达 :当 x i \mathbf{x}_{i} x i 是一个核心点 且 x j \mathbf{x}_{j} x j 位于 x i \mathbf{x}_{i} x i 的 ϵ \epsilon ϵ -邻域内(即满足 dist ( x i , x j ) ≤ ϵ \text{dist}(\mathbf{x}_{i}, \mathbf{x}_{j}) \le \epsilon dist ( x i , x j ) ≤ ϵ )时,称 x j \mathbf{x}_{j} x j 从 x i \mathbf{x}_{i} x i 密度直达 。需要注意的是,这个关系不一定 是对称。具体来说,如果 x i \mathbf{x}_{i} x i 是核心点,x j \mathbf{x}_{j} x j 在其邻域内,那么 x j \mathbf{x}_{j} x j 可以从 x i \mathbf{x}_{i} x i 直接密度可达;但如果 x j \mathbf{x}_{j} x j 不是核心点(例如是一个边界点),则 x i \mathbf{x}_{i} x i 不一定能从 x j \mathbf{x}_{j} x j 直接密度可达。
密度可达 :点 x j \mathbf{x}_{j} x j 从点 x i \mathbf{x}_{i} x i 密度可达 ,是指存在一个点的序列 x i 1 , x i 2 , … , x i m \mathbf{x}_{i1}, \mathbf{x}_{i2}, \dots, \mathbf{x}_{im} x i 1 , x i 2 , … , x im ,其中 x i 1 = x i \mathbf{x}_{i1} = \mathbf{x}_{i} x i 1 = x i 且 x i m = x j \mathbf{x}_{im} = \mathbf{x}_{j} x im = x j ,并且对于序列中的每一对相邻点 x i k \mathbf{x}_{ik} x ik 和 x i ( k + 1 ) \mathbf{x}_{i(k+1)} x i ( k + 1 ) ,x i ( k + 1 ) \mathbf{x}_{i(k+1)} x i ( k + 1 ) 都是从 x i k \mathbf{x}_{ik} x ik 直接密度可达 的。可以形象地理解为从核心点 x i \mathbf{x}_{i} x i 开始,通过一系列核心点的接力传递 ,最终到达点 x j \mathbf{x}_{j} x j 。需要注意的是,密度可达关系也不一定 是对称的。
密度相连 :两个点 x i \mathbf{x}_{i} x i 和 x j \mathbf{x}_{j} x j 是密度相连 的,是指存在一个核心点 x o \mathbf{x}_{o} x o ,使得 x i \mathbf{x}_{i} x i 和 x j \mathbf{x}_{j} x j 都从 x o \mathbf{x}_{o} x o 密度可达 。与密度直达和密度可达不同,密度相连关系是对称的 。
基于以上概念,DBSCAN将簇定义为 :由密度可达关系 导出的最大密度相连样本集合 。形式化地说,给定参数ϵ \epsilon ϵ 和M i n P t s MinPts M in Pt s ,簇C ⊆ D C \subseteq D C ⊆ D 是满足以下两个性质的非空子集 :
连接性 :对于任意两个点x i ∈ C \mathbf{x}_{i} \in C x i ∈ C 和x j ∈ C \mathbf{x}_{j} \in C x j ∈ C ,它们必须是密度相连 的。
最大性 :如果点x i ∈ C \mathbf{x}_{i} \in C x i ∈ C ,并且x j \mathbf{x}_{j} x j 可以从x i \mathbf{x}_{i} x i 密度可达 ,那么x j \mathbf{x}_{j} x j 也必须属于C C C 。这保证了簇的完整性,即所有密度可达的点都必须被包含在同一个簇中。
DBSCAN算法的流程 可以详细描述如下:
首先,需要选择合适的ϵ \epsilon ϵ 和M i n P t s MinPts M in Pt s 值 。这两个参数对聚类结果有重要影响:ϵ \epsilon ϵ 决定了邻域的大小,而M i n P t s MinPts M in Pt s 定义了核心点的最小邻域点数要求。
基于广度优先遍历思想,算法从数据集中任意选择一个尚未被访问的点p \mathbf{p} p 开始处理。这里需要检查p \mathbf{p} p 是否满足核心点的条件:
算法会继续选择下一个未访问的点 ,重复上述过程,直到所有点都被访问过 。最终:
所有被分配到某个簇的点构成聚类结果
仍然标记为噪声的点就是最终的噪声
9.5 层次聚类
在聚类算法中,原型聚类 (如K-means)需要预先设定簇的数量k ,而密度聚类 (如DBSCAN)需要预设邻域半径ϵ \epsilon ϵ 和最小样本数M i n P t s MinPts M in Pt s 。这些参数的选择极其关键 ,因为不当的参数会导致模型效果不佳甚至无法收敛。相比之下,层次聚类 完全不需要预设参数,它通过树状结构的构建过程 自动形成聚类结果,称为“谱系图”或“树状图”。
层次聚类的基本思想是通过对簇进行一系列的合并 (自底向上)或分裂 (自顶向下)操作来构建聚类结构。具体有两种实现方式:
凝聚型层次聚类(AGNES)
采用自底而上 的策略:
初始阶段将每个数据点视为独立簇
每次迭代合并距离最近的两个簇 (通过特定的簇间距离度量)
重复合并直到所有点聚为一个簇,或达到终止条件
分裂型层次聚类(DIANA)
采用自顶而下 的策略:
初始阶段将所有数据点视为一个簇
每次迭代选择最不紧密的簇 进行分裂
重复分裂直到每个点成为独立簇,或满足停止条件
实践中自顶向下方法较少使用 ,因为大簇的分裂策略较难设计,因此AGNES 更为常用。在层次聚类过程中,需要特别关注簇间距离的计算方法 ,主要有以下四种定义方式:
单连接(最小距离)
d m i n ( C i , C j ) = min x ∈ C i , z ∈ C j d i s t ( x , z ) d_{min}(C_{i},C_{j})=\min_{\mathbf{x}\in C_{i},\mathbf{z}\in C_{j}}dist(\mathbf{x},\mathbf{z}) d min ( C i , C j ) = min x ∈ C i , z ∈ C j d i s t ( x , z )
取两簇中最近样本对 的距离,我们在之前见过。
质心连接
d c e n ( C i , C j ) = d i s t ( μ i , μ j ) d_{cen}(C_{i},C_{j})=dist(\mu_{i},\mu_{j}) d ce n ( C i , C j ) = d i s t ( μ i , μ j )
通过簇中心点(均值向量)的距离计算,我们之前也见过
全连接(最大距离)
d m a x ( C i , C j ) = max x ∈ C i , z ∈ C j d i s t ( x , z ) d_{max}(C_{i},C_{j})=\max_{\mathbf{x}\in C_{i},\mathbf{z}\in C_{j}}dist(\mathbf{x},\mathbf{z}) d ma x ( C i , C j ) = max x ∈ C i , z ∈ C j d i s t ( x , z )
取两簇中最远样本对 的距离
均连接(平均距离)
d a v g ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ z ∈ C j d i s t ( x , z ) d_{avg}(C_{i},C_{j})=\frac{1}{|C_{i}||C_{j}|}\sum_{\mathbf{x} \in C_{i}}\sum_{\mathbf{z}\in C_{j}}dist(\mathbf{x},\mathbf{z}) d a vg ( C i , C j ) = ∣ C i ∣∣ C j ∣ 1 ∑ x ∈ C i ∑ z ∈ C j d i s t ( x , z )
计算两簇所有样本对距离的平均值
不同的聚类算法在合并簇时有明显不同的特性:
单连接 :容易受到噪声和异常值的影响。它的合并规则是基于两个簇中最近点之间的距离,因此少数几个接近的噪声点可能导致本应分离的簇过早合并,这种现象称为“链式效应”**,最终可能生成不合理的拉长形簇。
全连接 :对异常值同样敏感 ,但表现方式不同。它基于两个簇中最远点之间的距离,如果一个簇的边缘存在远离中心的异常点,该簇与其他簇的距离会被人为拉大 ,导致本应合并的大簇被错误地拆分。
平均连接 :是单连接和全连接的折衷方案 。通过计算两簇间所有点对的平均距离,对噪声和异常值的敏感度显著降低 ,且倾向于生成大小和方差更均匀的簇 ,结果通常更稳定。
质心连接 :可能引发倒置问题 。由于合并后的新簇质心位置可能更接近其他簇,导致后续合并距离比之前更小(即谱系图出现交叉分支),破坏距离单调性 ,影响结果的可解释性。
现在我们来看整个算法步骤
假设数据集包含 N N N 个点,记为 X = { x 1 , x 2 , … , x N } X = \{\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_N\} X = { x 1 , x 2 , … , x N } ,具体流程如下:
初始化阶段 :
将每个数据点 x i \mathbf{x}_i x i 视为独立簇,即 C i = { x i } C_i = \{\mathbf{x}_i\} C i = { x i } 。
构建距离矩阵 :选择上述合适的算法计算所有初始簇对之间的距离,生成 N × N N \times N N × N 的对称矩阵,矩阵元素 D i j D_{ij} D ij 表示簇 C i C_i C i 与 C j C_j C j 的距离。
迭代合并阶段 :
寻找最近簇对 :遍历距离矩阵,找到当前距离最小的两个簇 C A C_A C A 和 C B C_B C B 。
合并操作 :生成新簇 C A B = C A ∪ C B C_{AB} = C_A \cup C_B C A B = C A ∪ C B 。
更新距离矩阵 :
删除 C A C_A C A 和 C B C_B C B 对应的行与列。
重新计算新簇 C A B C_{AB} C A B 与其他簇 C k C_k C k 的距离 (根据所选连接方式,如单连接取最小距离,全连接取最大距离等)。
重复上述步骤,直到仅剩一个簇或满足终止条件(如预设簇数量或距离阈值)。
最后我们就得到了一个谱系图
谱系图 通过树状结构记录了整个合并过程
叶子节点 对应原始数据点。
内部节点 表示合并生成的中间簇。
通过水平切割谱系图,可一次性获得从 N N N 个簇(最底层)到 1 1 1 个簇(最顶层)的所有可能划分。例如,在高度 h h h 处切割会得到对应 K K K 个簇的结果,无需重新运行算法 。这种层次化展示 是谱系聚类的主要优势。