本文是周志华《机器学习》(西瓜书)第9章 聚类 (Clustering)的学习笔记,涵盖本章所有核心知识点,配有通俗类比与公式推导。
01. 聚类任务概述 什么是聚类?它能解决什么问题?
📌 核心定义
聚类(Clustering)是将数据集中的样本划分为若干个不相交的子集, 每个子集称为一个 簇(Cluster) 。聚类的目标是:
簇内相似性最大 :同一簇内的样本应尽可能彼此相似
簇间差异性最大 :不同簇的样本应尽可能不同
形式化表示:给定样本集 D = { x 1 , x 2 , … , x m } D = \{x_1, x_2, \ldots, x_m\} D = { x 1 , x 2 , … , x m } ,聚类算法将 D D D 划分为 k k k 个不相交的簇 { C l ∣ l = 1 , 2 , … , k } \{C_l \mid l = 1, 2, \ldots, k\} { C l ∣ l = 1 , 2 , … , k } , 满足 C i ∩ C j = ∅ C_i \cap C_j = \emptyset C i ∩ C j = ∅ (i ≠ j i \neq j i = j )且 ⋃ l = 1 k C l = D \bigcup_{l=1}^k C_l = D ⋃ l = 1 k C l = D 。 每个样本 x j x_j x j 的簇标记为 λ j ∈ { 1 , 2 , … , k } \lambda_j \in \{1, 2, \ldots, k\} λ j ∈ { 1 , 2 , … , k } 。
🍎 通俗理解
想象你去超市买东西,超市把所有商品摆放在不同的货架区域: 水果区、蔬菜区、零食区、饮料区……这就是聚类! 超市并没有人告诉机器”这是苹果,那是香蕉”,而是商品本身的相似性 (都是新鲜食品、都是甜的、都需要冷藏)决定了它们应该放在一起。
聚类就是让算法自动完成这个"归类摆放"的过程,而且事先我们**不告诉算法**
有哪些类别、每个样本属于哪类。
🔑 与分类的核心区别
分类(有监督) :训练数据有标签,模型学习”苹果→水果”的映射关系。
聚类(无监督) :训练数据没有标签,模型自己发现数据的自然分组结构。 聚类结果的”簇标记”是没有语义的,需要人来解释含义。
🌍 应用场景
👥 用户分群 :将电商用户按购买行为自动分为不同群体,用于精准营销
🖼️ 图像分割 :将图像中的像素按颜色或纹理聚类,实现前景背景分离
📰 文档聚类 :把新闻文章自动归类为科技、体育、娱乐等主题
🧬 基因分析 :发现具有相似表达模式的基因群组,辅助疾病研究
🔍 异常检测 :偏离所有簇的样本往往是异常点(如信用卡欺诈)
🗺️ 地理分析 :发现城市中的商业集聚区、居民区分布规律
02. 性能度量 如何评价聚类结果的好坏?
聚类性能度量(也叫聚类有效性指标 )分为两大类:
📎 外部指标(External Index)
将聚类结果与某个参考模型 进行比较。参考模型通常是由领域专家给出的”正确答案”。
📎 内部指标(Internal Index)
直接考察聚类结果,不依赖任何参考模型 。评估簇的内聚性和分离性。
📐 外部指标:基础概念
设 D D D 中包含 m m m 个样本,设聚类结果的簇划分为 C = { C 1 , … , C k } \mathcal{C} = \{C_1, \ldots, C_k\} C = { C 1 , … , C k } , 参考模型的簇划分为 C ∗ = { C 1 ∗ , … , C s ∗ } \mathcal{C}^* = \{C_1^*, \ldots, C_s^*\} C ∗ = { C 1 ∗ , … , C s ∗ } 。 考虑所有样本对 ( x i , x j ) (x_i, x_j) ( x i , x j ) ,定义四个基本量:
📐 四个基本集合
a = ∣ S S ∣ a = |SS| a = ∣ S S ∣ :在 C \mathcal{C} C 中**同簇**,在 C ∗ \mathcal{C}^* C ∗ 中也**同簇**的样本对数
b = ∣ S D ∣ b = |SD| b = ∣ S D ∣ :在 C \mathcal{C} C 中**同簇**,在 C ∗ \mathcal{C}^* C ∗ 中**不同簇**的样本对数
c = ∣ D S ∣ c = |DS| c = ∣ D S ∣ :在 C \mathcal{C} C 中**不同簇**,在 C ∗ \mathcal{C}^* C ∗ 中**同簇**的样本对数
d = ∣ D D ∣ d = |DD| d = ∣ D D ∣ :在 C \mathcal{C} C 中**不同簇**,在 C ∗ \mathcal{C}^* C ∗ 中也**不同簇**的样本对数
显然有:a + b + c + d = m ( m − 1 ) 2 a + b + c + d = \dfrac{m(m-1)}{2} a + b + c + d = 2 m ( m − 1 ) (所有可能的样本对总数)
🍎 通俗理解
把同班同学按”兴趣”分组(C \mathcal{C} C ),再和”宿舍楼层”(参考 C ∗ \mathcal{C}^* C ∗ )对比:
a :李明和王芳——兴趣相同 且 同楼层 ✅✅
b :李明和张强——兴趣相同 但 不同楼层 ✅❌
c :李明和赵丽——兴趣不同 但 同楼层 ❌✅
d :李明和陈伟——兴趣不同 且 不同楼层 ❌❌
{% _internal_math_placeholder 383 %} 越大说明聚类结果和参考模型越一致!
三大外部指标
📐 Jaccard 系数(JC)
JC = a a + b + c
\text{JC} = \frac{a}{a + b + c}
JC = a + b + c a
取值范围 [ 0 , 1 ] [0, 1] [ 0 , 1 ] ,越大越好 。分子是”双方都同意归为同类”,分母是”至少有一方认为同类”。
📐 FM 指数(FMI)
FMI = a a + b ⋅ a a + c
\text{FMI} = \sqrt{\frac{a}{a+b} \cdot \frac{a}{a+c} }
FMI = a + b a ⋅ a + c a
取值范围 [ 0 , 1 ] [0, 1] [ 0 , 1 ] ,越大越好 。是精确率和召回率的几何平均,类似分类任务中的 F1 分数。
📐 Rand 指数(RI)
RI = 2 ( a + d ) m ( m − 1 )
\text{RI} = \frac{2(a + d)}{m(m-1)}
RI = m ( m − 1 ) 2 ( a + d )
取值范围 [ 0 , 1 ] [0, 1] [ 0 , 1 ] ,越大越好 。衡量”正确分配的样本对”占总样本对的比例。 直觉理解:聚类和参考模型达成一致的样本对越多,RI 越高。
📐 内部指标
内部指标不依赖参考模型,直接通过计算样本间的距离来衡量聚类质量。 先定义几个距离符号:
📐 基本距离符号
avg ( C ) \text{avg}(C) avg ( C ) = 簇 C C C 内所有样本对的**平均距离**:avg ( C ) = 2 ∣ C ∣ ( ∣ C ∣ − 1 ) ∑ 1 ≤ i < j ≤ ∣ C ∣ dist ( x i , x j ) \text{avg}(C) = \dfrac{2}{|C|(|C|-1)} \sum_{1 \le i < j \le |C|} \text{dist}(x_i, x_j) avg ( C ) = ∣ C ∣ ( ∣ C ∣ − 1 ) 2 ∑ 1 ≤ i < j ≤ ∣ C ∣ dist ( x i , x j )
diam ( C ) \text{diam}(C) diam ( C ) = 簇 C C C 内样本间的**最大距离**(直径):diam ( C ) = max 1 ≤ i < j ≤ ∣ C ∣ dist ( x i , x j ) \text{diam}(C) = \max_{1 \le i < j \le |C|} \text{dist}(x_i, x_j) diam ( C ) = max 1 ≤ i < j ≤ ∣ C ∣ dist ( x i , x j )
d min ( C i , C j ) d_{\min}(C_i, C_j) d m i n ( C i , C j ) = 两簇间的**最近样本距离**:d min ( C i , C j ) = min x i ∈ C i , x j ∈ C j dist ( x i , x j ) d_{\min}(C_i, C_j) = \min_{x_i \in C_i, x_j \in C_j} \text{dist}(x_i, x_j) d m i n ( C i , C j ) = min x i ∈ C i , x j ∈ C j dist ( x i , x j )
d cen ( C i , C j ) d_{\text{cen} }(C_i, C_j) d cen ( C i , C j ) = 两簇**中心点之间的距离**:d cen ( C i , C j ) = dist ( μ i , μ j ) d_{\text{cen} }(C_i, C_j) = \text{dist}(\mu_i, \mu_j) d cen ( C i , C j ) = dist ( μ i , μ j )
📐 DB 指数(DBI)—— 越小越好
DBI = 1 k ∑ i = 1 k max j ≠ i ( avg ( C i ) + avg ( C j ) d cen ( C i , C j ) )
\text{DBI} = \frac{1}{k} \sum_{i=1}^{k} \max_{j \neq i} \left( \frac{\text{avg}(C_i) + \text{avg}(C_j)}{d_{\text{cen} }(C_i, C_j)} \right)
DBI = k 1 i = 1 ∑ k j = i max ( d cen ( C i , C j ) avg ( C i ) + avg ( C j ) )
分子:两个簇各自的”内部松散程度”之和(簇内平均距离越大,说明簇越散)
分母:两簇中心之间的距离(越远越好)
理想情况:各簇紧凑(分子小)且相互远离(分母大),DBI 越小越好。
📐 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 \le i \le k} \left\{ \min_{j \neq i} \left( \frac{d_{\min}(C_i, C_j)}{\max_{1 \le l \le 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 越大越好。
🍎 通俗理解 DBI vs DI
想象你在操场上划定了几个”兴趣小组”的活动区域(簇):
DBI 评估的是:每个小组内部站得有多散 ÷ 小组间距离有多远。 好的分组是小组内抱团紧(分子小),不同小组间离得远(分母大),所以 DBI 越小越好。
DI 评估的是:不同小组之间最近的两个人有多远 ÷ 最大的那个小组直径多宽。 好的分组是不同组的人之间离得远,每个组本身面积小,所以 DI 越大越好。
03. 距离计算 如何量化两个样本之间的”相似度”?
📏 距离度量的基本性质
聚类中使用的距离函数 dist ( ⋅ , ⋅ ) \text{dist}(\cdot, \cdot) dist ( ⋅ , ⋅ ) 需满足以下四条基本性质 :
📐 距离公理
非负性 :dist ( x i , x j ) ≥ 0 \text{dist}(x_i, x_j) \ge 0 dist ( x i , x j ) ≥ 0 (距离不能为负数)
同一性 :dist ( x i , x j ) = 0 \text{dist}(x_i, x_j) = 0 dist ( x i , x j ) = 0 当且仅当 x i = x j x_i = x_j x i = x j (同一个点到自己距离为0)
对称性 :dist ( x i , x j ) = dist ( x j , x i ) \text{dist}(x_i, x_j) = \text{dist}(x_j, x_i) dist ( x i , x j ) = dist ( x j , x i ) (A到B的距离等于B到A的距离)
直递性(三角不等式) :dist ( x i , x j ) ≤ dist ( x i , x k ) + dist ( x k , x j ) \text{dist}(x_i, x_j) \le \text{dist}(x_i, x_k) + \text{dist}(x_k, x_j) dist ( x i , x j ) ≤ dist ( x i , x k ) + dist ( x k , x j ) (直线最短)
⚠️ 注意
在某些聚类场景(如有序距离、相似度度量)中,三角不等式未必成立, 我们称之为**”非度量距离”**。不满足三角不等式也可以使用, 只是不叫”严格的距离度量”。
📏 有序属性:闵可夫斯基距离(Minkowski Distance)
当属性取值为连续的有序数值时(如身高、体重、温度),使用闵可夫斯基距离:
📐 闵可夫斯基距离
设样本 x i = ( x i 1 , x i 2 , … , x i n ) x_i = (x_{i1}, x_{i2}, \ldots, x_{in}) x i = ( x i 1 , x i 2 , … , x in ) ,x j = ( x j 1 , x j 2 , … , x j n ) x_j = (x_{j1}, x_{j2}, \ldots, x_{jn}) x j = ( x j 1 , x j 2 , … , x j n )
dist mk ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 / p
\text{dist}_{\text{mk} }(x_i, x_j) = \left( \sum_{u=1}^{n} |x_{iu} - x_{ju}|^p \right)^{1/p}
dist mk ( x i , x j ) = ( u = 1 ∑ n ∣ x i u − x j u ∣ p ) 1/ p
📐 p=1:曼哈顿距离
dist = ∑ u = 1 n ∣ x i u − x j u ∣
\text{dist} = \sum_{u=1}^{n} |x_{iu} - x_{ju}|
dist = u = 1 ∑ n ∣ x i u − x j u ∣
也叫”出租车距离”——只能沿坐标轴方向走,如同城市街道。
📐 p=2:欧氏距离
dist = ∑ u = 1 n ( x i u − x j u ) 2
\text{dist} = \sqrt{\sum_{u=1}^{n} (x_{iu} - x_{ju})^2}
dist = u = 1 ∑ n ( x i u − x j u ) 2
日常最直觉的”直线距离”,就是尺子量出来的距离。
💡 p→∞:切比雪夫距离
dist = max u ∣ x i u − x j u ∣ \text{dist} = \max_u |x_{iu} - x_{ju}| dist = max u ∣ x i u − x j u ∣ ,即各维度差值的最大值。用于象棋中国王走步的最少步数计算。
🍎 城市地图类比
两地之间的距离: 🔵 欧氏距离 :直接挖隧道的直线距离 🟡 曼哈顿距离 :只走横街竖巷,只能转直角 🔴 切比雪夫距离 :国际象棋棋盘上国王的最少步数
同样的两点,三种"距离"值通常不同!选哪种距离取决于你的应用场景。
📏 无序属性:VDM(Value Difference Metric)
对于离散无序属性 (如性别、颜色、城市名),不能直接做减法, 需要用 VDM 来衡量两个取值之间的差异:
📐 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 是簇数,则:
VDM p ( a , b ) = ∑ i = 1 k ∣ m u , a , i m u , a − m u , b , i m u , b ∣ p
\text{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
VDM p ( a , b ) = i = 1 ∑ k m u , a m u , a , i − m u , b m u , b , i p
直觉:如果属性值 a a a 和 b b b 在各个簇中的”分布情况”越相似,则它们越接近。
🍎 通俗理解 VDM
假设要比较”颜色”属性中”红色”和”粉色”的差异:
我们看红色样本中有多少比例在簇1、簇2、簇3……
再看粉色样本中有多少比例在簇1、簇2、簇3……
如果两者的"分布情况"很像(比如都主要分布在簇1),
那就说明"红色"和"粉色"比较相似。
📏 混合属性处理
实际数据往往同时包含有序属性(数值型)和无序属性(类别型)。 设样本有 n c n_c n c 个有序属性和 n − n c n-n_c n − n c 个无序属性,则混合属性距离:
📐 混合属性闵可夫斯基距离
dist mix ( x i , x j ) = ( ∑ u = 1 n c ∣ x i u − x j u ∣ p + ∑ u = n c + 1 n VDM p ( x i u , x j u ) ) 1 / p
\text{dist}_{\text{mix} }(x_i, x_j) = \left( \sum_{u=1}^{n_c} |x_{iu} - x_{ju}|^p + \sum_{u=n_c+1}^{n} \text{VDM}_p(x_{iu}, x_{ju}) \right)^{1/p}
dist mix ( x i , x j ) = ( u = 1 ∑ n c ∣ x i u − x j u ∣ p + u = n c + 1 ∑ n VDM p ( x i u , x j u ) ) 1/ p
💡 小结
数值型属性 → 闵可夫斯基距离(欧氏、曼哈顿等)
类别型属性 → VDM
混合型 → 加权组合两者
04. k 均值算法(k-means) 最经典的原型聚类方法
⚡ 算法思想
k-means 是**原型聚类(Prototype-based Clustering)的代表算法。 它的核心思想是:用 k k k 个 原型向量(均值向量)**来代表各个簇, 通过迭代优化最小化每个样本到其所属簇中心的距离之和。
📐 优化目标(最小化平方误差)
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 = 1 ∑ k x ∈ C i ∑ ∥ x − μ i ∥ 2 2
其中 μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i = \dfrac{1}{|C_i|} \sum_{x \in C_i} x μ i = ∣ C i ∣ 1 ∑ x ∈ C i x 是第 i i i 个簇的均值向量(质心)
🍎 通俗理解
设想你要在城市里选 k k k 个外卖仓库,让所有顾客到最近仓库的总距离最小。
初始时随机放 {% _internal_math_placeholder 433 %} 个仓库,然后每个顾客"认领"最近的仓库;
接着把每个仓库移动到它服务的所有顾客的中心位置;
顾客重新认领,仓库再移动……如此反复,直到仓库位置不再变化。
这就是 k-means!
⚡ 算法步骤
初始化 :从 D D D 中随机选取 k k k 个样本作为初始均值向量 { μ 1 , μ 2 , … , μ k } \{\mu_1, \mu_2, \ldots, \mu_k\} { μ 1 , μ 2 , … , μ k }
分配步(E步) :对每个样本 x j x_j x j ,计算它到所有均值向量的距离, 将其分配到最近的那个簇: λ j = arg min i ∈ { 1 , … , k } ∥ x j − μ i ∥ 2 \lambda_j = \arg\min_{i \in \{1,\ldots,k\} } \|x_j - \mu_i\|_2 λ j = arg min i ∈ { 1 , … , k } ∥ x j − μ i ∥ 2
更新步(M步) :重新计算每个簇的均值向量(质心): μ i ′ = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i' = \dfrac{1}{|C_i|} \sum_{x \in C_i} x μ i ′ = ∣ C i ∣ 1 ∑ x ∈ C i x
收敛判断 :若所有均值向量都不再发生变化(μ i ′ = μ i \mu_i' = \mu_i μ i ′ = μ i ),则停止;否则令 μ i = μ i ′ \mu_i = \mu_i' μ i = μ i ′ ,返回第2步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 k-means Algorithm 输入:数据集 D = {x₁,...,xₘ},聚类数 k 输出:簇划分 {C₁, C₂, ..., Cₖ} 初始化:从 D 中随机选 k 个样本作为 μ₁, μ₂, ..., μₖ repeat 令 Cᵢ = ∅ (i = 1, 2, ..., k) for j = 1, 2, ..., m do 计算 xⱼ 与每个 μᵢ 的距离 dᵢⱼ = ‖xⱼ - μᵢ‖₂ 找最近的簇:λⱼ = argmin dᵢⱼ 将 xⱼ 加入簇 Cλⱼ end for for i = 1, 2, ..., k do 计算新均值:μᵢ' = (1/|Cᵢ|) Σ x if μᵢ' ≠ μᵢ then 更新 μᵢ ← μᵢ' end if end for until 所有均值向量均未更新 return 簇划分 {C₁, ..., Cₖ}
Step 1: 初始化
Step 2: 分配样本
Step 3: 更新质心
Step 4: 收敛
随机选取2个初始中心
按最近中心分配颜色
✦
✦
移动质心到各簇中心
✦
✦
✓ 质心不再移动,收敛!
k-means 迭代过程示意图(k=2)
⚡ 优缺点与注意事项
✅ 优点
算法简单,易于实现和理解
时间复杂度低,适合大规模数据:O ( m k T ) O(mkT) O ( mk T ) ,m m m 为样本数,k k k 为簇数,T T T 为迭代次数
可扩展性好,工业界广泛应用
❌ 缺点
必须预先指定 k 值 ,而 k 往往难以确定
对初始中心点敏感 ,不同初始值可能导致不同结果(可能陷入局部最优)
只能发现凸形(球形)簇 ,对非球形分布效果差
对**离群点(噪声)**很敏感
每个样本只属于一个簇(硬分配),不能处理模糊边界
🔑 理论保证
k-means 的目标函数 E E E 单调不增,且 E ≥ 0 E \ge 0 E ≥ 0 ,因此算法一定会收敛 (但不保证全局最优)。 实践中通常多次随机初始化,取 E E E 最小的结果;或使用 k-means++ 改进初始化策略。
05. 学习向量量化(LVQ) 有标记信息辅助的原型学习
🔄 与 k-means 的区别
学习向量量化(Learning Vector Quantization,LVQ)也是原型聚类, 但它 利用了样本的标记信息 ,使聚类过程可以受到监督信息的引导。 因此 LVQ 是一种介于无监督和有监督之间的学习方法,目的是学出一组 原型向量 来覆盖整个样本空间。
k-means
无监督,无标记信息
原型 = 簇的均值
原型随着簇成员变化而更新
LVQ
有监督,利用标记信息
原型 = 代表各类的”典型样本”
根据标记的对错来更新原型
🔄 算法流程
📐 LVQ 核心更新规则
设样本 x j x_j x j 的标记为 y j y_j y j ,找到距 x j x_j x j 最近的原型向量 p ∗ p^* p ∗ ,其标记为 t ∗ t^* t ∗ :
若 y j = t ∗ y_j = t^* y j = t ∗ (标记相同) :原型向 x j x_j x j 靠近 :
p ′ = p ∗ + η ⋅ ( x j − p ∗ )
p' = p^* + \eta \cdot (x_j - p^*)
p ′ = p ∗ + η ⋅ ( x j − p ∗ )
若 y j ≠ t ∗ y_j \neq t^* y j = t ∗ (标记不同) :原型向 x j x_j x j 远离 :
p ′ = p ∗ − η ⋅ ( x j − p ∗ )
p' = p^* - \eta \cdot (x_j - p^*)
p ′ = p ∗ − η ⋅ ( x j − p ∗ )
η ∈ ( 0 , 1 ) \eta \in (0, 1) η ∈ ( 0 , 1 ) 为学习率
🍎 通俗理解
LVQ 的学习过程就像训练”班级代表” :
每个班(类别)选一个代表(原型向量)。来了一个新同学,
看他最像哪个代表:
➕ 如果这个代表和新同学是**同班的**,代表就往新同学方向走近一点("你们确实像")
➖ 如果代表和新同学**不同班**,代表就往反方向走("你们不是一类,别搞混")
最终,每个代表都成了本班特征的"精华提炼",同时和其他班的代表保持距离。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 LVQ Algorithm 输入:样本集 D = {(x₁,y₁),...,(xₘ,yₘ)}, 原型向量个数 q, 各类原型向量数目 n₁,...,nN, 学习率 η 初始化:从各类样本中随机选取 nᵢ 个样本作为各类原型向量 {p₁,...,pq} repeat 从 D 中随机选取样本 (xⱼ, yⱼ) 计算 xⱼ 与所有原型向量的距离 dᵢ = ‖xⱼ - pᵢ‖ 找最近的原型 p* = argmin dᵢ,其标记为 t* if yⱼ == t* then p' = p* + η·(xⱼ - p*) // 靠近 else p' = p* - η·(xⱼ - p*) // 远离 end if 更新 p* ← p' until 满足停止条件 return 原型向量集 {p₁, p₂, ..., pq}
💡 LVQ 的应用
LVQ 完成后,可以用学到的原型向量对新样本进行分类或聚类—— 每个样本被分配到最近原型向量对应的类别。 每个原型向量 p i p_i p i 定义了一个 Voronoi 区域 (即比它更近的所有点的集合), 这些区域共同构成对样本空间的划分。
06. 高斯混合聚类(GMM) 概率视角下的软性聚类
🌊 核心思想
与 k-means 不同,高斯混合聚类(Gaussian Mixture Model,GMM) 从概率生成模型 的角度看待聚类: 假设数据是由 k k k 个高斯分布”混合”产生的,每个高斯分布对应一个簇。 输出的不再是”每个样本属于哪个簇”,而是”每个样本以多大概率属于哪个簇”(软聚类 )。
🍎 通俗理解
想象一个校园里有两类人群:高个子(篮球队)和矮个子(体操队)。 身高分布像两座”山峰”叠在一起—— 每座山峰是一个高斯分布,两个混合起来就是全校身高的分布。
现在来了一个身高175cm的同学,
GMM 不会硬性说"你是篮球队或体操队",
而是说"你有 60% 的概率是篮球队,40% 的概率是体操队"。
这就是**软聚类**的魅力!
🌊 数学基础
📐 高斯分布(正态分布)
n n n 维高斯分布的概率密度函数:
p ( x ) = 1 ( 2 π ) n / 2 ∣ Σ ∣ 1 / 2 exp ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) )
p(x) = \frac{1}{(2\pi)^{n/2} |\Sigma|^{1/2} } \exp\left( -\frac{1}{2}(x-\mu)^T \Sigma^{-1} (x-\mu) \right)
p ( x ) = ( 2 π ) n /2 ∣Σ ∣ 1/2 1 exp ( − 2 1 ( x − μ ) T Σ − 1 ( x − μ ) )
其中 μ \mu μ 是均值向量,Σ \Sigma Σ 是协方差矩阵(对称正定),记为 p ( x ∣ μ , Σ ) p(x | \mu, \Sigma) p ( x ∣ μ , Σ )
📐 高斯混合分布
混合高斯模型定义为 k k k 个高斯分布的加权和:
p M ( x ) = ∑ i = 1 k α i ⋅ p ( x ∣ μ i , Σ i )
p_{\mathcal{M} }(x) = \sum_{i=1}^{k} \alpha_i \cdot p(x | \mu_i, \Sigma_i)
p M ( x ) = i = 1 ∑ k α i ⋅ p ( x ∣ μ i , Σ i )
α i > 0 \alpha_i > 0 α i > 0 为第 i i i 个高斯分量的**混合系数**,且 ∑ i = 1 k α i = 1 \sum_{i=1}^k \alpha_i = 1 ∑ i = 1 k α i = 1
μ i \mu_i μ i 为第 i i i 个分量的**均值向量**
Σ i \Sigma_i Σ i 为第 i i i 个分量的**协方差矩阵**
📐 后验概率(样本属于第 i 个分量的概率)
由贝叶斯定理,给定样本 x j x_j x j ,其由第 i i i 个高斯分量生成的后验概率为:
γ j i = P ( z j = i ∣ x j ) = α i ⋅ p ( x j ∣ μ i , Σ i ) ∑ l = 1 k α l ⋅ p ( x j ∣ μ l , Σ l )
\gamma_{ji} = P(z_j = i | x_j) = \frac{\alpha_i \cdot p(x_j | \mu_i, \Sigma_i)}{\sum_{l=1}^{k} \alpha_l \cdot p(x_j | \mu_l, \Sigma_l)}
γ j i = P ( z j = i ∣ x j ) = ∑ l = 1 k α l ⋅ p ( x j ∣ μ l , Σ l ) α i ⋅ p ( x j ∣ μ i , Σ i )
🌊 EM 算法求解 GMM
GMM 的参数 { ( α i , μ i , Σ i ) } \{(\alpha_i, \mu_i, \Sigma_i)\} {( α i , μ i , Σ i )} 无法直接求解(因为每个样本”属于哪个分量”是隐变量), 需要用期望最大化(EM)算法 迭代求解。
E步(期望步)
固定当前参数,计算每个样本属于每个分量的后验概率 γ j i \gamma_{ji} γ j i (责任度)。
M步(最大化步)
利用后验概率 γ j i \gamma_{ji} γ j i 更新模型参数,使似然函数最大化。
📐 M步更新公式
令 m ^ i = ∑ j = 1 m γ j i \hat{m}_i = \sum_{j=1}^m \gamma_{ji} m ^ i = ∑ j = 1 m γ j i (第 i i i 个分量的”等效样本数”),则:
μ ^ i = ∑ j = 1 m γ j i x j m ^ i
\hat{\mu}_i = \frac{\sum_{j=1}^m \gamma_{ji} x_j}{\hat{m}_i}
μ ^ i = m ^ i ∑ j = 1 m γ j i x j
Σ ^ i = ∑ j = 1 m γ j i ( x j − μ ^ i ) ( x j − μ ^ i ) T m ^ i
\hat{\Sigma}_i = \frac{\sum_{j=1}^m \gamma_{ji} (x_j - \hat{\mu}_i)(x_j - \hat{\mu}_i)^T}{\hat{m}_i}
Σ ^ i = m ^ i ∑ j = 1 m γ j i ( x j − μ ^ i ) ( x j − μ ^ i ) T
α ^ i = m ^ i m
\hat{\alpha}_i = \frac{\hat{m}_i}{m}
α ^ i = m m ^ i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Gaussian Mixture Model — EM Algorithm 初始化:随机设置 αᵢ, μᵢ, Σᵢ (i=1,...,k) repeat // ========= E 步 ========= for j = 1, ..., m do for i = 1, ..., k do γⱼᵢ = αᵢ·p(xⱼ|μᵢ,Σᵢ) / Σₗ αₗ·p(xⱼ|μₗ,Σₗ) // 后验概率 end for end for // ========= M 步 ========= for i = 1, ..., k do m̂ᵢ = Σⱼ γⱼᵢ μ̂ᵢ = (1/m̂ᵢ) Σⱼ γⱼᵢ·xⱼ // 加权均值 Σ̂ᵢ = (1/m̂ᵢ) Σⱼ γⱼᵢ·(xⱼ-μ̂ᵢ)(xⱼ-μ̂ᵢ)ᵀ // 加权协方差 α̂ᵢ = m̂ᵢ / m // 混合系数 end for until 似然函数 log-likelihood 变化小于阈值 ε return 参数 {(α̂ᵢ, μ̂ᵢ, Σ̂ᵢ)}
💡 GMM vs k-means
k-means 是 GMM 的一个特殊情况 :当所有协方差矩阵都是 σ 2 I \sigma^2 I σ 2 I 且 σ → 0 \sigma \to 0 σ → 0 时,GMM 退化为 k-means
GMM 可以描述椭圆形的簇(通过协方差矩阵),而 k-means 只能描述球形簇
GMM 提供软聚类 (概率分配),k-means 是硬聚类
GMM 最终聚类时,将样本分配给后验概率最大的分量:λ j = arg max i γ j i \lambda_j = \arg\max_i \gamma_{ji} λ j = arg max i γ j i
07. 密度聚类:DBSCAN 基于密度的空间聚类,能发现任意形状的簇
🌐 核心思想
DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 是基于密度的聚类算法,核心思想是:高密度区域连通形成簇,低密度区域是噪声 。 与 k-means 完全不同,DBSCAN 不需要指定 k k k ,并且可以发现任意形状的簇。
🍎 通俗理解
想象夜晚城市的卫星俯拍图:灯光密集的区域 就是城市(簇), 灯光稀疏的地方是农村或荒野(噪声)。 你不需要事先知道有几个城市,只要规定”灯光密度超过某个阈值就算城市”, 然后把相邻的密集区域连起来,就找到了所有城市。 这就是 DBSCAN 的思路!
🌐 核心概念(必须掌握!)
DBSCAN 有两个关键参数:邻域半径 ϵ \epsilon ϵ 和最小样本数 MinPts,以及以下核心概念:
📌 ε-邻域
对于样本 x j x_j x j ,其 ϵ \epsilon ϵ -邻域包含所有与 x j x_j x j 距离不超过 ϵ \epsilon ϵ 的样本:
N ϵ ( x j ) = { x i ∈ D ∣ dist ( x i , x j ) ≤ ϵ } N_\epsilon(x_j) = \{x_i \in D \mid \text{dist}(x_i, x_j) \le \epsilon\} N ϵ ( x j ) = { x i ∈ D ∣ dist ( x i , x j ) ≤ ϵ }
以某人为圆心、半径 ϵ \epsilon ϵ 画一个圆,圆内的所有人就是它的 ϵ \epsilon ϵ -邻域。
📌 核心对象(Core Object)
若 ∣ N ϵ ( x j ) ∣ ≥ MinPts |N_\epsilon(x_j)| \ge \text{MinPts} ∣ N ϵ ( x j ) ∣ ≥ MinPts ,即 x j x_j x j 的 ϵ \epsilon ϵ -邻域内包含至少 MinPts 个样本,则称 x j x_j x j 为核心对象 。
某个人周围(半径 ϵ \epsilon ϵ 内)至少有 MinPts 个朋友,那他就是一个"人气王"(核心对象)。人气不够的就是边缘人或噪声。
📌 密度直达(Directly Density-Reachable)
若 x j ∈ N ϵ ( x i ) x_j \in N_\epsilon(x_i) x j ∈ N ϵ ( x i ) 且 x i x_i x i 是核心对象,则称 x j x_j x j 由 x i x_i x i 密度直达 (x i → x j x_i \to x_j x i → x j )。
人气王 x i x_i x i 的朋友圈里有 x j x_j x j ,则 x j x_j x j 是 x i x_i x i 的直接下属/朋友。注意:密度直达不一定是对称的 (x j x_j x j 不一定是核心对象)。
📌 密度可达(Density-Reachable)
若存在一个样本序列 p 1 , p 2 , … , p n p_1, p_2, \ldots, p_n p 1 , p 2 , … , p n ,其中 p 1 = x i p_1 = x_i p 1 = x i ,p n = x j p_n = x_j p n = x j ,且 p t + 1 p_{t+1} p t + 1 由 p t p_t p t 密度直达,则 x j x_j x j 由 x i x_i x i 密度可达 。
通过"朋友的朋友的朋友……"的链条能到达某人,就是密度可达。是传递闭包。
📌 密度相连(Density-Connected)
若存在 x k x_k x k 使得 x i x_i x i 和 x j x_j x j 均由 x k x_k x k 密度可达,则 x i x_i x i 与 x j x_j x j 密度相连 。
簇 的定义:一个簇 C C C 是满足以下条件的最大样本子集:
① 连通性 :C C C 中任意两点 x i , x j x_i, x_j x i , x j 密度相连;
② 最大性 :若 x i ∈ C x_i \in C x i ∈ C 且 x j x_j x j 由 x i x_i x i 密度可达,则 x j ∈ C x_j \in C x j ∈ C 。
x i x_i x i 和 x j x_j x j 有一个共同的"人气王"朋友,就说他们密度相连 ——这是定义簇的基础!
🌐 DBSCAN 算法步骤
找出所有核心对象 ,存入集合 Ω \Omega Ω
从 Ω \Omega Ω 中随机取一个核心对象 o o o ,初始化一个新簇 C = { o } C = \{o\} C = { o }
将 o o o 的 ϵ \epsilon ϵ -邻域内所有样本加入队列 Q Q Q
从 Q Q Q 中取出一个样本 q q q ,加入 C C C ;若 q q q 也是核心对象,将其 ϵ \epsilon ϵ -邻域未处理的样本加入 Q Q Q ;重复直到 Q Q Q 为空
将核心对象 o o o 从 Ω \Omega Ω 中移除,输出簇 C C C ;重复步骤2~5直到 Ω \Omega Ω 为空
未被任何簇包含的样本即为噪声点(离群点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 DBSCAN Algorithm 输入:数据集 D,邻域参数 (ε, MinPts) 输出:簇划分 C // 第一步:找所有核心对象 Ω = {} // 核心对象集合 for j = 1, ..., m do if |Nε(xⱼ)| ≥ MinPts then Ω = Ω ∪ {xⱼ} end for k = 0; Γ = D // k:簇数, Γ:未被访问的样本集合 while Ω ≠ ∅ do Γ_old = Γ 从 Ω 随机选一个核心对象 o Q = {o}; Γ = Γ \ {o} while Q ≠ ∅ do 取 Q 中的一个样本 q; Q = Q \ {q} if q 是核心对象 then Δ = Nε(q) ∩ Γ // 邻域中尚未处理的样本 Q = Q ∪ Δ; Γ = Γ \ Δ k = k+1; 簇 Cₖ = Γ_old \ Γ Ω = Ω \ Cₖ return {C₁, C₂, ..., Cₖ} // Γ 中剩余为噪声点
簇 1(任意形状)
簇 2(任意形状)
噪声点(离群点)
虚线圆 = ε-邻域示意
DBSCAN 能发现任意形状的簇,并自动识别噪声点
✅ DBSCAN 优点
可以发现任意形状 的簇
能自动识别噪声点 (离群点)
不需要预先指定 k k k
对大多数情况鲁棒性好
❌ DBSCAN 缺点
需要设置 ϵ \epsilon ϵ 和 MinPts 两个参数,较敏感
对密度不均匀 的数据效果差(密度差异大的簇难以用单一 ϵ \epsilon ϵ 描述)
高维数据中密度难以定义
大数据集时计算开销较大
08. 层次聚类:AGNES 从底向上逐步合并,构建簇的层次结构
🌳 核心思想
**AGNES(AGglomerative NESting)**是自底向上的凝聚层次聚类算法。 它将每个样本视为一个独立的簇,然后不断合并最相似的两个簇, 直到满足停止条件(如簇数达到 k k k )。
🍎 通俗理解
想象生物分类学:每个物种最初都是独立的个体,然后按照亲缘关系逐步合并—— 先合并为”属”,再合并为”科”、”目”、”纲”……最终所有生物汇聚到一棵树上。
AGNES 就是不断地把"最像"的两组合并,直到剩下 {% _internal_math_placeholder 559 %} 组为止。
整个过程形成一棵**树状图(Dendrogram)**,可以直观看到聚类的层次关系。
🌳 簇间距离的三种度量
AGNES 的关键在于如何定义两个簇之间 的距离,这决定了每次合并哪两个簇:
📐 最小距离(单链接, Single Linkage)
d min ( C i , C j ) = min x ∈ C i , z ∈ C j dist ( x , z )
d_{\min}(C_i, C_j) = \min_{x \in C_i, z \in C_j} \text{dist}(x, z)
d m i n ( C i , C j ) = x ∈ C i , z ∈ C j min dist ( x , z )
两簇中最近的两个样本的距离。容易产生”链式效应”——把两个原本不相似的簇通过中间点串联起来。
📐 最大距离(全链接, Complete Linkage)
d max ( C i , C j ) = max x ∈ C i , z ∈ C j dist ( x , z )
d_{\max}(C_i, C_j) = \max_{x \in C_i, z \in C_j} \text{dist}(x, z)
d m a x ( C i , C j ) = x ∈ C i , z ∈ C j max dist ( x , z )
两簇中最远的两个样本的距离。倾向于产生大小相近的紧凑簇,但对离群点敏感。
📐 平均距离(均链接, Average Linkage)
d avg ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ z ∈ C j dist ( x , z )
d_{\text{avg} }(C_i, C_j) = \frac{1}{|C_i||C_j|} \sum_{x \in C_i} \sum_{z \in C_j} \text{dist}(x, z)
d avg ( C i , C j ) = ∣ C i ∣∣ C j ∣ 1 x ∈ C i ∑ z ∈ C j ∑ dist ( x , z )
两簇中所有样本对的平均距离。综合了单链接和全链接,通常效果最好。
🍎 三种链接的直觉对比
两个城市(簇)之间的”距离”:
🔵 **单链接**:两城最近的两栋楼的距离(最乐观估计)
🔴 **全链接**:两城最远的两栋楼的距离(最悲观估计)
🟢 **均链接**:两城所有楼两两配对的平均距离(综合估计)
🌳 算法步骤与树状图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 AGNES Algorithm 输入:数据集 D,聚类数 k,距离度量类型 输出:簇划分 {C₁, ..., Cₖ} // 初始化:每个样本自成一簇 for j = 1, ..., m do Cⱼ = {xⱼ} // m 个初始簇 end for // 计算所有簇对之间的距离矩阵 M M[i][j] = dist(Cᵢ, Cⱼ) (初始 = dist(xᵢ, xⱼ)) q = m // 当前簇数 while q > k do 找距离最小的两个簇 Cᵢ*, Cⱼ* = argmin M[i][j] 合并 Cᵢ* ∪ Cⱼ* → 新簇 从 M 中删除 Cᵢ*, Cⱼ* 的行列,加入新簇的行列 重新计算新簇与其他簇的距离 q = q - 1 return 当前簇划分
A
B
C
D
E
F
A∪B
C∪D
E∪F
AB∪CD
全部
k=3
层次聚类树状图 — 横线处截断即得 k 个簇
🔑 树状图(Dendrogram)的使用
树状图是层次聚类的最大优势——它记录了所有合并过程。 只需在树状图的某个高度处横切 ,就可以得到对应数量的簇: • 切得越低 → 簇数 k k k 越大(更细的分组) • 切得越高 → 簇数 k k k 越小(更粗的分组) • 不需要事先指定 k k k ,事后按需选择!
✅ AGNES 优点
能生成完整的层次结构,可视化直观
不需要预先指定 k k k (事后截断)
能揭示数据的多尺度结构
❌ AGNES 缺点
时间复杂度高:O ( m 2 log m ) O(m^2 \log m) O ( m 2 log m ) (对大规模数据慢)
合并操作不可逆 ,错误合并无法纠正
对噪声和离群点敏感(尤其是单链接)
09. 算法对比总结 一表看懂所有聚类算法的特点与适用场景
算法
类型
是否需指定 k
输出类型
簇形状
噪声处理
适用场景
k-means
原型聚类
✅ 需要
硬聚类
球形(凸形)
❌ 敏感
数据规模大,簇形状近似球形
LVQ
原型聚类(半监督)
✅ 需要
硬聚类
Voronoi 区域
❌ 敏感
有部分标记信息,需要学习原型
高斯混合(GMM)
概率聚类
✅ 需要
软聚类(概率)
椭圆形
⚠️ 一般
数据符合混合高斯分布,需软分配
DBSCAN
密度聚类
❌ 不需要
硬聚类 + 噪声
任意形状
✅ 很好
任意形状的簇,数据中有噪声
AGNES
层次聚类
❌ 不需要(事后截断)
层次结构
取决于链接方式
⚠️ 一般
需要可视化层次关系,数据量较小
📊 思维导图:第九章知识体系
第九章 聚类
Clustering
性能度量
JC / FMI / RI / DBI / DI
距离计算
Minkowski / VDM
原型聚类
k-means · LVQ · 高斯混合(GMM)
密度聚类
DBSCAN
层次聚类
AGNES · 树状图
无监督学习
无标签 · 自动发现结构
周志华《机器学习》第九章 · 知识体系概览
🎓 学习路线与重点提示
🔑 考试/面试高频考点
📌 k-means 算法流程 :能手写伪代码,说清楚优缺点,理解”局部最优”问题
📌 DBSCAN 的核心概念 :ε-邻域、核心对象、密度直达/可达/相连的定义与区别
📌 EM 算法在 GMM 中的应用 :理解 E步(计算后验)和 M步(更新参数)
📌 外部指标 vs 内部指标 :JC/FMI/RI 的公式含义;DBI/DI 的大小方向
📌 AGNES 的三种链接方式 :单链接/全链接/均链接的区别和适用场景
📌 各算法的适用场景对比 :在什么情况下选哪种算法
💡 最后的类比总结
🍽️ k-means :食堂打菜——每道菜只能选一个窗口(硬分配), 打菜员(质心)站在最中间的位置。
🏫 **LVQ**:选班级代表——代表要真正"代表"这个班,
和其他班的代表要不一样。
🎨 **GMM**:颜料调色——数据是多种颜色的混合,
每种颜色有一定比例(混合系数)和特征(均值/方差)。
🌆 **DBSCAN**:卫星夜视图找城市——密集的灯光是城市(簇),
孤立的灯是村庄(噪声)。
🌳 **AGNES**:生物分类树——从物种不断往上合并,
最终形成门纲目科属种的层级结构。