无监督学习(聚类)(Unsupervised Learning)

无监督学习(聚类)(Unsupervised Learning)

  • [无监督学习(聚类)(Unsupervised Learning)](#无监督学习(聚类)(Unsupervised Learning))
  • [1. 假设空间与模型](#1. 假设空间与模型)
    • [1.1 假设空间](#1.1 假设空间)
    • [1.2 模型的两种形式](#1.2 模型的两种形式)
    • [1.3 数据矩阵表示](#1.3 数据矩阵表示)
    • [1.4 目标:最小化压缩损失](#1.4 目标:最小化压缩损失)
  • [2. 聚类方法](#2. 聚类方法)
    • [2.1 聚类的基本概念](#2.1 聚类的基本概念)
      • [2.1.1 相似度或距离](#2.1.1 相似度或距离)
      • [2.1.2 类或簇](#2.1.2 类或簇)
        • [1. 最大距离阈值](#1. 最大距离阈值)
        • [2. 最近邻阈值](#2. 最近邻阈值)
        • [3. 平均距离阈值](#3. 平均距离阈值)
        • [4. 整体平均阈值](#4. 整体平均阈值)
      • [2.1.3 类与类之间的距离](#2.1.3 类与类之间的距离)
        • [1. 最短距离(Single Linkage)](#1. 最短距离(Single Linkage))
        • [2. 最长距离(Complete Linkage)](#2. 最长距离(Complete Linkage))
        • [3. 中心距离(Centroid Linkage)](#3. 中心距离(Centroid Linkage))
        • [4. 平均距离(Average Linkage)](#4. 平均距离(Average Linkage))
    • [2.2 层次聚类](#2.2 层次聚类)
      • [2.2.1 聚合聚类的三个要素](#2.2.1 聚合聚类的三个要素)
      • [2.2.2 算法流程](#2.2.2 算法流程)
      • [2.2.3 一个完整例子(单链接)](#2.2.3 一个完整例子(单链接))
    • [2.3 K均值聚类](#2.3 K均值聚类)
      • [2.3.1 算法思想](#2.3.1 算法思想)
      • [2.3.2 算法步骤](#2.3.2 算法步骤)
      • [2.3.3 一个具体例子(二维数据)](#2.3.3 一个具体例子(二维数据))
      • [2.3.4 如何选择 K K K?------ 肘部法则](#2.3.4 如何选择 K K K?—— 肘部法则)
      • [2.3.5 初始中心的选择与 K‑Means++](#2.3.5 初始中心的选择与 K‑Means++)

无监督学习(聚类)(Unsupervised Learning)

监督学习需要带标签的数据,但现实中的大多数数据是没有标签的。

比如电商平台的上亿条用户行为记录、社交网络的海量文本图片、传感器不断产生的时序数据......我们不可能(也没必要)为每一条数据都打上人工标签。

这时候就需要无监督学习登场了。

无监督学习的核心目标很简单:在没有标签的情况下,自动发现数据中隐藏的结构和规律


1. 假设空间与模型

本章说明:这一章主要建立无监督学习的数学框架和基本概念,介绍它要解决的几类问题(聚类、降维、概率估计)。至于具体每个算法(如 K-Means、PCA、GMM)的原理和推导,将在后续章节中详细展开。

1.1 假设空间

在监督学习中,假设空间是输入到输出的映射集合。而在无监督学习中,由于没有输出标签,假设空间的定义有所不同。

设输入空间为 X ⊆ R M \mathcal{X} \subseteq \mathbb{R}^M X⊆RM,每个样本 x i ∈ X x_i \in \mathcal{X} xi∈X 是一个 M M M 维向量。无监督学习的目标是发现数据内部的结构,输出空间 Z \mathcal{Z} Z 取决于具体任务:

  • 对于聚类 : Z = { 1 , 2 , ... , K } \mathcal{Z} = \{1, 2, \dots, K\} Z={1,2,...,K},表示 K K K 个类别标签
  • 对于降维 : Z ⊆ R d \mathcal{Z} \subseteq \mathbb{R}^d Z⊆Rd,其中 d < M d < M d<M
  • 对于概率估计 : Z \mathcal{Z} Z 是概率分布的参数空间

无监督学习的假设空间 H \mathcal{H} H 可以表示为:

H = { h : X → Z } \mathcal{H} = \{h: \mathcal{X} \to \mathcal{Z}\} H={h:X→Z}

其中 h h h 是某个映射函数。与监督学习不同,这里的"正确"映射没有标准答案,模型需要在没有任何外部指导的情况下,从数据本身的结构中选择一个合理的映射。


1.2 模型的两种形式

无监督学习的模型通常有两种表达形式:

形式一:函数模型

直接用一个函数 z = g ( x ) z = g(x) z=g(x) 表示从输入到输出的映射。例如:

  • 在 K K K-means 聚类中: g ( x ) = arg ⁡ min ⁡ k ∥ x − μ k ∥ 2 g(x) = \arg\min_{k} \|x - \mu_k\|^2 g(x)=argmink∥x−μk∥2,将样本分配到最近的簇中心
  • 在 PCA 降维中: z = W T x z = W^T x z=WTx,其中 W W W 是投影矩阵, z z z 是低维表示

形式二:概率模型

用一个条件概率分布 P ( z ∣ x ) P(z|x) P(z∣x) 来描述给定输入 x x x 时输出 z z z 的分布。更一般地,还可以假设数据是由某个含隐变量的概率模型生成的:

P ( x ) = ∑ z P ( x ∣ z ) P ( z ) P(x) = \sum_{z} P(x|z)P(z) P(x)=z∑P(x∣z)P(z)

或者连续形式:

P ( x ) = ∫ P ( x ∣ z ) P ( z ) d z P(x) = \int P(x|z)P(z) dz P(x)=∫P(x∣z)P(z)dz

其中 z z z 是隐变量,代表数据中隐藏的结构(如类别、低维坐标等)。学习的目标是估计模型参数 θ \theta θ,使得观测数据 U U U 的出现概率最大:

θ ^ = arg ⁡ max ⁡ θ ∏ i = 1 N P ( x i ; θ ) \hat{\theta} = \arg\max_{\theta} \prod_{i=1}^{N} P(x_i; \theta) θ^=argθmaxi=1∏NP(xi;θ)

这也就是极大似然估计的思想。高斯混合模型(GMM)就是这类方法的典型代表。


1.3 数据矩阵表示

训练数据 U U U 通常表示为一个 M × N M \times N M×N 的矩阵( M M M 维特征, N N N 个样本):

X = x 11 x 12 ⋯ x 1 N x 21 x 22 ⋯ x 2 N ⋮ ⋮ ⋱ ⋮ x M 1 x M 2 ⋯ x M N X = \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1N} \\ x_{21} & x_{22} & \cdots & x_{2N} \\ \vdots & \vdots & \ddots & \vdots \\ x_{M1} & x_{M2} & \cdots & x_{MN} \end{bmatrix} X= x11x21⋮xM1x12x22⋮xM2⋯⋯⋱⋯x1Nx2N⋮xMN

其中 x i j x_{ij} xij 表示第 j j j 个样本的第 i i i 个特征值, i = 1 , ... , M i = 1,\dots,M i=1,...,M, j = 1 , ... , N j = 1,\dots,N j=1,...,N。每一列是一个样本,每一行是一个特征维度。

无监督学习的核心任务,就是对这个矩阵的"压缩":

  • 纵向压缩(行方向):对样本(列)进行聚类,使相似的列归为一组
  • 横向压缩(列方向) :对特征(行)进行降维,减少行数 M M M,保留主要信息
  • 双向压缩:同时进行纵向和横向的压缩,寻找数据的低维结构

1.4 目标:最小化压缩损失

无监督学习可以被统一理解为:寻找一个压缩映射 h : X → Z h: \mathcal{X} \to \mathcal{Z} h:X→Z,使得压缩后的表示尽可能保留原始数据的信息。这等价于最小化某个损失函数 L L L:

min ⁡ h ∈ H L ( X , h ( X ) ) \min_{h \in \mathcal{H}} L(X, h(X)) h∈HminL(X,h(X))

不同的任务对应于不同的损失函数:

  • 聚类:最小化簇内距离(如 K K K-means 的误差平方和)
  • 降维:最小化重构误差(如 PCA 的投影损失)
  • 概率估计:最大化对数似然(等价于最小化 KL 散度)

损失最小的压缩结果,被认为揭示了数据最本质的结构。


2. 聚类方法

聚类,顾名思义,就是把相似的东西聚在一起。

从数据角度看,聚类算法接收一组无标签样本,输出若干个类别(称为"簇")。它不依赖任何人工标注,完全由数据本身的相似性驱动------相似的样本被分到同一个簇,不相似的样本进入不同的簇。

聚类是应用最广的无监督学习方法之一。用户分群、图像分割、文档归类、异常检测......这些场景背后都有聚类算法的身影。


2.1 聚类的基本概念

聚类是无监督学习中最常用的一类方法,其目标是将数据集中的样本划分为若干个互不相交的子集(称为"簇"),使得同一簇内的样本尽可能相似,不同簇之间的样本尽可能不同。

聚类的一个核心问题是如何度量样本之间的相似性。下面介绍几种常用的相似度或距离度量。


2.1.1 相似度或距离

设两个样本 x i = ( x i 1 , x i 2 , ... , x i M ) ⊤ x_i = (x_{i1}, x_{i2}, \dots, x_{iM})^\top xi=(xi1,xi2,...,xiM)⊤ 和 x j = ( x j 1 , x j 2 , ... , x j M ) ⊤ x_j = (x_{j1}, x_{j2}, \dots, x_{jM})^\top xj=(xj1,xj2,...,xjM)⊤, M M M 为特征维度。

1. 闵可夫斯基距离(Minkowski Distance)

d i j = ( ∑ k = 1 M ∣ x i k − x j k ∣ p ) 1 p d_{ij} = \left( \sum_{k=1}^{M} |x_{ik} - x_{jk}|^p \right)^{\frac{1}{p}} dij=(k=1∑M∣xik−xjk∣p)p1

  • 当 p = 1 p=1 p=1 时,为曼哈顿距离 (Manhattan Distance): d i j = ∑ k = 1 M ∣ x i k − x j k ∣ d_{ij} = \sum_{k=1}^{M} |x_{ik} - x_{jk}| dij=k=1∑M∣xik−xjk∣
  • 当 p = 2 p=2 p=2 时,为欧氏距离 (Euclidean Distance): d i j = ∑ k = 1 M ( x i k − x j k ) 2 d_{ij} = \sqrt{\sum_{k=1}^{M} (x_{ik} - x_{jk})^2} dij=k=1∑M(xik−xjk)2
  • 当 p = ∞ p=\infty p=∞ 时,为切比雪夫距离 (Chebyshev Distance): d i j = max ⁡ k ∣ x i k − x j k ∣ d_{ij} = \max_k |x_{ik} - x_{jk}| dij=kmax∣xik−xjk∣

2. 马哈拉诺比斯距离(Mahalanobis Distance)

马氏距离是一种考虑特征之间相关性的距离度量,且与各个特征的尺度无关。它相当于对数据先进行标准化和去相关变换,再计算欧氏距离。

给定样本集合 X = x i j M × N X = x_{ij}_{M \times N} X=xijM×N( M M M 维特征, N N N 个样本),协方差矩阵为 S S S。样本 x i x_i xi 与 x j x_j xj 之间的马氏距离定义为:

d i j = ( x i − x j ) ⊤ S − 1 ( x i − x j ) 1 2 d_{ij} = \left (x_i - x_j)\^\\top S\^{-1} (x_i - x_j) \\right^{\frac{1}{2}} dij=(xi−xj)⊤S−1(xi−xj)21

当 S S S 为单位矩阵时,马氏距离退化为欧氏距离,因此马氏距离是欧氏距离的推广。

马氏距离的优点:消除了特征量纲的影响,并且考虑了特征之间的相关性。缺点是计算协方差矩阵及其逆矩阵的代价较高,且要求样本数大于特征维数。


3. 余弦相似度(Cosine Similarity)

衡量两个向量的方向是否一致,不考虑长度:

s i j = x i ⋅ x j ∥ x i ∥ ∥ x j ∥ = ∑ k = 1 M x i k x j k ∑ k = 1 M x i k 2 ∑ k = 1 M x j k 2 s_{ij} = \frac{x_i \cdot x_j}{\|x_i\| \|x_j\|} = \frac{\sum_{k=1}^{M} x_{ik} x_{jk}}{\sqrt{\sum_{k=1}^{M} x_{ik}^2} \sqrt{\sum_{k=1}^{M} x_{jk}^2}} sij=∥xi∥∥xj∥xi⋅xj=∑k=1Mxik2 ∑k=1Mxjk2 ∑k=1Mxikxjk

取值范围为 − 1 , 1 -1, 1 −1,1,值越大表示越相似。对应的距离为 d i j = 1 − s i j d_{ij} = 1 - s_{ij} dij=1−sij。常用于文本数据(词频向量)。

一个重要提醒:

不同的相似度或距离度量,得到的结果可能并不一致。比如在下图的例子中,从欧氏距离的角度看,A和B更相似;但从相关系数的角度看,A和C更相似。

这说明不存在"万能"的度量方式。进行聚类时,需要根据数据的实际特点(是否连续、量纲是否一致、特征是否相关、是否需要考虑方向等)来选择适合的相似度或距离度量。


4. 相关距离(Correlation Distance)

衡量两个向量的变化趋势是否一致(如是否同时增大或减小),对数据的整体偏移不敏感。

基于皮尔逊相关系数:

ρ i j = ∑ k = 1 M ( x i k − x ˉ i ) ( x j k − x ˉ j ) ∑ k = 1 M ( x i k − x ˉ i ) 2 ∑ k = 1 M ( x j k − x ˉ j ) 2 \rho_{ij} = \frac{\sum_{k=1}^{M} (x_{ik} - \bar{x}i)(x{jk} - \bar{x}j)}{\sqrt{\sum{k=1}^{M} (x_{ik} - \bar{x}i)^2} \sqrt{\sum{k=1}^{M} (x_{jk} - \bar{x}_j)^2}} ρij=∑k=1M(xik−xˉi)2 ∑k=1M(xjk−xˉj)2 ∑k=1M(xik−xˉi)(xjk−xˉj)

其中 x ˉ i = 1 M ∑ k = 1 M x i k \bar{x}i = \frac{1}{M} \sum{k=1}^{M} x_{ik} xˉi=M1∑k=1Mxik。相关距离为 d i j = 1 − ρ i j d_{ij} = 1 - \rho_{ij} dij=1−ρij。

ρ i j \rho_{ij} ρij 的取值范围是 − 1 , 1 -1, 1 −1,1。 ρ i j = 1 \rho_{ij} = 1 ρij=1 表示完全正相关(两个向量的变化趋势完全一致), ρ i j = − 1 \rho_{ij} = -1 ρij=−1 表示完全负相关(变化趋势相反), ρ i j = 0 \rho_{ij} = 0 ρij=0 表示不相关。

与余弦相似度不同,相关系数在计算前减去了均值 x ˉ i \bar{x}_i xˉi 和 x ˉ j \bar{x}_j xˉj,因此它对向量的整体偏移 不敏感。例如, x i x_i xi 和 x i + c x_i + c xi+c 的相关系数为 1(完全正相关),但余弦相似度可能不为 1。


5. 汉明距离(Hamming Distance)

用于离散特征(如二值向量),定义为两个向量在不同维度上取值的差异个数:

d i j = ∑ k = 1 M I ( x i k ≠ x j k ) d_{ij} = \sum_{k=1}^{M} \mathbb{I}(x_{ik} \neq x_{jk}) dij=k=1∑MI(xik=xjk)

其中 I ( ⋅ ) \mathbb{I}(\cdot) I(⋅) 是指示函数,条件成立时为 1,否则为 0。


选择距离度量的注意事项:

度量方式 适用场景 注意事项
欧氏距离 特征连续、量纲一致 量纲不同时需先做标准化
马氏距离 特征相关、量纲不同 计算代价高,需样本数大于特征维数
余弦相似度 方向比长度更重要(如文本) 高维空间中比欧氏距离更稳定
相关距离 衡量变化趋势是否一致 对数据的整体偏移不敏感
汉明距离 类别型或二值型特征 不考虑数值大小,只关心是否相等

2.1.2 类或簇

通过聚类得到的类或簇,是样本的子集。一个类可以有不同的定义方式,下面给出几种常见的定义。

设 G G G 表示一个类, x i , x j x_i, x_j xi,xj 表示类中的样本, n G n_G nG 表示 G G G 中样本的个数, d i j d_{ij} dij 表示样本 x i x_i xi 与 x j x_j xj 之间的距离。


1. 最大距离阈值

设 T T T 为给定的正数,若集合 G G G 中任意两个样本的距离都不超过 T T T,即

d i j ≤ T , ∀ x i , x j ∈ G d_{ij} \le T, \quad \forall x_i, x_j \in G dij≤T,∀xi,xj∈G

则称 G G G 为一个类。

这是最严格的定义,要求类内任意两点都足够近。类似"篮球队员之间互相都认识"。


2. 最近邻阈值

设 T T T 为给定的正数,若对 G G G 中任意一个样本,都存在 G G G 中的另一个样本与它的距离不超过 T T T,即

∀ x i ∈ G , ∃ x j ∈ G , d i j ≤ T \forall x_i \in G,\ \exists x_j \in G,\ d_{ij} \le T ∀xi∈G, ∃xj∈G, dij≤T

则称 G G G 为一个类。

这个定义更宽松,允许类内有一些"跳板"点连接。类似"传话游戏",每个人只要认识下一个人就行。


3. 平均距离阈值

设 T T T 为给定的正数,若 G G G 中每个样本到类内其他样本的平均距离都不超过 T T T,即

1 n G − 1 ∑ x j ∈ G d i j ≤ T , ∀ x i ∈ G \frac{1}{n_G-1} \sum_{x_j \in G} d_{ij} \le T, \quad \forall x_i \in G nG−11xj∈G∑dij≤T,∀xi∈G

则称 G G G 为一个类。

允许个别点离群稍远,只要平均距离不大就行。类似"班级平均成绩达标,允许有不及格的同学"。


4. 整体平均阈值

设 T T T 为给定的正数,若 G G G 中所有样本对之间的平均距离不超过 T T T,即

1 n G ( n G − 1 ) ∑ x i ∈ G ∑ x j ∈ G d i j ≤ T \frac{1}{n_G(n_G-1)} \sum_{x_i \in G} \sum_{x_j \in G} d_{ij} \le T nG(nG−1)1xi∈G∑xj∈G∑dij≤T

则称 G G G 为一个类。

这是最宽松的定义,只要求整体平均距离小,允许内部结构松散。类似"公司平均年龄30岁,不一定每个人都在30岁左右"。


类的常用特征

对于一个类 G G G,常用以下指标描述它的性质:

1. 类的中心(均值)

x ˉ G = 1 n G ∑ i = 1 n G x i \bar{x}G = \frac{1}{n_G} \sum{i=1}^{n_G} x_i xˉG=nG1i=1∑nGxi

即类内所有样本的平均值,代表这个类的"重心"位置。

2. 类的直径

D G = max ⁡ x i , x j ∈ G d i j D_G = \max_{x_i, x_j \in G} d_{ij} DG=xi,xj∈Gmaxdij

即类内最远两个样本的距离,反映这个类有多大。

3. 类的散布矩阵

A G = ∑ i = 1 n G ( x i − x ˉ G ) ( x i − x ˉ G ) ⊤ A_G = \sum_{i=1}^{n_G} (x_i - \bar{x}_G)(x_i - \bar{x}_G)^\top AG=i=1∑nG(xi−xˉG)(xi−xˉG)⊤

描述类内样本围绕中心的散布程度。协方差矩阵 S G = 1 n G − 1 A G S_G = \frac{1}{n_G-1} A_G SG=nG−11AG 是它的归一化形式。


四种定义的包含关系

定义 2.1 最严格,定义 2.4 最宽松。它们的关系是:

定义 2.1 ⇒ 定义 2.2 ⇒ 定义 2.3 ⇒ 定义 2.4 \text{定义 2.1} \Rightarrow \text{定义 2.2} \Rightarrow \text{定义 2.3} \Rightarrow \text{定义 2.4} 定义 2.1⇒定义 2.2⇒定义 2.3⇒定义 2.4

即满足定义 2.1 的类一定也满足后面的定义,反之不一定成立。


2.1.3 类与类之间的距离

在层次聚类等算法中,需要计算两个簇之间的距离。设 C p C_p Cp 和 C q C_q Cq 为两个簇, n p = ∣ C p ∣ n_p = |C_p| np=∣Cp∣, n q = ∣ C q ∣ n_q = |C_q| nq=∣Cq∣, d i j d_{ij} dij 为样本 x i x_i xi 与 x j x_j xj 之间的距离, μ p \mu_p μp 和 μ q \mu_q μq 分别为两个簇的质心(均值向量)。


1. 最短距离(Single Linkage)

D min ⁡ ( C p , C q ) = min ⁡ i ∈ C p , j ∈ C q d i j D_{\min}(C_p, C_q) = \min_{i \in C_p, j \in C_q} d_{ij} Dmin(Cp,Cq)=i∈Cp,j∈Cqmindij

计算方法 :遍历 C p C_p Cp 和 C q C_q Cq 中所有样本对,找到距离最小的那一对,以其距离作为簇间距离。

直观理解:两个簇之间的距离由它们"离得最近的那两个点"决定。即使两个簇整体相距很远,只要各有一个点碰在一起,就算很近。

举例 : C p C_p Cp 中的点 { 0 , 10 } \{0, 10\} {0,10}, C q C_q Cq 中的点 { 9 , 20 } \{9, 20\} {9,20}。最近的一对是 10 10 10 和 9 9 9,距离为 1 1 1,所以 D min ⁡ = 1 D_{\min}=1 Dmin=1。

特点:容易产生链状的簇,对噪声敏感(一个离群点就能把两个簇连起来)。


2. 最长距离(Complete Linkage)

D max ⁡ ( C p , C q ) = max ⁡ i ∈ C p , j ∈ C q d i j D_{\max}(C_p, C_q) = \max_{i \in C_p, j \in C_q} d_{ij} Dmax(Cp,Cq)=i∈Cp,j∈Cqmaxdij

计算方法 :遍历 C p C_p Cp 和 C q C_q Cq 中所有样本对,找到距离最大的那一对,以其距离作为簇间距离。

直观理解:两个簇之间的距离由它们"离得最远的两个点"决定。只有两个簇整体都靠近,才会被认为近。

举例 : C p C_p Cp 中的点 { 0 , 10 } \{0, 10\} {0,10}, C q C_q Cq 中的点 { 9 , 20 } \{9, 20\} {9,20}。最远的一对是 0 0 0 和 20 20 20,距离为 20 20 20,所以 D max ⁡ = 20 D_{\max}=20 Dmax=20。

特点:倾向于产生紧凑的球状簇,对噪声不敏感(离群点只影响局部,不影响最远距离)。


3. 中心距离(Centroid Linkage)

D cent ( C p , C q ) = ∥ μ p − μ q ∥ D_{\text{cent}}(C_p, C_q) = \|\mu_p - \mu_q\| Dcent(Cp,Cq)=∥μp−μq∥

其中 μ p = 1 n p ∑ i ∈ C p x i \mu_p = \frac{1}{n_p} \sum_{i \in C_p} x_i μp=np1∑i∈Cpxi, μ q = 1 n q ∑ i ∈ C q x i \mu_q = \frac{1}{n_q} \sum_{i \in C_q} x_i μq=nq1∑i∈Cqxi。

计算方法:先分别计算两个簇的质心(所有点的平均值),再计算两个质心之间的距离。

直观理解:把每个簇浓缩成一个"代表点"(质心),然后用代表点之间的距离代表两个簇的距离。

举例 : C p = { ( 0 , 0 ) , ( 2 , 0 ) } C_p = \{(0,0), (2,0)\} Cp={(0,0),(2,0)},质心为 ( 1 , 0 ) (1,0) (1,0); C q = { ( 4 , 0 ) , ( 6 , 0 ) } C_q = \{(4,0), (6,0)\} Cq={(4,0),(6,0)},质心为 ( 5 , 0 ) (5,0) (5,0); D cent = 4 D_{\text{cent}} = 4 Dcent=4。

特点 :计算速度快(只需 O ( d ) O(d) O(d) 时间),但可能出现"逆序"现象------合并后的新簇与另一个簇的距离反而比合并前更小,导致树状图出现交叉。


4. 平均距离(Average Linkage)

D avg ( C p , C q ) = 1 n p n q ∑ i ∈ C p ∑ j ∈ C q d i j D_{\text{avg}}(C_p, C_q) = \frac{1}{n_p n_q} \sum_{i \in C_p} \sum_{j \in C_q} d_{ij} Davg(Cp,Cq)=npnq1i∈Cp∑j∈Cq∑dij

计算方法 :计算 C p C_p Cp 和 C q C_q Cq 之间所有样本对的距离,然后取平均值。

直观理解:考虑两个簇中所有点对,用它们的平均距离来衡量两个簇的远近。

举例 : C p = { 0 , 10 } C_p = \{0, 10\} Cp={0,10}, C q = { 9 , 20 } C_q = \{9, 20\} Cq={9,20}。所有点对的距离: ∣ 0 − 9 ∣ = 9 |0-9|=9 ∣0−9∣=9, ∣ 0 − 20 ∣ = 20 |0-20|=20 ∣0−20∣=20, ∣ 10 − 9 ∣ = 1 |10-9|=1 ∣10−9∣=1, ∣ 10 − 20 ∣ = 10 |10-20|=10 ∣10−20∣=10,平均值为 ( 9 + 20 + 1 + 10 ) / 4 = 10 (9+20+1+10)/4 = 10 (9+20+1+10)/4=10。

特点 :最常用的方法,计算量稍大( O ( n p n q d ) O(n_p n_q d) O(npnqd)),但结果稳定,是最短距离和最长距离的折中。


2.2 层次聚类

层次聚类是一种构建聚类层次树的方法。它不需要预先指定簇的个数,结果用一个树状图表示,可以直观看到样本是如何一步步合并(或分裂)的。

层次聚类分为两种:

  • 聚合聚类(自底向上):每个样本先自成一类,然后每次把最近的两类合并。
  • 分裂聚类(自顶向下):所有样本先属于一类,然后每次把最远的两类分开。

聚合聚类更常用,下面重点介绍。


2.2.1 聚合聚类的三个要素

聚合聚类需要提前确定三件事:

  1. 距离或相似度:样本之间怎么算距离(欧氏距离、马氏距离、余弦相似度等)
  2. 合并规则:两个类之间怎么算距离(最短距离、最长距离、平均距离等)
  3. 停止条件:什么时候停止合并(类个数达到1、直径超过阈值等)

三要素不同,得到的聚类结果也不同。


2.2.2 算法流程

输入 : n n n 个样本,样本间距离矩阵 D D D(或原始数据)

输出 :树状图(层次化聚类结果)

步骤

  1. 每个样本自成一类,共 n n n 个类
  2. 找出距离最近的两个类,合并它们
  3. 更新新类与其他类之间的距离
  4. 重复 2-3,直到所有样本合并成一类(或达到停止条件)

时间复杂度 :朴素实现 O ( n 3 ) O(n^3) O(n3),用优先队列可优化到 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn)。


2.2.3 一个完整例子(单链接)

有 5 个样本,距离矩阵如下( d i j d_{ij} dij 表示第 i i i 个与第 j j j 个样本的欧氏距离):

D = 0 7 2 9 3 7 0 5 4 6 2 5 0 8 1 9 4 8 0 5 3 6 1 5 0 D = \begin{bmatrix} 0 & 7 & 2 & 9 & 3 \\ 7 & 0 & 5 & 4 & 6 \\ 2 & 5 & 0 & 8 & 1 \\ 9 & 4 & 8 & 0 & 5 \\ 3 & 6 & 1 & 5 & 0 \end{bmatrix} D= 0729370546250819480536150

矩阵的读法:第 i i i 行第 j j j 列的值 d i j d_{ij} dij 就是 x i x_i xi 与 x j x_j xj 的距离。例如 d 13 = 2 d_{13}=2 d13=2 表示 x 1 x_1 x1 与 x 3 x_3 x3 的距离为 2, d 35 = 1 d_{35}=1 d35=1 表示 x 3 x_3 x3 与 x 5 x_5 x5 的距离为 1。

最短距离(单链接)做聚合聚类。

最短距离的定义:两个类 A A A 和 B B B 的距离等于它们笛卡尔积 A × B A \times B A×B 中所有点对距离的最小值。


第 1 步:初始状态

5 个类: G 1 = { x 1 } , G 2 = { x 2 } , G 3 = { x 3 } , G 4 = { x 4 } , G 5 = { x 5 } G_1=\{x_1\}, G_2=\{x_2\}, G_3=\{x_3\}, G_4=\{x_4\}, G_5=\{x_5\} G1={x1},G2={x2},G3={x3},G4={x4},G5={x5}

类间距离矩阵就是原距离矩阵:

G 1 G 2 G 3 G 4 G 5 G 1 0 7 2 9 3 G 2 7 0 5 4 6 G 3 2 5 0 8 1 G 4 9 4 8 0 5 G 5 3 6 1 5 0 \begin{array}{c|ccccc} & G_1 & G_2 & G_3 & G_4 & G_5 \\ \hline G_1 & 0 & 7 & 2 & 9 & 3 \\ G_2 & 7 & 0 & 5 & 4 & 6 \\ G_3 & 2 & 5 & 0 & 8 & 1 \\ G_4 & 9 & 4 & 8 & 0 & 5 \\ G_5 & 3 & 6 & 1 & 5 & 0 \end{array} G1G2G3G4G5G107293G270546G325081G494805G536150

找最小距离: min ⁡ D = 1 \min D = 1 minD=1,位于 G 3 G_3 G3 与 G 5 G_5 G5。

合并 G 3 G_3 G3 和 G 5 G_5 G5 为新类 G 6 = { x 3 , x 5 } G_6 = \{x_3, x_5\} G6={x3,x5}。


第 2 步:更新距离矩阵

计算 G 6 G_6 G6 与其他类的距离。两个类的距离 = 它们笛卡尔积中所有点对距离的最小值。

  • G 6 G_6 G6 与 G 1 G_1 G1 的笛卡尔积: G 6 × G 1 = { ( x 3 , x 1 ) , ( x 5 , x 1 ) } G_6 \times G_1 = \{(x_3, x_1), (x_5, x_1)\} G6×G1={(x3,x1),(x5,x1)}

    D ( G 6 , G 1 ) = min ⁡ ( d 31 , d 51 ) = min ⁡ ( 2 , 3 ) = 2 D(G_6, G_1) = \min(d_{31}, d_{51}) = \min(2, 3) = 2 D(G6,G1)=min(d31,d51)=min(2,3)=2

  • G 6 G_6 G6 与 G 2 G_2 G2 的笛卡尔积: G 6 × G 2 = { ( x 3 , x 2 ) , ( x 5 , x 2 ) } G_6 \times G_2 = \{(x_3, x_2), (x_5, x_2)\} G6×G2={(x3,x2),(x5,x2)}

    D ( G 6 , G 2 ) = min ⁡ ( d 32 , d 52 ) = min ⁡ ( 5 , 6 ) = 5 D(G_6, G_2) = \min(d_{32}, d_{52}) = \min(5, 6) = 5 D(G6,G2)=min(d32,d52)=min(5,6)=5

  • G 6 G_6 G6 与 G 4 G_4 G4 的笛卡尔积: G 6 × G 4 = { ( x 3 , x 4 ) , ( x 5 , x 4 ) } G_6 \times G_4 = \{(x_3, x_4), (x_5, x_4)\} G6×G4={(x3,x4),(x5,x4)}

    D ( G 6 , G 4 ) = min ⁡ ( d 34 , d 54 ) = min ⁡ ( 8 , 5 ) = 5 D(G_6, G_4) = \min(d_{34}, d_{54}) = \min(8, 5) = 5 D(G6,G4)=min(d34,d54)=min(8,5)=5

其他距离不变: D ( G 1 , G 2 ) = 7 D(G_1, G_2)=7 D(G1,G2)=7, D ( G 1 , G 4 ) = 9 D(G_1, G_4)=9 D(G1,G4)=9, D ( G 2 , G 4 ) = 4 D(G_2, G_4)=4 D(G2,G4)=4。

更新后的距离矩阵(顺序: G 1 , G 2 , G 4 , G 6 G_1, G_2, G_4, G_6 G1,G2,G4,G6):

G 1 G 2 G 4 G 6 G 1 0 7 9 2 G 2 7 0 4 5 G 4 9 4 0 5 G 6 2 5 5 0 \begin{array}{c|cccc} & G_1 & G_2 & G_4 & G_6 \\ \hline G_1 & 0 & 7 & 9 & 2 \\ G_2 & 7 & 0 & 4 & 5 \\ G_4 & 9 & 4 & 0 & 5 \\ G_6 & 2 & 5 & 5 & 0 \end{array} G1G2G4G6G10792G27045G49405G62550

找最小距离: min ⁡ = 2 \min = 2 min=2,位于 G 1 G_1 G1 与 G 6 G_6 G6。

合并 G 1 G_1 G1 和 G 6 G_6 G6 为新类 G 7 = { x 1 , x 3 , x 5 } G_7 = \{x_1, x_3, x_5\} G7={x1,x3,x5}。


第 3 步:再次更新

计算 G 7 G_7 G7 与其他类的距离。

  • G 7 G_7 G7 与 G 2 G_2 G2 的笛卡尔积: G 7 × G 2 = { ( x 1 , x 2 ) , ( x 3 , x 2 ) , ( x 5 , x 2 ) } G_7 \times G_2 = \{(x_1, x_2), (x_3, x_2), (x_5, x_2)\} G7×G2={(x1,x2),(x3,x2),(x5,x2)}

    D ( G 7 , G 2 ) = min ⁡ ( d 12 , d 32 , d 52 ) = min ⁡ ( 7 , 5 , 6 ) = 5 D(G_7, G_2) = \min(d_{12}, d_{32}, d_{52}) = \min(7, 5, 6) = 5 D(G7,G2)=min(d12,d32,d52)=min(7,5,6)=5

  • G 7 G_7 G7 与 G 4 G_4 G4 的笛卡尔积: G 7 × G 4 = { ( x 1 , x 4 ) , ( x 3 , x 4 ) , ( x 5 , x 4 ) } G_7 \times G_4 = \{(x_1, x_4), (x_3, x_4), (x_5, x_4)\} G7×G4={(x1,x4),(x3,x4),(x5,x4)}

    D ( G 7 , G 4 ) = min ⁡ ( d 14 , d 34 , d 54 ) = min ⁡ ( 9 , 8 , 5 ) = 5 D(G_7, G_4) = \min(d_{14}, d_{34}, d_{54}) = \min(9, 8, 5) = 5 D(G7,G4)=min(d14,d34,d54)=min(9,8,5)=5

D ( G 2 , G 4 ) = 4 D(G_2, G_4)=4 D(G2,G4)=4 不变。

更新后的距离矩阵(顺序: G 2 , G 4 , G 7 G_2, G_4, G_7 G2,G4,G7):

G 2 G 4 G 7 G 2 0 4 5 G 4 4 0 5 G 7 5 5 0 \begin{array}{c|ccc} & G_2 & G_4 & G_7 \\ \hline G_2 & 0 & 4 & 5 \\ G_4 & 4 & 0 & 5 \\ G_7 & 5 & 5 & 0 \end{array} G2G4G7G2045G4405G7550

找最小距离: min ⁡ = 4 \min = 4 min=4,位于 G 2 G_2 G2 与 G 4 G_4 G4。

合并 G 2 G_2 G2 和 G 4 G_4 G4 为新类 G 8 = { x 2 , x 4 } G_8 = \{x_2, x_4\} G8={x2,x4}。


第 4 步:最后合并

计算 G 7 G_7 G7 与 G 8 G_8 G8 的距离。

G 7 G_7 G7 与 G 8 G_8 G8 的笛卡尔积: G 7 × G 8 = { ( x 1 , x 2 ) , ( x 1 , x 4 ) , ( x 3 , x 2 ) , ( x 3 , x 4 ) , ( x 5 , x 2 ) , ( x 5 , x 4 ) } G_7 \times G_8 = \{(x_1, x_2), (x_1, x_4), (x_3, x_2), (x_3, x_4), (x_5, x_2), (x_5, x_4)\} G7×G8={(x1,x2),(x1,x4),(x3,x2),(x3,x4),(x5,x2),(x5,x4)},共 3 × 2 = 6 3 \times 2 = 6 3×2=6 个点对。

点对 距离
( x 1 , x 2 ) (x_1, x_2) (x1,x2) 7
( x 1 , x 4 ) (x_1, x_4) (x1,x4) 9
( x 3 , x 2 ) (x_3, x_2) (x3,x2) 5
( x 3 , x 4 ) (x_3, x_4) (x3,x4) 8
( x 5 , x 2 ) (x_5, x_2) (x5,x2) 6
( x 5 , x 4 ) (x_5, x_4) (x5,x4) 5

D ( G 7 , G 8 ) = min ⁡ ( 7 , 9 , 5 , 8 , 6 , 5 ) = 5 D(G_7, G_8) = \min(7, 9, 5, 8, 6, 5) = 5 D(G7,G8)=min(7,9,5,8,6,5)=5

合并 G 7 G_7 G7 和 G 8 G_8 G8 为 G 9 = { x 1 , x 2 , x 3 , x 4 , x 5 } G_9 = \{x_1, x_2, x_3, x_4, x_5\} G9={x1,x2,x3,x4,x5},结束。


合并过程汇总

步骤 合并的类 距离 新类 包含的样本
1 G 3 G_3 G3 与 G 5 G_5 G5 1 G 6 G_6 G6 { x 3 , x 5 } \{x_3, x_5\} {x3,x5}
2 G 1 G_1 G1 与 G 6 G_6 G6 2 G 7 G_7 G7 { x 1 , x 3 , x 5 } \{x_1, x_3, x_5\} {x1,x3,x5}
3 G 2 G_2 G2 与 G 4 G_4 G4 4 G 8 G_8 G8 { x 2 , x 4 } \{x_2, x_4\} {x2,x4}
4 G 7 G_7 G7 与 G 8 G_8 G8 5 G 9 G_9 G9 { x 1 , x 2 , x 3 , x 4 , x 5 } \{x_1, x_2, x_3, x_4, x_5\} {x1,x2,x3,x4,x5}

关键点

  1. 笛卡尔积 :两个类 A A A 和 B B B 的所有点对 = A × B = { ( a , b ) ∣ a ∈ A , b ∈ B } A \times B = \{(a, b) \mid a \in A, b \in B\} A×B={(a,b)∣a∈A,b∈B},共 ∣ A ∣ × ∣ B ∣ |A| \times |B| ∣A∣×∣B∣ 个
  2. 最短距离 = 笛卡尔积中所有点对距离的最小值
  3. 每次合并最小的:每一步都找当前距离矩阵中的最小值
  4. 矩阵不断缩小:每合并一次,类数减 1

2.3 K均值聚类

K均值聚类(K-Means Clustering)是一种基于中心的聚类算法。它将样本划分为 K K K 个簇,每个簇由其质心(均值)代表,样本被分配到离它最近的质心所在的簇。


2.3.1 算法思想

K均值聚类的目标:将 n n n 个样本划分到 K K K 个簇中,使得每个样本到其所属簇质心的距离平方和最小。

用数学语言表达:给定样本集 { x 1 , x 2 , ... , x n } \{x_1, x_2, \dots, x_n\} {x1,x2,...,xn},将其划分为 K K K 个簇 C 1 , C 2 , ... , C K C_1, C_2, \dots, C_K C1,C2,...,CK,最小化如下目标函数:

J = ∑ k = 1 K ∑ x ∈ C k ∥ x − μ k ∥ 2 J = \sum_{k=1}^{K} \sum_{x \in C_k} \|x - \mu_k\|^2 J=k=1∑Kx∈Ck∑∥x−μk∥2

其中 μ k = 1 ∣ C k ∣ ∑ x ∈ C k x \mu_k = \frac{1}{|C_k|} \sum_{x \in C_k} x μk=∣Ck∣1∑x∈Ckx, 是簇 C k C_k Ck 的质心(均值向量)。

这个目标函数称为簇内离差平方和 ,它衡量了簇内样本的紧密程度。 J J J 越小,说明簇内样本越紧凑。


2.3.2 算法步骤

K均值聚类通过迭代优化来求解,具体步骤如下:

输入 :样本集 D = { x 1 , x 2 , ... , x n } D = \{x_1, x_2, \dots, x_n\} D={x1,x2,...,xn},簇的个数 K K K

输出 : K K K 个簇的划分

步骤

  1. 初始化 :随机选择 K K K 个样本作为初始质心 μ 1 , μ 2 , ... , μ K \mu_1, \mu_2, \dots, \mu_K μ1,μ2,...,μK

  2. 分配 :将每个样本分配到离它最近的质心所在的簇。即计算每个样本到所有质心的距离,选择距离最小的质心:

    C k = { x ∣ ∥ x − μ k ∥ 2 ≤ ∥ x − μ j ∥ 2 , ∀ j ≠ k } C_k = \{x \mid \|x - \mu_k\|^2 \le \|x - \mu_j\|^2, \ \forall j \neq k\} Ck={x∣∥x−μk∥2≤∥x−μj∥2, ∀j=k}

  3. 更新 :重新计算每个簇的质心(簇内所有样本的均值):

    μ k = 1 ∣ C k ∣ ∑ x ∈ C k x \mu_k = \frac{1}{|C_k|} \sum_{x \in C_k} x μk=∣Ck∣1x∈Ck∑x

  4. 重复:重复步骤 2 和 3,直到质心不再变化(或变化小于某个阈值)

打个比方:有一堆点,你先随便插 k k k 个旗子,每个点去最近的旗子那里集合;然后每堆点重新找重心,把旗子插到重心上;再重新集合......直到旗子不动了。


2.3.3 一个具体例子(二维数据)

问题 :有 5 个二维样本,想分成 k = 2 k=2 k=2 个簇。

x 1 = ( 0 , 2 ) , x 2 = ( 0 , 0 ) , x 3 = ( 1 , 0 ) , x 4 = ( 5 , 0 ) , x 5 = ( 5 , 2 ) x_1 = (0, 2),\quad x_2 = (0, 0),\quad x_3 = (1, 0),\quad x_4 = (5, 0),\quad x_5 = (5, 2) x1=(0,2),x2=(0,0),x3=(1,0),x4=(5,0),x5=(5,2)

第 1 步:初始化

随便选两个中心,比如 m 1 = x 1 = ( 0 , 2 ) m_1 = x_1 = (0,2) m1=x1=(0,2), m 2 = x 2 = ( 0 , 0 ) m_2 = x_2 = (0,0) m2=x2=(0,0)。

第 2 步:第一次分配

计算每个样本到两个中心的距离平方(欧氏距离平方):

  • x 1 = ( 0 , 2 ) x_1=(0,2) x1=(0,2):到 m 1 = 0 m_1=0 m1=0,到 m 2 = 4 m_2=4 m2=4 → 归 G 1 G_1 G1
  • x 2 = ( 0 , 0 ) x_2=(0,0) x2=(0,0):到 m 1 = 4 m_1=4 m1=4,到 m 2 = 0 m_2=0 m2=0 → 归 G 2 G_2 G2
  • x 3 = ( 1 , 0 ) x_3=(1,0) x3=(1,0):到 m 1 = 5 m_1=5 m1=5,到 m 2 = 1 m_2=1 m2=1 → 归 G 2 G_2 G2
  • x 4 = ( 5 , 0 ) x_4=(5,0) x4=(5,0):到 m 1 = 29 m_1=29 m1=29,到 m 2 = 25 m_2=25 m2=25 → 归 G 2 G_2 G2
  • x 5 = ( 5 , 2 ) x_5=(5,2) x5=(5,2):到 m 1 = 25 m_1=25 m1=25,到 m 2 = 29 m_2=29 m2=29 → 归 G 1 G_1 G1

结果:

  • G 1 = { x 1 , x 5 } G_1 = \{x_1, x_5\} G1={x1,x5}
  • G 2 = { x 2 , x 3 , x 4 } G_2 = \{x_2, x_3, x_4\} G2={x2,x3,x4}

第 3 步:更新中心

m 1 = x 1 + x 5 2 = ( 0 + 5 2 , 2 + 2 2 ) = ( 2.5 , 2 ) m_1 = \frac{x_1 + x_5}{2} = \left(\frac{0+5}{2}, \frac{2+2}{2}\right) = (2.5, 2) m1=2x1+x5=(20+5,22+2)=(2.5,2)

m 2 = x 2 + x 3 + x 4 3 = ( 0 + 1 + 5 3 , 0 + 0 + 0 3 ) ≈ ( 2 , 0 ) m_2 = \frac{x_2 + x_3 + x_4}{3} = \left(\frac{0+1+5}{3}, \frac{0+0+0}{3}\right) \approx (2, 0) m2=3x2+x3+x4=(30+1+5,30+0+0)≈(2,0)

第 4 步:第二次分配(用新中心)

中心变了,重新算谁离哪个中心近。过程略,结果和上一轮完全一样: G 1 = { x 1 , x 5 } G_1 = \{x_1, x_5\} G1={x1,x5}, G 2 = { x 2 , x 3 , x 4 } G_2 = \{x_2, x_3, x_4\} G2={x2,x3,x4}。

因为分配结果没变,中心也不会再变,算法结束

最终两个簇:

  • G 1 = { ( 0 , 2 ) , ( 5 , 2 ) } G_1 = \{(0,2), (5,2)\} G1={(0,2),(5,2)}
  • G 2 = { ( 0 , 0 ) , ( 1 , 0 ) , ( 5 , 0 ) } G_2 = \{(0,0), (1,0), (5,0)\} G2={(0,0),(1,0),(5,0)}

2.3.4 如何选择 K K K?------ 肘部法则

在实际使用 K 均值聚类时,最让人头疼的问题之一就是:K K K 到底取多少

K K K 太小,会把不同的类别强行捏在一起; K K K 太大,又会把同一个类别拆得七零八落。

肘部法则 是一种简单实用的启发式方法,帮助我们找到一个相对合理的 K K K。


为什么要看"肘部"?

回顾 K 均值的目标函数:

SSE ⁡ ( K ) = ∑ k = 1 K ∑ x ∈ C k ∥ x − μ k ∥ 2 \operatorname{SSE}(K) = \sum_{k=1}^{K} \sum_{x \in C_k} \|x - \mu_k\|^2 SSE(K)=k=1∑Kx∈Ck∑∥x−μk∥2

当 K K K 增加时,每个簇会变得更紧凑, SSE ⁡ ( K ) \operatorname{SSE}(K) SSE(K) 通常会下降

但下降的幅度会随着 K K K 增大而逐渐变小------一开始增加一个簇能大幅降低 SSE,后面再增加簇收益就很小了。

如果我们画出 SSE ⁡ ( K ) \operatorname{SSE}(K) SSE(K) 随 K K K 变化的曲线,这条曲线通常会有一个拐点 ,形状像人的手肘。这个拐点对应的 K K K 就是一个比较理想的选择。

直观理解:

  • 当 K K K 小于"真实"簇数时,增加一个簇可以分开两个原本混在一起的簇,SSE 下降非常多。
  • 当 K K K 达到或超过"真实"簇数后,再增加簇只是把已经很紧凑的簇再切得更细,SSE 下降很少。
    拐点就是陡降变平缓的那个转折处。

数学上的解释

单调性与边际收益

首先, SSE ⁡ ( K ) \operatorname{SSE}(K) SSE(K) 是 单调不增 的:

SSE ⁡ ( K + 1 ) ≤ SSE ⁡ ( K ) , ∀ K \operatorname{SSE}(K+1) \le \operatorname{SSE}(K), \quad \forall K SSE(K+1)≤SSE(K),∀K

定义 边际下降量

Δ ( K ) = SSE ⁡ ( K − 1 ) − SSE ⁡ ( K ) ( K ≥ 2 ) \Delta(K) = \operatorname{SSE}(K-1) - \operatorname{SSE}(K) \quad (K\ge 2) Δ(K)=SSE(K−1)−SSE(K)(K≥2)

Δ ( K ) \Delta(K) Δ(K) 表示从 K − 1 K-1 K−1 个簇增加到 K K K 个簇时,SSE 减少了多少。

肘部法则要找的就是 Δ ( K ) \Delta(K) Δ(K) 从大变小 的那个 K K K。


假设我们有一个簇 C C C,包含 m m m 个点,质心为 μ \mu μ,簇内离差平方和为

S ( C ) = ∑ x ∈ C ∥ x − μ ∥ 2 . S(C) = \sum_{x\in C}\|x-\mu\|^2. S(C)=x∈C∑∥x−μ∥2.

若将 C C C 分裂为两个子簇 C 1 C_1 C1 和 C 2 C_2 C2(大小分别为 m 1 , m 2 m_1,m_2 m1,m2,质心分别为 μ 1 , μ 2 \mu_1,\mu_2 μ1,μ2,且 m 1 + m 2 = m m_1+m_2=m m1+m2=m),则分裂后的 SSE 减少量有一个精确的闭式表达式。


1. 将 S ( C ) S(C) S(C) 按子簇展开

对于 C 1 C_1 C1 中的任意点 x x x,有

∥ x − μ ∥ 2 = ∥ x − μ 1 + μ 1 − μ ∥ 2 = ∥ x − μ 1 ∥ 2 + ∥ μ 1 − μ ∥ 2 + 2 ( x − μ 1 ) ⋅ ( μ 1 − μ ) . \|x-\mu\|^2 = \|x-\mu_1 + \mu_1 - \mu\|^2 = \|x-\mu_1\|^2 + \|\mu_1-\mu\|^2 + 2(x-\mu_1)\cdot(\mu_1-\mu). ∥x−μ∥2=∥x−μ1+μ1−μ∥2=∥x−μ1∥2+∥μ1−μ∥2+2(x−μ1)⋅(μ1−μ).

对 x ∈ C 1 x\in C_1 x∈C1 求和,得到

∑ x ∈ C 1 ∥ x − μ ∥ 2 = ∑ x ∈ C 1 ∥ x − μ 1 ∥ 2 ⏟ S ( C 1 ) + m 1 ∥ μ 1 − μ ∥ 2 + 2 ( ∑ x ∈ C 1 ( x − μ 1 ) ) T ( μ 1 − μ ) . \sum_{x\in C_1}\|x-\mu\|^2 = \underbrace{\sum_{x\in C_1}\|x-\mu_1\|^2}{S(C_1)} + m_1\|\mu_1-\mu\|^2 + 2\Bigl(\sum{x\in C_1}(x-\mu_1)\Bigr)^T(\mu_1-\mu). x∈C1∑∥x−μ∥2=S(C1) x∈C1∑∥x−μ1∥2+m1∥μ1−μ∥2+2(x∈C1∑(x−μ1))T(μ1−μ).

由于所有偏差向量加起来等于零向量:

∑ x ∈ C 1 ( x − μ 1 ) = 0. \sum_{x\in C_1}(x-\mu_1)=0. x∈C1∑(x−μ1)=0.

交叉项消失,因此

∑ x ∈ C 1 ∥ x − μ ∥ 2 = S ( C 1 ) + m 1 ∥ μ 1 − μ ∥ 2 . (1) \sum_{x\in C_1}\|x-\mu\|^2 = S(C_1) + m_1\|\mu_1-\mu\|^2. \tag{1} x∈C1∑∥x−μ∥2=S(C1)+m1∥μ1−μ∥2.(1)

同理,对 C 2 C_2 C2 有

∑ x ∈ C 2 ∥ x − μ ∥ 2 = S ( C 2 ) + m 2 ∥ μ 2 − μ ∥ 2 . (2) \sum_{x\in C_2}\|x-\mu\|^2 = S(C_2) + m_2\|\mu_2-\mu\|^2. \tag{2} x∈C2∑∥x−μ∥2=S(C2)+m2∥μ2−μ∥2.(2)

将 (1)(2) 相加,注意 S ( C ) S(C) S(C) 就是这两部分之和,得

S ( C ) = S ( C 1 ) + S ( C 2 ) + m 1 ∥ μ 1 − μ ∥ 2 + m 2 ∥ μ 2 − μ ∥ 2 . S(C) = S(C_1) + S(C_2) + m_1\|\mu_1-\mu\|^2 + m_2\|\mu_2-\mu\|^2. S(C)=S(C1)+S(C2)+m1∥μ1−μ∥2+m2∥μ2−μ∥2.

于是 SSE 的减少量为

Δ = S ( C ) − ( S ( C 1 ) + S ( C 2 ) ) = m 1 ∥ μ 1 − μ ∥ 2 + m 2 ∥ μ 2 − μ ∥ 2 . (3) \Delta = S(C) - \bigl(S(C_1)+S(C_2)\bigr) = m_1\|\mu_1-\mu\|^2 + m_2\|\mu_2-\mu\|^2. \tag{3} Δ=S(C)−(S(C1)+S(C2))=m1∥μ1−μ∥2+m2∥μ2−μ∥2.(3)


2. 用 μ 1 , μ 2 \mu_1,\mu_2 μ1,μ2 表示 μ \mu μ 以及两个距离

整体质心为

μ = m 1 μ 1 + m 2 μ 2 m . \mu = \frac{m_1\mu_1 + m_2\mu_2}{m}. μ=mm1μ1+m2μ2.

计算 μ 1 − μ \mu_1-\mu μ1−μ:

μ 1 − μ = μ 1 − m 1 μ 1 + m 2 μ 2 m = m μ 1 − m 1 μ 1 − m 2 μ 2 m = m 2 ( μ 1 − μ 2 ) m . \mu_1-\mu = \mu_1 - \frac{m_1\mu_1 + m_2\mu_2}{m} = \frac{m\mu_1 - m_1\mu_1 - m_2\mu_2}{m} = \frac{m_2(\mu_1-\mu_2)}{m}. μ1−μ=μ1−mm1μ1+m2μ2=mmμ1−m1μ1−m2μ2=mm2(μ1−μ2).

同理

μ 2 − μ = μ 2 − m 1 μ 1 + m 2 μ 2 m = m μ 2 − m 1 μ 1 − m 2 μ 2 m = − m 1 ( μ 1 − μ 2 ) m = m 1 ( μ 2 − μ 1 ) m . \mu_2-\mu = \mu_2 - \frac{m_1\mu_1 + m_2\mu_2}{m} = \frac{m\mu_2 - m_1\mu_1 - m_2\mu_2}{m} = \frac{-m_1(\mu_1-\mu_2)}{m} = \frac{m_1(\mu_2-\mu_1)}{m}. μ2−μ=μ2−mm1μ1+m2μ2=mmμ2−m1μ1−m2μ2=m−m1(μ1−μ2)=mm1(μ2−μ1).

取范数平方:

∥ μ 1 − μ ∥ 2 = m 2 2 m 2   ∥ μ 1 − μ 2 ∥ 2 , ∥ μ 2 − μ ∥ 2 = m 1 2 m 2   ∥ μ 1 − μ 2 ∥ 2 . \|\mu_1-\mu\|^2 = \frac{m_2^2}{m^2}\,\|\mu_1-\mu_2\|^2, \qquad \|\mu_2-\mu\|^2 = \frac{m_1^2}{m^2}\,\|\mu_1-\mu_2\|^2. ∥μ1−μ∥2=m2m22∥μ1−μ2∥2,∥μ2−μ∥2=m2m12∥μ1−μ2∥2.


3. 代入 (3) 化简

Δ = m 1 ⋅ m 2 2 m 2 ∥ μ 1 − μ 2 ∥ 2    +    m 2 ⋅ m 1 2 m 2 ∥ μ 1 − μ 2 ∥ 2 = m 1 m 2 2 + m 2 m 1 2 m 2   ∥ μ 1 − μ 2 ∥ 2 = m 1 m 2 ( m 1 + m 2 ) m 2   ∥ μ 1 − μ 2 ∥ 2 = m 1 m 2 m   ∥ μ 1 − μ 2 ∥ 2 . \begin{aligned} \Delta &= m_1\cdot\frac{m_2^2}{m^2}\|\mu_1-\mu_2\|^2 \;+\; m_2\cdot\frac{m_1^2}{m^2}\|\mu_1-\mu_2\|^2 \\4pt &= \frac{m_1m_2^2 + m_2m_1^2}{m^2}\,\|\mu_1-\mu_2\|^2 \\4pt &= \frac{m_1m_2(m_1+m_2)}{m^2}\,\|\mu_1-\mu_2\|^2 \\4pt &= \frac{m_1m_2}{m}\,\|\mu_1-\mu_2\|^2. \end{aligned} Δ=m1⋅m2m22∥μ1−μ2∥2+m2⋅m2m12∥μ1−μ2∥2=m2m1m22+m2m12∥μ1−μ2∥2=m2m1m2(m1+m2)∥μ1−μ2∥2=mm1m2∥μ1−μ2∥2.

因此最终公式为

S ( C ) − ( S ( C 1 ) + S ( C 2 ) ) = m 1 m 2 m   ∥ μ 1 − μ 2 ∥ 2 . S(C) - \bigl(S(C_1)+S(C_2)\bigr) = \frac{m_1 m_2}{m}\,\|\mu_1 - \mu_2\|^2. S(C)−(S(C1)+S(C2))=mm1m2∥μ1−μ2∥2.


4. 三条直接推论

  • 正比于质心距离平方 :分裂收益与 ∥ μ 1 − μ 2 ∥ 2 \|\mu_1-\mu_2\|^2 ∥μ1−μ2∥2 成正比,两子簇分离越远,SSE 下降越多。
  • 正比于子簇大小的乘积 : m 1 m 2 m_1m_2 m1m2 在 m m m 固定时,当 m 1 = m 2 = m / 2 m_1=m_2=m/2 m1=m2=m/2 时取最大值,即平衡分裂收益最大。
  • 紧凑簇的分裂无意义 :若 C C C 已经非常紧凑,任何分裂得到的 μ 1 , μ 2 \mu_1,\mu_2 μ1,μ2 都会非常接近, ∥ μ 1 − μ 2 ∥ 2 ≈ 0 \|\mu_1-\mu_2\|^2\approx 0 ∥μ1−μ2∥2≈0,收益趋近于零。这为层次聚类中的停止准则提供了理论依据。

为什么会出现"肘部"?

假设数据中真实存在 K ∗ K^* K∗ 个比较分开的簇。

  • 当 K < K ∗ K < K^* K<K∗ 时,至少有一个簇实际包含了两个不同的自然簇,它们的质心距离很大。此时增加 K K K 能分开它们, Δ ( K ) \Delta(K) Δ(K) 会很大。
  • 当 K ≥ K ∗ K \ge K^* K≥K∗ 时,每个簇已经基本对应一个自然簇。再增加 K K K,只能在已有的紧凑簇内部做微小的分割, ∥ μ 1 − μ 2 ∥ 2 \|\mu_1-\mu_2\|^2 ∥μ1−μ2∥2 很小,所以 Δ ( K ) \Delta(K) Δ(K) 迅速变小。

因此,在 K = K ∗ K = K^* K=K∗ 附近, Δ ( K ) \Delta(K) Δ(K) 会发生一个突变 ------从很大的值变成很小的值。在 SSE ⁡ ( K ) \operatorname{SSE}(K) SSE(K) 曲线上,这个突变点看起来就是一个"肘部"。


之前例子中的肘部

前面 2.3.3 的例子中,5 个点: ( 0 , 2 ) ,    ( 0 , 0 ) ,    ( 1 , 0 ) ,    ( 5 , 0 ) ,    ( 5 , 2 ) (0,2),\;(0,0),\;(1,0),\;(5,0),\;(5,2) (0,2),(0,0),(1,0),(5,0),(5,2)。

重新计算不同 K K K 下的 最优 SSE:

  • K = 1 K=1 K=1:所有点一个簇,SSE ≈ 32.2 \approx 32.2 ≈32.2
  • K = 2 K=2 K=2:最优划分是 { ( 0 , 2 ) , ( 0 , 0 ) , ( 1 , 0 ) } \{(0,2),(0,0),(1,0)\} {(0,2),(0,0),(1,0)} 与 { ( 5 , 0 ) , ( 5 , 2 ) } \{(5,0),(5,2)\} {(5,0),(5,2)},SSE ≈ 5.33 \approx 5.33 ≈5.33
  • K = 3 K=3 K=3:例如 { ( 0 , 2 ) } , { ( 5 , 2 ) } , { ( 0 , 0 ) , ( 1 , 0 ) } \{(0,2)\},\{(5,2)\},\{(0,0),(1,0)\} {(0,2)},{(5,2)},{(0,0),(1,0)} 与 ( 5 , 0 ) (5,0) (5,0) 分开,SSE = 0.5 = 0.5 =0.5
  • K = 4 K=4 K=4:仍然需要有一对点共享一个簇,最优 SSE = 0.5 = 0.5 =0.5
  • K = 5 K=5 K=5:每点自成一簇,SSE = 0 = 0 =0

计算边际下降:

Δ ( 2 ) = 32.2 − 5.33 = 26.87 ( 很大 ) Δ ( 3 ) = 5.33 − 0.5 = 4.83 ( 明显变小 ) Δ ( 4 ) = 0.5 − 0.5 = 0 Δ ( 5 ) = 0.5 − 0 = 0.5 \begin{aligned} \Delta(2) &= 32.2 - 5.33 = 26.87 \quad (\text{很大})\\ \Delta(3) &= 5.33 - 0.5 = 4.83 \quad (\text{明显变小})\\ \Delta(4) &= 0.5 - 0.5 = 0\\ \Delta(5) &= 0.5 - 0 = 0.5 \end{aligned} Δ(2)Δ(3)Δ(4)Δ(5)=32.2−5.33=26.87(很大)=5.33−0.5=4.83(明显变小)=0.5−0.5=0=0.5−0=0.5

Δ ( K ) \Delta(K) Δ(K) 从 26.87 骤降到 4.83,再降到 0。拐点出现在 K = 2 K=2 K=2

所以肘部法则会建议选择 K = 2 K=2 K=2,这和数据的直观分布一致。

注意 :我们最初在 2.3.3 中用 ( 0 , 2 ) (0,2) (0,2) 和 ( 0 , 0 ) (0,0) (0,0) 做初始中心得到了一个很差的 SSE=26.5,这提醒我们:肘部法则要基于多次随机初始化后得到的最优 SSE,否则可能被局部最优误导。


如何实际操作肘部法则?

  1. 选定一个 K K K 的取值范围,比如 K = 1 , 2 , ... , K max K = 1, 2, \dots, K_{\text{max}} K=1,2,...,Kmax。
  2. 对每个 K K K,运行 K 均值算法多次,记录最小的 SSE。
  3. 画出 K K K 与 SSE ⁡ ( K ) \operatorname{SSE}(K) SSE(K) 的折线图。
  4. 观察曲线,找一个像手肘一样的拐点 :曲线从急速下降变为平缓下降的那个 K K K。

如果拐点不明显,可以辅助其他方法,如轮廓系数Gap 统计量

肘部法则的局限性

  • 拐点有时很模糊:数据没有清晰的簇结构时,曲线可能没有明显肘部。
  • 依赖多次初始化:单次运行可能得到次优划分,导致 SSE 曲线不准确。
  • 计算成本 :对每个 K K K 都要跑多遍 K 均值,数据量大时可能较慢。
  • 不是严格的统计检验:它只是一种启发式规则。

尽管如此,肘部法则因为简单直观,仍然是实践中选择 K K K 最常用的方法之一。

小结

  • 肘部法则基于 SSE ⁡ ( K ) \operatorname{SSE}(K) SSE(K) 的边际收益递减原理。
  • 将一簇分裂为两簇时,SSE 的下降量 = m 1 m 2 m ∥ μ 1 − μ 2 ∥ 2 \frac{m_1 m_2}{m}\|\mu_1-\mu_2\|^2 mm1m2∥μ1−μ2∥2。
  • 当 K K K 超过真实簇数后, ∥ μ 1 − μ 2 ∥ 2 \|\mu_1-\mu_2\|^2 ∥μ1−μ2∥2 变得很小,导致边际下降骤减。
  • 肘部就是曲线从"陡降"变为"平缓"的拐点,对应 Δ ( K ) \Delta(K) Δ(K) 发生量级变化的位置。

理解了这个数学原理,你就能更自信地使用肘部法则,也知道什么时候它可能失效------当你看到 SSE 曲线平滑得像滑梯一样时,就需要换别的方法了。


2.3.5 初始中心的选择与 K‑Means++

K 均值算法对初始质心的选择非常敏感。坏的初始化可能导致算法收敛到很差的局部最优解。K‑Means++ 是一种具有理论保证的初始化策略,它通过非均匀概率采样使初始质心分散,从而显著提升聚类质量。

为什么随机初始化可能很差?

考虑一种极端情况:数据包含两个相距很远的簇,每个簇内有大量点。如果随机选的两个初始质心恰好落在同一个簇内,那么另一个簇一开始就没有中心,算法收敛后很可能把两个簇的点错误地合并或切分,导致 SSE 远大于最优值。理论上,这种坏初始化的概率可以不为零,且当数据维度高或簇数多时,多次随机初始化也未必能保证找到好的初始点。


K‑Means++ 的核心思想

设数据集 D = { x 1 , ... , x n } D = \{x_1, \dots, x_n\} D={x1,...,xn}。第一个中心 c 1 c_1 c1 从 D D D 中均匀随机选取:

P ( c 1 = x i ) = 1 n , i = 1 , ... , n . P(c_1 = x_i) = \frac{1}{n}, \quad i = 1,\dots,n. P(c1=xi)=n1,i=1,...,n.

假设已选出 j − 1 j-1 j−1 个中心 c 1 , ... , c j − 1 c_1,\dots,c_{j-1} c1,...,cj−1。对于任意点 x ∈ D x \in D x∈D,定义它到已有中心的最短距离:

D ( x ) = min ⁡ k = 1 , ... , j − 1 ∥ x − c k ∥ . D(x) = \min_{k=1,\dots,j-1} \|x - c_k\|. D(x)=k=1,...,j−1min∥x−ck∥.

解释: D ( x ) D(x) D(x) 是点 x x x 到最近已有中心 的距离。因为我们要找的是当前最不被覆盖的点------如果 x x x 离它最近的中心都很远,那它离所有中心都远,应该优先选为下一个中心。所以用 最短距离 来衡量"被忽略的程度"。

下一个中心 c j c_j cj 按以下概率分布抽取:

P ( c j = x ) = D ( x ) 2 ∑ y ∈ D D ( y ) 2 . P(c_j = x) = \frac{D(x)^2}{\sum_{y \in D} D(y)^2}. P(cj=x)=∑y∈DD(y)2D(x)2.

重复此步骤直到选出 K K K 个中心。

解释: D ( x ) 2 D(x)^2 D(x)2 越大,表示 x x x 离已有中心越远,被选为下一个中心的概率就越大。这保证了新中心倾向于落在当前尚未被充分覆盖的区域,从而使初始中心整体分散。


数学动机:最小化势能

定义 势能函数

Φ ( 中心集 ) = ∑ x ∈ D min ⁡ c ∈ 中心 ∥ x − c ∥ 2 . \Phi(\text{中心集}) = \sum_{x \in D} \min_{c \in \text{中心}} \|x - c\|^2. Φ(中心集)=x∈D∑c∈中心min∥x−c∥2.

这正是 K‑均值目标函数在给定中心下的值(未进行分配优化)。K‑Means++ 的采样过程实际上是在 近似最小化这个势能 :每步以概率与当前势能贡献成正比的规则添加新中心,可以证明这相当于对最优势能的 O ( log ⁡ K ) O(\log K) O(logK) 近似


理论保证(Arthur & Vassilvitskii 2007)

令 ϕ opt \phi_{\text{opt}} ϕopt 表示用 K K K 个中心能达到的最小势能(即最优聚类的 SSE)。经过 K‑Means++ 初始化后,所得初始中心集的势能 ϕ \phi ϕ 满足:

E ϕ ≤ 8 ( ln ⁡ K + 2 ) ⋅ ϕ opt . \mathbb{E}\\phi \le 8 (\ln K + 2) \cdot \phi_{\text{opt}}. Eϕ≤8(lnK+2)⋅ϕopt.

期望的初始化误差被限制在最优值的 O ( log ⁡ K ) O(\log K) O(logK) 倍以内。随后运行标准 K‑均值算法只会进一步降低 SSE,因此最终聚类结果的误差同样有界。相比之下,随机初始化在最坏情况下可以产生任意大的 ϕ \phi ϕ。


证明思路(简略)

设已选中心集为 C C C,当前势能为

ϕ C = ∑ x min ⁡ c ∈ C ∥ x − c ∥ 2 . \phi_C = \sum_x \min_{c\in C} \|x-c\|^2. ϕC=x∑c∈Cmin∥x−c∥2.

选择下一个中心时,每个点 x x x 被选的概率为 D ( x ) 2 / ϕ C D(x)^2 / \phi_C D(x)2/ϕC。可以证明,新中心加入后期望势能的减少量至少为某个比例。通过递推,经过 K K K 步后总势能相对于最优解的倍数被控制在 O ( log ⁡ K ) O(\log K) O(logK) 内。


与随机初始化的对比

  • 随机初始化:期望势能可以任意差(例如当两个簇相距极远时,两个初始中心落在一个簇内的概率固定)。
  • K‑Means++:即使单次运行,也能以高概率得到与最优解相近的初始中心,且期望误差有对数上界。

之前例子中的效果

数据: ( 0 , 2 ) , ( 0 , 0 ) , ( 1 , 0 ) , ( 5 , 0 ) , ( 5 , 2 ) (0,2),(0,0),(1,0),(5,0),(5,2) (0,2),(0,0),(1,0),(5,0),(5,2),取 K = 2 K=2 K=2。

  • 随机初始化:有概率选到两个中心都在左边(如 ( 0 , 2 ) (0,2) (0,2) 和 ( 0 , 0 ) (0,0) (0,0)),导致坏局部解 SSE=26.5。
  • K‑Means++:第一个中心随机,第二个中心以概率 ∝ \propto ∝ 距离平方选取。若第一个选 ( 0 , 2 ) (0,2) (0,2),则右边两点概率远大于左边两点,几乎必然选到右边某点,从而初始中心一左一右,收敛到最优 SSE≈5.33。

从期望上看:坏情况的概率被大幅压低。


实践中的使用

  • scikit‑learn 的 KMeans(init='k-means++') 是默认参数。
  • 虽然理论保证是对 期望 而言,实际中通常运行一次即可得到好结果;对关键任务仍可运行 3~5 次取最优 SSE。
  • 与肘部法则配合:先定 K K K,再用 K‑Means++ 初始化做最终聚类。

小结

  • K‑Means++ 通过 距离平方加权采样 实现初始中心的分散布置。
  • 有严格的数学证明:期望势能不超过最优势能的 O ( log ⁡ K ) O(\log K) O(logK) 倍。
  • 该方法是目前最可靠、最常用的 K 均值初始化方案,极大降低了算法对初始值的敏感性。