08 聚类分析

欢迎来到聚类分析的世界

想象你是腾讯视频的CEO,手握数亿用户的观影数据。

  • 如何向用户推荐他们可能喜欢的电影?
  • 如何为不同的市场制作迎合当地口味的原创内容?
  • 如何发现新兴的、小众的观影群体并服务他们?

本章学习路线图

我们将通过一次深度旅程,全面掌握聚类分析的核心思想与实践。

本章学习路线图 一个分为四个阶段的学习路线图:基础、评估、算法和实践。 聚类分析:从理论到实践的完整路径 📖 1. 基础概念 “是什么?” 📊 2. 效果评估 “好不好?” ⚙️ 3. 核心算法 “怎么做?” 💼 4. 商业实践 “怎么用?” 构建一个完整、闭环的知识体系

核心问题:企业为何要不遗余力地了解客户?

更好的策略是:识别出具有相似品味的用户群体,然后针对性地进行推荐。

从无序到有序:揭示数据中的结构 无结构数据 (Unstructured Data) 聚类分析 (Clustering) 识别出的结构 (Identified Structures)

这种“物以类聚”的过程,就是我们今天要学习的核心——聚类 (Clustering)。它是在没有预先定义好的类别下,自动将相似的数据对象组合成簇的艺术和科学。

聚类 vs. 分类:一个关键的区别

在进入聚类世界前,必须厘清一个重要概念:聚类 (Clustering) 与 分类 (Classification) 的区别。

分类 (监督学习)

  • 目标: 预测已知的标签。
  • 输入: 带标签的数据 (e.g., 这封邮件是/不是垃圾邮件)。
  • 过程: 学习从特征到标签的映射规则。
  • 产出: 一个可以预测新数据标签的模型。
监督学习:分类 (Supervised Learning: Classification) 类别 A 类别 B 学习到的决策边界 (Learned Decision Boundary)

聚类 (无监督学习)

  • 目标: 发现数据中隐藏的群组。
  • 输入: 不带标签的数据。
  • 过程: 根据数据内在的相似性进行分组。
  • 产出: 数据的簇划分和对这些簇的解读。
无监督学习:聚类分析 (Unsupervised Learning: Clustering Analysis) 未标记数据 (Unlabeled Data) 聚类过程 (Clustering Process) 已发现的簇 (Discovered Clusters)

聚类:在没有标准答案的数据中寻找结构

聚类是一种经典的无监督学习 (Unsupervised Learning) 方法。

  • 监督学习:数据有明确的标签(例如,邮件被标记为“垃圾邮件”或“非垃圾邮件”),我们学习如何预测这些标签。
  • 无监督学习:数据没有标签。我们的目标是发现数据本身内在的、隐藏的结构或模式。
监督学习 vs. 无监督学习 左侧是有标签的监督学习数据,右侧是无标签的无监督学习数据。 监督学习数据 ✔ 包含明确标签 无监督学习数据 ❌ 没有预设标签

聚类的任务,就是将相似的数据点划归到同一个组(簇)中。

聚类的形式化定义:一次严谨的数据划分

给定一个包含 N 个样本的数据集 \(X = \{x_1, x_2, \ldots, x_N\}\),聚类的目标是将其划分为 K 个簇 \(\{C_1, C_2, \ldots, C_K\}\)

这个划分必须满足三个基本性质,共同构成一个划分 (Partition)

划分性质 (1/3): 非空性 (Non-empty)

每个被定义的簇,都必须真实地包含至少一个数据点。我们不做没有意义的划分。

\[ \large{\forall k \in \{1, \dots, K\}, C_k \neq \emptyset} \]

有效: 非空数据集 无效: 空数据集

划分性质 (2/3): 不相交 (Mutually Exclusive)

每个数据点只能属于唯一的一个簇,不能脚踏两只船。

\[ \large{\forall k \neq l, C_k \cap C_l = \emptyset} \]

不相交性图示 一个数据点同时位于两个重叠的簇中,违反了不相交原则。 一个数据点不能同时属于两个簇 违反不相交原则 (Mutually Exclusive)

划分性质 (3/3): 全覆盖 (Exhaustive)

数据集中的每一个数据点都必须被划分到某个簇中,不能有“漏网之鱼”。

\[ \large{\bigcup_{k=1}^{K} C_k = X} \]

全覆盖性图示 一个数据点位于所有簇之外,这违反了全覆盖原则。 数据集 X 这个“漏网之鱼”必须被分到一个簇里

聚类的直观理解:物以类聚,人以群分

聚类的核心思想非常直观:

簇内样本应尽可能“相似”,而簇间样本应尽可能“不相似”。

聚类二维可视化示例 空间中的点被分成了四个群体,簇内点紧密,簇间点疏远。 簇间分离 (不相似) 簇内紧密 (相似)

聚类的两大核心构件

要实现“物以类聚”,我们必须首先解决两个根本性问题:

聚类的两大核心构件 一个中心概念“聚类分析”分支出两个核心问题:如何衡量相似(距离测度)和如何定义代表(类簇中心)。 聚类分析 1. 如何衡量“相似”? (距离测度) 2. 如何定义“代表”? (类簇中心)

构件一:如何用数学语言描述“相似”?

在聚类算法中,“不相似”的程度通常由“距离”来衡量。距离越远,越不相似。

一个有效的距离测度 \(DM(x, y)\) 必须满足以下四个性质:

性质 数学表达 经济学直觉
非负性 \(DM(x, y) \geq 0\) 两个客户之间的差异度不能是负数。
同一性 \(DM(x, x) = 0\) 一个客户与自身的差异度为零。
对称性 \(DM(x, y) = DM(y, x)\) 客户A到B的差异度等于B到A的差异度。
三角不等式 \(DM(x, z) \leq DM(x, y) + DM(y, z)\) 经由第三者引入的间接差异,不会小于直接差异。

常用距离测度(1): 欧氏距离 (Euclidean Distance)

这是最常用、最直观的距离定义,即空间中两点间的直线距离。

对于两个 d 维向量 \(x=(x_1, \dots, x_d)\)\(y=(y_1, \dots, y_d)\),其欧氏距离为:

\[ \large{DM_{euc}(x, y) = \sqrt{\sum_{i=1}^{d} (x_i - y_i)^2}} \]

应用场景: 当数据的各个维度是可比较的,并且我们关心绝对的物理距离时,欧氏距离是首选。

常用距离测度(2): 曼哈顿距离 (Manhattan Distance)

也称为“城市街区距离”,计算的是两点在标准坐标系上的绝对轴距总和。

\[ \large{DM_{man}(x, y) = \sum_{i=1}^{d} |x_i - y_i|} \]

应用场景: 当数据维度的移动是受限制的(例如,只能在棋盘格上移动),或者当不同维度的量纲差异很大时,曼哈顿距离可能比欧氏距离更鲁棒。

距离测度可视化:欧氏 vs. 曼哈顿

欧氏距离与曼哈顿距离对比 图中展示了点A到点B的欧氏距离(蓝色虚线)和曼哈顿距离(绿色实线)。 A B 欧氏距离 曼哈顿距离

一个关键的实践问题:特征缩放 (Feature Scaling)

警告:在使用基于距离的聚类算法(如K-Means)之前,必须对数据进行标准化处理!

客户 年龄 (岁) 年收入 (美元)
A 25 50,000
B 30 50,100
  • 问题: 如果不进行缩放,收入维度上100美元的差异,其平方将远大于年龄维度上5岁的差异,导致聚类结果完全被收入主导。
  • 解决方案: 使用 StandardScaler 等工具将所有特征缩放到相似的尺度上(例如,均值为0,方差为1)。

特征缩放的影响

如果不进行缩放,距离计算会被数值范围大的特征“绑架”。

特征缩放的影响 (Effect of Feature Scaling) 1. 缩放前 (Before Scaling) 年收入 (Income) 年龄 (Age) A B C 距离计算被“收入”的大数值范围主导。 因此,A和B的距离更近。 2. 缩放后 (After Scaling) 收入 (标准化) 年龄 (标准化) A B C 特征贡献均衡, A和C的真实接近性显现。

构件二:如何找到一个簇的“心脏”?

类簇中心(或称质心)是一个簇的代表点。不同算法的定义方式不同,主要分为两类。

1. 基于均值的簇中心

  • 代表算法: K-Means
  • 定义: 簇内所有样本点的算术平均值
  • 公式: \[ \large{\mu_k = \frac{1}{|C_k|} \sum_{x_n \in C_k} x_n} \]
  • 特点: 直观,但对异常值 (outliers) 敏感。

2. 基于密度的簇中心

  • 代表算法: DBSCAN, CFSFDP
  • 定义: 密度最高的区域。
  • 要求: 一个点是簇中心,需要满足其周围邻居点密度都比它低,且与其他高密度点距离足够远。
  • 特点: 更鲁棒,能发现任意形状的簇。

质心定义方式对比

离群值对质心计算的影响 (Centroid Sensitivity to Outliers) 1. 基于均值的质心 (对离群值敏感) 离群值 (Outlier) 质心被拉偏 2. 基于密度的质心 (对离群值稳健) 离群值 (已忽略) 质心保持稳健

评估聚类效果:我们的分组真的有意义吗?

聚类需要一套客观的指标来评估其效果。评估方法分为两大类:

外部指标 (External Measures)

  • 前提: 拥有“真实”的分类标签(仅用于评估)。
  • 目标: 衡量聚类结果与真实标签的一致性。
  • 代表指标:
    • Purity (纯度)
    • Entropy (熵)
    • Homogeneity (同质性)
    • Completeness (完整性)

内部指标 (Internal Measures)

  • 前提: 没有真实标签。
  • 目标: 仅根据数据本身的特征来评估聚类的质量。
  • 核心思想: 簇内是否足够紧凑,簇间是否足够分离。
  • 代表指标:
    • Silhouette Coefficient (轮廓系数)

外部指标(1): 纯度 (Purity)

思想:一个簇的纯度有多高?我们查看簇中数量最多的那个“真实类别”占该簇总样本的比例。

计算方法

  1. 对于每个聚类簇 \(C_k\),找到其中占比最高的真实类别 \(L_s\)
  2. 计算该类别样本数 \(|C_k \cap L_s|\) 占簇内总样本数 \(|C_k|\) 的比例。
  3. 整体的Purity是所有簇的加权平均。

\[ \large{\text{Purity} = \sum_{k=1}^{K} \frac{|C_k|}{N} \max_s \left( \frac{|C_k \cap L_s|}{|C_k|} \right)} \]

优点:简单直观。

缺点:如果簇的数量非常多(极端情况每个点一个簇),Purity会虚高,无法惩罚过于破碎的聚类结果。

纯度计算示例

假设我们有10个样本,真实类别是5个菱形和5个六边形。聚类算法将其分为两个簇 K1K2

真实类别 菱形 六边形
簇 K1 5 (主导) 1
簇 K2 0 4 (主导)

计算 K1 的纯度: \(Purity(K_1) = \max(\frac{5}{6}, \frac{1}{6}) = \frac{5}{6}\)

计算 K2 的纯度: \(Purity(K_2) = \max(\frac{0}{4}, \frac{4}{4}) = \frac{4}{4} = 1\)

计算整体纯度 (加权平均): \(Purity_{total} = \frac{|K1|}{N} \times Purity(K_1) + \frac{|K_2|}{N} \times Purity(K_2) = \frac{6}{10} \times \frac{5}{6} + \frac{4}{10} \times 1 = 0.5 + 0.4 = 0.9\)

外部指标(2): 熵 (Entropy)

思想:衡量一个簇内部的“混乱”程度。如果一个簇里各种真实类别的样本混杂在一起,它的熵就高;反之,如果它很“纯”,熵就低。

计算方法: 对于簇 \(C_k\),其熵的计算公式为: \[ \large{\text{Entropy}(C_k) = - \sum_{s=1}^{S} p_{ks} \log_2(p_{ks})} \]

其中,\(p_{ks} = \frac{|C_k \cap L_s|}{|C_k|}\) 是真实类别 \(s\) 在簇 \(k\) 中出现的概率。

熵计算示例

我们继续使用上个例子中的簇 K1 来计算它的熵。

  • K1 中有6个样本。
  • 属于“菱形”类别的概率是 \(p_{菱形} = 5/6\)
  • 属于“六边形”类别的概率是 \(p_{六边形} = 1/6\)

\[ \large{\text{Entropy}(K_1) = - \left( \frac{5}{6} \log_2\left(\frac{5}{6}\right) + \frac{1}{6} \log_2\left(\frac{1}{6}\right) \right) \approx 0.65} \]

这个值越接近0,说明簇越纯净。而 K2 中只有六边形,所以 \(p_{六边形} = 1\), \(\text{Entropy}(K_2) = -1 \log_2(1) = 0\),是完全纯净的。

外部指标(3): 同质性 (Homogeneity) & 完整性 (Completeness)

Purity和Entropy都只看了一方面。同质性和完整性提供了一个更全面的视角。

  • 同质性 (Homogeneity): 衡量 一个簇是否只包含单一类别的样本。如果每个簇都完美地只包含一个真实类别的成员,那么同质性为1。它类似于经济学中的“精确率”。

  • 完整性 (Completeness): 衡量 同一类别的样本是否都被划分到了同一个簇中。如果某个真实类别的所有成员都被完美地分到了一个簇里,那么完整性就高。它类似于“召回率”。

这两个指标常常是相互制约的。

同质性 vs. 完整性:一个直观的例子

假设真实情况是 {3个苹果, 3个梨}。

完美聚类

  • 簇1: {🍎, 🍎, 🍎}
  • 簇2: {🍐, 🍐, 🍐}
  • 同质性 = 1
  • 完整性 = 1

高同质性, 低完整性

  • 簇1: {🍎}
  • 簇2: {🍎, 🍎}
  • 簇3: {🍐, 🍐, 🍐}
  • 同质性 = 1 (每个簇都很纯)
  • 完整性 < 1 (苹果被分开了)

低同质性, 高完整性

  • 簇1: {🍎, 🍎, 🍎, 🍐, 🍐, 🍐}
  • 簇2: {}
  • 同质性 < 1 (簇1不纯)
  • 完整性 = 1 (同类样本都在一起)

内部指标: 轮廓系数 (Silhouette Coefficient)

当我们没有真实标签时,如何评估聚类效果?轮廓系数是一个强大的工具。

思想:对于每个数据点,我们都希望它 与自己簇内的点足够近,同时与别的簇的点足够远

计算方法:对于样本 \(x_n\)

  • \(a(x_n)\): \(x_n\) 到其所在簇内所有其他点的平均距离(衡量簇内凝聚度)。
  • \(b(x_n)\): \(x_n\)最近的那个其他簇的所有点的平均距离(衡量簇间分离度)。

\[ \large{SC(x_n) = \frac{b(x_n) - a(x_n)}{\max\{a(x_n), b(x_n)\}}} \]

轮廓系数的计算可视化

轮廓系数 (Silhouette Coefficient) 的理想情况 x_n a(x_n): 簇内距离 (Intra-Cluster Distance) (目标: 越小越好) b(x_n): 簇间距离 (Nearest-Cluster Distance) (目标: 越大越好)

解读轮廓系数

轮廓系数 \(SC(x_n)\) 的取值范围在 [-1, 1] 之间。

  • SC ≈ 1: 非常好!说明 \(a(x_n)\) 远小于 \(b(x_n)\),该点与簇内点很近,与簇外点很远。
  • SC ≈ 0: 说明点可能位于两个簇的边界上。
  • SC ≈ -1: 非常差!说明该点可能被分到了错误的簇。

我们可以计算所有数据点的平均轮廓系数,作为整个聚类结果的评价指标。

算法一:K-均值聚类 (K-Means Clustering)

K-Means 是最著名、最广泛使用的聚类算法之一。

  • 核心思想: 通过迭代,将数据划分为 K 个簇,使得每个数据点都属于离它最近的那个簇中心,并且每个簇的簇内平方和(Inertia)最小。
  • 优点: 算法简单,计算速度快,在处理球状、大小相似的簇时效果极佳。
  • 缺点: 需要预先指定簇的数量 K,对初始中心点敏感,对非球状簇和异常值效果不佳。

K-Means 的目标函数

K-Means 的目标是最小化所有簇的簇内误差平方和 (Sum of Squared Errors, SSE),也称为惯性 (Inertia)

\[ \large{\text{minimize} \sum_{k=1}^{K} \sum_{x_n \in C_k} ||x_n - \mu_k||^2} \]

其中:

  • \(K\) 是簇的数量。
  • \(C_k\) 是第 \(k\) 个簇。
  • \(\mu_k\) 是第 \(k\) 个簇的中心点。
  • \(||x_n - \mu_k||^2\) 是数据点 \(x_n\) 到其所属簇中心的欧氏距离的平方。

算法的每一步(分配和更新)都是为了让这个总误差值变得更小。

K-Means 算法的迭代过程

K-Means的算法过程就像一场“抢地盘”的游戏,分四步循环进行:

  1. 初始化 (Initialize): 随机选择 K 个数据点作为初始的簇中心。
  2. 分配 (Assign): 对于每一个数据点,计算它到 K 个簇中心的距离,并将其分配给距离最近的那个簇。
  3. 更新 (Update): 对于每一个簇,重新计算其中心点(即该簇所有数据点的均值)。
  4. 重复 (Repeat): 重复步骤2和3,直到簇中心不再发生显著变化,或者数据点的分配不再改变。

K-Means 步骤可视化 (1/4): 初始化

假设 K=3。我们随机在数据空间中选择三个点作为初始质心。

K-Means 步骤1:初始化 一堆灰色数据点和三个随机放置的彩色叉号作为初始簇中心。 步骤 1: 随机初始化 3 个簇中心 X X X

K-Means 步骤可视化 (2/4): 分配

根据每个点到这三个初始中心的距离,将它们涂上最近中心的颜色。

K-Means 步骤2:分配 数据点根据离哪个簇中心最近而被着色。 步骤 2: 将每个点分配给最近的簇中心 X X X

K-Means 步骤可视化 (3/4): 更新

对每个颜色的簇,计算其所有点的均值,并将簇中心移动到这个新位置。

K-Means 步骤3:更新 簇中心移动到其簇成员的平均位置,箭头指示移动方向。 步骤 3: 更新簇中心 (移动到均值位置) XX XX XX

K-Means 步骤可视化 (4/4): 收敛

重复“分配-更新”步骤,直到簇中心不再移动。此时,我们得到了最终的聚类结果。

K-Means 步骤4:收敛 最终稳定的聚类结果,数据点被清晰地分成了三个簇。 步骤 4: 算法收敛,得到最终结果 X X X

K-Means 的阿喀琉斯之踵:初始化的重要性

随机初始化可能会导致次优的聚类结果,甚至完全错误的结果。

  • 问题: 如果初始中心点选得不好(例如,都选在同一个簇里),算法可能会陷入一个局部最优解,而无法找到全局最优解。
  • 解决方案: K-Means++
    • 它不是完全随机选择,而是采用一种更智能的策略:选择的初始中心点彼此之间尽可能相互远离
    • 这大大增加了找到全局最优解的概率。在 scikit-learn 中,init='k-means++' 是默认选项,我们通常无需担心。

K-Means++ 初始化策略图解

K-Means++ 初始化策略 通过选择相互远离的初始中心点,来提高聚类质量 1. 随机选择 C1 2. 选择离 C1 最远的点作为 C2 3. 选择离现有中心都远的点作为 C3

实践中最关键的问题:如何选择 K 值?

K-Means 算法本身无法告诉我们最佳的 K 是多少。这是一个需要我们利用领域知识和数据洞察来决定的超参数。

幸运的是,我们有两种常用的启发式方法来辅助决策:

  1. 肘部法则 (Elbow Method)
  2. 轮廓分析 (Silhouette Analysis)

选择K值(1): 肘部法则 (Elbow Method)

思想: 尝试不同的 K 值(例如从2到10),并计算每个 K 值对应的簇内误差平方和 (SSE, a.k.a. Inertia)

随着 K 值的增加,SSE 必然会下降。我们寻找的,是 SSE 下降速度由快变缓的那个“拐点”,即“肘部”。

肘部法则 (Elbow Method) 簇内误差平方和 (SSE) 簇的数量 (K) 2 3 4 5 6 7 8 9 10 “肘部”在此处 SSE下降速度明显变缓 K=4 是一个很好的选择

选择K值(2): 轮廓分析 (Silhouette Analysis)

思想: 对每个尝试的 K 值,计算其聚类结果的平均轮廓系数。我们选择那个使得平均轮廓系数最高的 K 值。

相比肘部法则,轮廓分析不仅考虑了簇内凝聚度,还考虑了簇间分离度,通常是更可靠的指标。

轮廓分析寻找最优K值 平均轮廓系数随K值变化曲线,突出K=4为最优点,符合学术极简风格,所有元素在安全区内。 簇的数量 K 平均轮廓系数 2 3 4 5 6 7 8 最高分在此处 K=4 是最佳选择 轮廓分析:寻找最优K值

K-Means 案例: 购物中心客户分群

使用一个模拟的客户数据集,包含客户的年收入和消费分数。我们的目标是识别出不同的客户群体。

1. 数据探索

Table 1: 客户数据样本
CustomerID Gender Age Annual Income (k$) Spending Score (1-100)
0 1 Male 19 15 39
1 2 Male 21 15 81
2 3 Female 20 16 6
3 4 Female 23 16 77
4 5 Female 31 17 40

2. 寻找最优 K 值

在应用 K-Means 之前,我们先用肘部法则和轮廓分析来确定最佳的簇数量 K。

购物中心数据的K值选择分析 左侧是肘部法则图,右侧是轮廓分析图,两者都指向K=5是最佳选择。 为购物中心数据选择最佳K值 (K=5) 肘部法则 K 值SSE 5 轮廓分析 K 值轮廓系数 5

3. Python 实现

两种方法都指向 K=5 是一个很好的选择。现在我们用 K=5 来运行K-Means。

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# 1. 加载和准备数据
url = 'https://raw.githubusercontent.com/subashgandyer/datasets/main/mall_customers.csv'
# 此处为演示,实际项目中应加入更完整的错误处理
try:
    df = pd.read_csv(url)
except: # 如果URL失效,创建模拟数据
    print("URL数据加载失败,使用模拟数据代替。")
    data = {'Annual Income (k$)': np.random.randint(15, 140, 200),
            'Spending Score (1-100)': np.random.randint(1, 100, 200)}
    df = pd.DataFrame(data)

X = df[['Annual Income (k$)', 'Spending Score (1-100)']]

# 2. 特征缩放 (至关重要的一步)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. 运行K-Means (我们已确定 K=5)
kmeans = KMeans(n_clusters=5, random_state=42, n_init='auto')
# 使用缩放后的数据进行训练和预测
df['Cluster'] = kmeans.fit_predict(X_scaled)
URL数据加载失败,使用模拟数据代替。

4. 结果可视化与解读

我们将聚类结果可视化,看看我们发现了哪些客户群体。

购物中心客户的五个分群 一个散点图,显示了根据年收入和消费分数划分的五个客户群,并标出了每个群的质心。 客户分群结果 年收入 (k$) 消费分数 (1-100) X X X X X

5. 商业洞察

聚类结果清晰地揭示了五个不同的客户群体:

  1. 谨慎型: 高收入,低消费。
  2. 普通大众: 中等收入,中等消费。
  3. 潜力股: 低收入,高消费(可能是学生)。
  4. 目标客户: 高收入,高消费(黄金客户)。
  5. 节俭型: 低收入,低消费。

这种划分,为商场的精准营销、会员管理和资源分配提供了清晰的数据驱动依据。

算法二:层次聚类 (Hierarchical Clustering)

与K-Means一次性将数据分成K个簇不同,层次聚类会创建一个聚类的层级结构

  • 核心思想: 它不产生单一的聚类结果,而是生成一个树状图(Dendrogram),展示了数据点是如何逐层合并(或分裂)的。
  • 两种主要策略:
    • 凝聚式 (Agglomerative): 自底向上。开始时每个点都是一个簇,然后逐步合并最相似的簇。
    • 分裂式 (Divisive): 自顶向下。开始时所有点都在一个簇,然后逐步分裂最不相似的簇。

凝聚式层次聚类的工作流程

  1. 开始: 将每个数据点视为一个独立的簇。
  2. 合并: 找到所有簇中距离最近的两个簇,并将它们合并成一个新的簇。
  3. 重复: 重复步骤2,直到所有数据点都被合并到同一个簇中。

整个过程的合并历史,就构成了一个树状的层次结构。

关键问题:如何计算“簇与簇”之间的距离?

这通过链接准则 (Linkage Criterion) 来定义。

最短距离(Single Linkage) min(distance) 最小簇间距离 最长距离(Complete Linkage) max(distance) 最大簇间距离 平均距离(Average Linkage) average(distance) 所有点对距离的平均值 层次聚类中三种不同的簇间距离定义方法

层次聚类的可视化:树状图 (Dendrogram)

树状图是层次聚类的标志性输出。它直观地展示了簇的合并过程。

  • 纵轴: 代表簇之间的距离或不相似度。合并发生时的高度,表示被合并的两个簇有多不相似。
  • 横轴: 代表各个数据点。

我们可以通过在某个高度“横切”树状图,来得到指定数量的簇。

层次聚类树状图 距离 样本点 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 切割线 1 (K=3) 切割线 2 (K=2)

算法三:基于密度的聚类 (DBSCAN)

当K-Means遇到瓶颈时:K-Means假设簇是球状的,对于不规则形状的簇(如月牙形、环形)则无能为力。

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 的登场

  • 核心思想: 只要样本点的密度足够大,就将它们划分为同一个簇。它能够发现任意形状的簇,并且能自动识别出噪声点。
  • 优点: 无需预先指定簇的数量,能处理任意形状的簇,对噪声点不敏感。
  • 缺点: 对两个核心参数(epsmin_samples)的选择很敏感,处理密度不均的数据集时效果不佳。

DBSCAN 的核心概念

DBSCAN 的工作依赖于三个关键定义,由两个参数 eps (半径) 和 min_samples (最少点数) 控制。

DBSCAN 聚类: 点的分类 参数设置 (Parameters): min_samples = 4 核心点 (Core Point) ε-邻域内有 ≥ 4个点 (含自身) 边界点 (Border Point) 邻域内点数 < 4, 但 是核心点的邻居 噪声点 (Noise Point) 既非核心也非边界点

DBSCAN 算法流程的直观理解

DBSCAN 的过程就像“滚雪球”:

  1. 随机选择一个未被访问的点 P
  2. 检查 P 是否为核心点
    • 如果是: 以 P 为起点,创建一个新簇。然后,通过 Pε-邻域,找到所有密度可达的点(包括其他核心点和边界点),将它们全部加入这个簇。这个过程会像链式反应一样不断扩展,直到整个密度相连的区域都被覆盖。
    • 如果不是 (是边界点或噪声点): 暂时标记为噪声点,继续处理下一个点。
  3. 重复步骤1和2,直到所有点都被访问过。

DBSCAN 案例:K-Means 的滑铁卢,DBSCAN 的高光时刻

让我们看一个K-Means无法处理,而DBSCAN能完美解决的例子:“双月”数据集。

K-Means 的错误结果 DBSCAN 的完美结果

算法四:高斯混合模型 (GMM)

超越“硬”聚类: K-Means 对每个点进行“非黑即白”的硬分配 (Hard Assignment)。但有时,一个点可能位于两个簇的边界,我们更希望得到一个概率描述。

高斯混合模型 (Gaussian Mixture Model, GMM) 提供了一种软聚类 (Soft Clustering) 方法。

  • 核心思想: 假设所有数据点都是从 K 个不同的高斯分布(正态分布)的混合中生成的。聚类的过程,就是找出这 K 个高斯分布的参数(均值、方差、权重)。
  • 结果: GMM 不会直接告诉我们每个点属于哪个簇,而是给出该点属于每个簇的概率

GMM vs. K-Means

特性 K-Means Gaussian Mixture Model (GMM)
簇形状 假设为球形 (圆形) 可适应椭圆形
分配方式 硬分配 (Hard Assignment) 软分配 (Soft Assignment)
数学基础 基于距离 基于概率 (期望最大化算法)
灵活性 较低 较高,能更好地拟合复杂数据

GMM 可以看作是 K-Means 的一个概率泛化版本。

GMM 案例: 拟合椭圆形簇

当簇的形状不是圆形而是椭圆形时,GMM 的优势就体现出来了。

GMM vs K-means: 处理椭圆形簇的能力对比 K-means 的局限性 K-means 强制使用圆形边界 导致大量空白区域和错误分类 GMM 的优势 GMM 自适应椭圆边界 完美贴合数据分布 相同数据 不同算法的拟合效果 为什么GMM更适合椭圆形数据? K-means: 固定半径圆形 仅使用均值,忽略形状 GMM: 可调节椭圆 均值 + 协方差矩阵 GMM: N(x|μ, Σ) = 高斯分布 with 均值μ和协方差Σ GMM通过协方差矩阵捕捉数据的方向性和伸展程度,实现更精确的聚类

课程总结:如何选择正确的聚类算法?

今天我们学习了四种主流的聚类算法,它们各有千秋。在实际应用中,没有“最好”的算法,只有“最合适”的算法。

算法 主要优点 主要缺点 适用场景
K-Means 速度快,简单易懂 需预设K,对球形簇敏感 大规模、簇结构简单的数据集
层次聚类 无需预设K,提供层次结构 计算复杂度高 (O(N^2)) 需要探索数据层次结构,小数据集
DBSCAN 无需预设K,可发现任意形状 对参数敏感,密度不均时困难 簇形状不规则,含噪声的数据集
GMM 软聚类,簇形状灵活(椭圆) 算法复杂,计算成本高 需要概率输出,簇有重叠

算法选择决策树

这是一个简化的决策流程,帮助你在实践中选择合适的聚类算法。

聚类算法选择决策树 一个帮助选择聚类算法的决策树流程图。 需要预设簇数 K 吗? 簇的形状是球形的吗? 能处理噪声/异常点吗? 是 (或不确定) 否 (椭圆) K-Means GMM 否 (想看层级) DBSCAN 层次聚类

聚类分析的商业价值

聚类分析不仅仅是一套算法,更是一种强大的商业洞察工具。

  • 市场营销: 识别客户分群,实现精准广告投放和个性化推荐。(e.g., Amazon, Netflix)
  • 金融风控: 发现异常交易模式,识别潜在的欺诈行为。(e.g., American Express)
  • 城市规划: 根据居民出行模式对城市进行功能区划分。(e.g., 智慧城市项目)
  • 生物信息: 对基因表达数据进行聚类,发现具有相似功能的基因群。(e.g., 癌症研究)
  • 社交网络: 发现社区和兴趣小组,进行好友推荐。(e.g., Facebook, LinkedIn)

掌握聚类,就是掌握了从海量数据中发现结构、创造价值的关键钥匙。

谢谢!

Q & A