学习目标

完成本课后,你将能够:

本课在课程中的位置. 在 1.3.2 中,你已经了解了聚类任务、K-means、层次聚类、DBSCAN 以及 PCA 的基本思想。本课不再重复这些入门定义,而是重点学习如何选择设置、比较结果,并识别那些在图上看起来很漂亮、实际却可能误导人的分组。线性代数的详细内容安排在 Theme 2;监督模型的性能指标安排在 Module 1.5。

1. 为什么没有一种算法适合所有数据

聚类并不是回答“世界上有哪些类别”,而是回答“在选定的相似性度量方式下,数据呈现出什么结构”。因此,首先要描述数据的几何形态。大小相近、紧凑的群组可能适合 K-means;细长、嵌套或形状不规则的区域则可能需要其他方法。如果密度差异很大,一个统一的邻域阈值可能无法让 DBSCAN 同时适配所有群组。

聚类:依据选定的相似性标准,在没有预设目标标签的情况下寻找观测对象群组。
三种聚类结构形态比较紧凑群组、细长结构,以及带有噪声点的不规则密度区域。 紧凑群组密集且彼此分离 细长群组由邻近点连接 不规则形状与噪声噪声点单独保留 噪声点单独保留
应根据数据几何结构选择算法:紧凑群组可能适合 K-means,而细长或不规则结构需要不同假设。不要强行把噪声点分配给群组。

2. 特征准备:算法运行前,距离已经受到影响

算法在特征空间中比较观测对象。如果一个特征以千瓦时计量、数值达到数千,而另一个特征介于 0 和 1 之间,欧氏距离可能几乎完全由第一个特征决定。标准化通常通过减去均值并除以标准差,使尺度更具可比性。但标准化并非任何任务都必须执行:原始单位有时具有重要意义,异常值也会影响均值和标准差。此时,基于中位数和四分位距的稳健缩放可能更合适。

标准化:将数值特征转换到可比较的尺度。

3. 如何选择和调整算法

K-means:一种将观测对象划分为 k 个群组、分配到最近质心并重新计算中心的算法。
层次聚类:通过连续合并或拆分群组来构建树状结构的一类方法。
Linkage(连接准则):构建层次结构时计算两个群组之间距离的规则。
DBSCAN:一种基于密度的聚类算法,可以发现形状不规则的群组并识别噪声点。
eps 与 min_samples:分别表示邻域半径和定义 DBSCAN 密度条件的最小点数。

K-means 最小化到质心的平方距离之和。它速度快,适合作为基线方法,但更适合紧凑、凸形的群组,并且需要预先指定 k。建议使用多次初始化,并固定 random_state 以便复现。凝聚型层次聚类逐步构建合并树;在不同高度切割树会得到不同数量的群组,结果取决于 linkage,即群组之间距离的计算规则。DBSCAN 通过密度可达关系形成群组,能够识别噪声点,也可以发现不规则形状。eps 与 min_samples 相互影响:增大 eps 会扩大邻域,min_samples 则规定局部密度要求。密度差异很大时,DBSCAN 可能拆分同一结构或合并不同结构。

密度可达:在 DBSCAN 中,通过一系列高密度邻域建立的点之间的关系。

4. 不要只凭图形直觉决定聚类数量

肘部法则比较不同 k 下的簇内平方和,寻找增加聚类数量后收益开始明显递减的位置。但“肘部”往往并不明确,而且受到特征尺度影响。轮廓系数比较一个样本到本簇的平均距离与到最近其他簇的距离。接近 1 通常表示几何分离更清晰,接近 0 表示处于边界附近,负值可能意味着分配不理想。但高分并不代表群组对实际任务有用。对于 DBSCAN,还应检查噪声比例以及结果对 eps 的敏感程度;噪声点并不自动等于坏数据。

Silhouette score:衡量群组内部凝聚程度以及与最近其他群组分离程度的指标。
从数据到有依据的聚类决策聚类分析的五个阶段:准备特征、选择尺度与距离度量、调整算法参数、检查质量与稳定性、解释结果。从数据到有依据的聚类决策1特征准备检查单位与异常值2尺度与度量明确如何定义相似与接近3算法与参数比较不同参数设置4质量与稳定性不要只依赖单一指标5结果解释联系实际任务理解
聚类是一个迭代过程:质量与稳定性检查可能要求返回特征准备或参数调整阶段。

5. 稳定性:发现的结构能否重复出现

聚类通常不存在唯一的“正确答案”。可以使用不同初始化、不同子样本或相近参数重复分析。比较时应关注分区本身,而不是聚类编号:两个运行中的 0 和 1 可能互换,但结构并未改变。调整兰德指数(ARI)在校正随机一致性的基础上比较两个分区:1 表示完全相同,约 0 表示接近随机一致水平,负值表示低于随机期望。稳定并不证明真实:算法也可能稳定地发现由低质量数据造成的假象。

Adjusted Rand Index (ARI):对随机一致性进行校正后比较两个分区的相似性指标。

6. PCA:究竟减少了什么

解释方差:单个主成分或一组主成分所描述的数据总变化比例。

PCA 构造新的、彼此正交的坐标轴,即主成分;每个主成分都是原始特征的线性组合。第一主成分指向数据方差最大的方向;后续主成分在与前面主成分正交的条件下,尽可能解释剩余方差。解释方差比例可以衡量选定主成分保留了多少数据变化。但方差不等于实际价值:罕见却重要的信号可能只有很小的方差。PCA 前通常需要中心化;是否缩放取决于单位是否可比,以及是否希望保留原始特征的方差尺度。

Principal Component Analysis (PCA):一种线性变换,生成按解释方差排序的正交主成分。
PCA 如何改变数据表示原始特征空间被转换为主成分空间;投影会损失部分信息。原始特征主成分空间 x₁x₂PC1PC2 PC1PC2投影
PCA 选择方差最大的方向。投影保留部分结构,但不会保留原始空间中的所有距离和差异。

7. 降维不等于把数据画成二维图

t-SNE 与 UMAP:常用于可视化探索复杂数据局部邻域的非线性降维方法。

PCA 既可以作为建模前的特征变换,也可以用于在平面上展示数据。这是两个不同目标。用于建模时,应根据后续任务表现和可接受的信息损失来选择主成分数量。二维投影必然会丢失某些方向的信息。t-SNE 和 UMAP 可以保留局部邻域并展示复杂结构,但不能把远距离群组之间的距离、图中“岛屿”的面积和密度直接当作定量事实。视觉上的分离只是进一步研究的线索,并不是自然类别存在的证明。

8. 连续案例:建筑运行模式

假设每小时有一条观测记录,包含平均功率、室外温度、小时、设备运行比例。首先检查单位、缺失值、季节性和相关特征。然后根据研究问题选择特征:我们希望寻找相似负荷曲线,还是希望识别不受时段影响的运行模式?完成缩放后,以 K-means 作为基线;若预期存在不规则形状和噪声,则比较 DBSCAN;若关注嵌套结构,则比较层次聚类。综合比较轮廓系数、噪声比例、子样本稳定性,以及原始单位下的群组特征。最后与领域工程师共同解释并命名群组。

9. Python 实践:比较方法并检查 PCA

下面的可复现实验使用合成数据。它不能证明哪种算法最适合真实建筑,而是展示一套工作流程:特征缩放、基线聚类、诊断、分区比较与 PCA。需要 Python 3.10+、NumPy 和 scikit-learn。安装命令:`python -m pip install numpy scikit-learn`。

代码示例:比较 K-means、DBSCAN 与 PCA

代码会输出诊断指标;具体数值可能随库版本和随机数实现而变化。

import numpy as np
from sklearn.cluster import DBSCAN, KMeans
from sklearn.decomposition import PCA
from sklearn.metrics import adjusted_rand_score, silhouette_score
from sklearn.preprocessing import StandardScaler

rng = np.random.default_rng(7)
centres = np.array([[0.0, 0.0, 0.0], [4.0, 4.0, 1.0], [-3.0, 3.0, 4.0]])
clouds = [rng.normal(loc=centre, scale=scale, size=(90, 3))
          for centre, scale in zip(centres, (0.45, 0.75, 0.55))]
X = np.vstack(clouds)
X = np.vstack([X, rng.uniform(-5, 7, size=(12, 3))])

X_scaled = StandardScaler().fit_transform(X)

kmeans_a = KMeans(n_clusters=3, n_init=20, random_state=7)
labels_a = kmeans_a.fit_predict(X_scaled)
kmeans_b = KMeans(n_clusters=3, n_init=20, random_state=21)
labels_b = kmeans_b.fit_predict(X_scaled)

dbscan = DBSCAN(eps=0.55, min_samples=6)
db_labels = dbscan.fit_predict(X_scaled)
non_noise = db_labels != -1

print("K-means clusters:", len(set(labels_a)))
print("K-means silhouette:", round(silhouette_score(X_scaled, labels_a), 3))
print("K-means stability (ARI):", round(adjusted_rand_score(labels_a, labels_b), 3))
print("DBSCAN clusters:", len(set(db_labels) - {-1}))
print("DBSCAN noise share:", round(1 - non_noise.mean(), 3))

pca = PCA(n_components=2, random_state=7)
X_2d = pca.fit_transform(X_scaled)
print("PCA explained variance:", np.round(pca.explained_variance_ratio_, 3))
print("Total retained variance:", round(pca.explained_variance_ratio_.sum(), 3))

独立实践任务

选择一个至少包含三个数值特征的小型真实或合成数据集。说明你希望发现哪一种相似性。分别使用两个 k 值运行 K-means,并使用两个 eps 值运行 DBSCAN。记录每次运行的群组数量、噪声比例(如适用)、轮廓系数(适用时)、重采样后的稳定性,以及群组特征的领域解释。然后将 PCA 降至两个主成分,报告解释方差比例,并说明为什么二维图不能证明自然类别确实存在。最后说明你会选择哪种方法,以及仍有哪些局限。

10. 局限与常见错误

11. 本课要点

聚类是一种探索性假设,其结果受到特征、尺度、度量方式和算法影响。可靠的分析应比较多个有依据的方案、检查稳定性,并回到原始特征进行解释。PCA 将方差压缩到新的坐标中,但不保证保留所有重要信号。任何指标或漂亮的可视化都不能替代领域验证。

参考资料与延伸阅读

  1. scikit-learn:聚类
  2. scikit-learn:使用轮廓分析选择聚类数量
  3. scikit-learn:PCA
  4. Rousseeuw(1987):用于聚类分析解释与验证的轮廓图
  5. McInnes、Healy 与 Melville:UMAP

课程术语表

01标准化Standardization

将数值特征转换到可比较的尺度,通常使均值为零、标准差为一。

02质心Centroid

特征空间中一个群组内观测点的平均位置,例如 K-means 使用的中心。

03Linkage(连接准则)Linkage

层次聚类中计算两个群组之间距离的规则。

04密度可达Density reachability

根据局部密度和 DBSCAN 参数定义的邻域关系。

05Epsilon(eps)Epsilon (eps)

DBSCAN 用于识别高密度区域的邻域半径。

06轮廓系数Silhouette coefficient

衡量样本在本群组内的凝聚程度及与相邻群组分离程度的指标。

07聚类稳定性Cluster stability

数据、初始化或参数略有变化时,分区结构保持相似的程度。

08主成分Principal component

由原始特征线性组合形成的 PCA 新正交轴。

09解释方差Explained variance

一个或多个 PCA 主成分所描述的数据变化比例。

10维度灾难Curse of dimensionality

高维空间中的一系列效应,可能使距离和密度不再具有良好区分能力。

自测

问题 1

当特征单位不可比较时,运行 K-means 前应考虑什么?

问题 2

应该如何解释轮廓系数?

问题 3

DBSCAN 的特点是什么?

问题 4

为什么不能直接比较不同运行中的聚类编号?

问题 5

PCA 前几个主成分的解释方差比例较高意味着什么?

问题 6

如何正确使用 t-SNE 或 UMAP 的二维图?

问题 7

哪些做法有助于检查聚类稳定性?请选择所有正确选项。

问题 8

关于 PCA,哪些说法正确?请选择所有正确选项。