学习目标
完成本课后,你将能够:
- 根据数据的形状、密度和尺度,在 K-means、层次聚类与 DBSCAN 之间进行选择。
- 解释标准化、距离度量和算法参数如何影响结果。
- 将肘部法则和轮廓系数作为诊断工具,而不是最终答案。
- 检查聚类结果在样本、初始化和参数变化下是否稳定。
- 解释 PCA 保留了什么,以及为什么主成分不一定是有业务含义的新特征。
- 区分用于建模的降维与用于探索的二维可视化。
1. 为什么没有一种算法适合所有数据
聚类并不是回答“世界上有哪些类别”,而是回答“在选定的相似性度量方式下,数据呈现出什么结构”。因此,首先要描述数据的几何形态。大小相近、紧凑的群组可能适合 K-means;细长、嵌套或形状不规则的区域则可能需要其他方法。如果密度差异很大,一个统一的邻域阈值可能无法让 DBSCAN 同时适配所有群组。
2. 特征准备:算法运行前,距离已经受到影响
算法在特征空间中比较观测对象。如果一个特征以千瓦时计量、数值达到数千,而另一个特征介于 0 和 1 之间,欧氏距离可能几乎完全由第一个特征决定。标准化通常通过减去均值并除以标准差,使尺度更具可比性。但标准化并非任何任务都必须执行:原始单位有时具有重要意义,异常值也会影响均值和标准差。此时,基于中位数和四分位距的稳健缩放可能更合适。
3. 如何选择和调整算法
K-means 最小化到质心的平方距离之和。它速度快,适合作为基线方法,但更适合紧凑、凸形的群组,并且需要预先指定 k。建议使用多次初始化,并固定 random_state 以便复现。凝聚型层次聚类逐步构建合并树;在不同高度切割树会得到不同数量的群组,结果取决于 linkage,即群组之间距离的计算规则。DBSCAN 通过密度可达关系形成群组,能够识别噪声点,也可以发现不规则形状。eps 与 min_samples 相互影响:增大 eps 会扩大邻域,min_samples 则规定局部密度要求。密度差异很大时,DBSCAN 可能拆分同一结构或合并不同结构。
4. 不要只凭图形直觉决定聚类数量
肘部法则比较不同 k 下的簇内平方和,寻找增加聚类数量后收益开始明显递减的位置。但“肘部”往往并不明确,而且受到特征尺度影响。轮廓系数比较一个样本到本簇的平均距离与到最近其他簇的距离。接近 1 通常表示几何分离更清晰,接近 0 表示处于边界附近,负值可能意味着分配不理想。但高分并不代表群组对实际任务有用。对于 DBSCAN,还应检查噪声比例以及结果对 eps 的敏感程度;噪声点并不自动等于坏数据。
5. 稳定性:发现的结构能否重复出现
聚类通常不存在唯一的“正确答案”。可以使用不同初始化、不同子样本或相近参数重复分析。比较时应关注分区本身,而不是聚类编号:两个运行中的 0 和 1 可能互换,但结构并未改变。调整兰德指数(ARI)在校正随机一致性的基础上比较两个分区:1 表示完全相同,约 0 表示接近随机一致水平,负值表示低于随机期望。稳定并不证明真实:算法也可能稳定地发现由低质量数据造成的假象。
6. PCA:究竟减少了什么
PCA 构造新的、彼此正交的坐标轴,即主成分;每个主成分都是原始特征的线性组合。第一主成分指向数据方差最大的方向;后续主成分在与前面主成分正交的条件下,尽可能解释剩余方差。解释方差比例可以衡量选定主成分保留了多少数据变化。但方差不等于实际价值:罕见却重要的信号可能只有很小的方差。PCA 前通常需要中心化;是否缩放取决于单位是否可比,以及是否希望保留原始特征的方差尺度。
7. 降维不等于把数据画成二维图
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. 局限与常见错误
- 不分析单位和特征含义就缩放,或者不检查异常值便机械地缩放所有特征。
- 把肘部图当作聚类数量的唯一、明确答案。
- 直接比较聚类编号,而不是比较分区结构。
- 把高轮廓系数当作群组真实或有用的证明。
- 将 PCA 主成分解释为原始特征或因果因素。
- 把二维嵌入当作原始空间距离的精确地图。
- 未经领域核查就把 DBSCAN 的噪声点删除并认定为错误。
11. 本课要点
聚类是一种探索性假设,其结果受到特征、尺度、度量方式和算法影响。可靠的分析应比较多个有依据的方案、检查稳定性,并回到原始特征进行解释。PCA 将方差压缩到新的坐标中,但不保证保留所有重要信号。任何指标或漂亮的可视化都不能替代领域验证。
参考资料与延伸阅读
课程术语表
将数值特征转换到可比较的尺度,通常使均值为零、标准差为一。
特征空间中一个群组内观测点的平均位置,例如 K-means 使用的中心。
层次聚类中计算两个群组之间距离的规则。
根据局部密度和 DBSCAN 参数定义的邻域关系。
DBSCAN 用于识别高密度区域的邻域半径。
衡量样本在本群组内的凝聚程度及与相邻群组分离程度的指标。
数据、初始化或参数略有变化时,分区结构保持相似的程度。
由原始特征线性组合形成的 PCA 新正交轴。
一个或多个 PCA 主成分所描述的数据变化比例。
高维空间中的一系列效应,可能使距离和密度不再具有良好区分能力。
自测
问题 1
当特征单位不可比较时,运行 K-means 前应考虑什么?
问题 2
应该如何解释轮廓系数?
问题 3
DBSCAN 的特点是什么?
问题 4
为什么不能直接比较不同运行中的聚类编号?
问题 5
PCA 前几个主成分的解释方差比例较高意味着什么?
问题 6
如何正确使用 t-SNE 或 UMAP 的二维图?
问题 7
哪些做法有助于检查聚类稳定性?请选择所有正确选项。
问题 8
关于 PCA,哪些说法正确?请选择所有正确选项。