学习目标

学习本课后,你将能够:

核心思想。 发现的结构是一种需要研究的假设,而不是对现实世界的自动正确分类。

1. 什么是无监督学习?

无监督学习(Unsupervised Learning)是一类机器学习方法:在每个训练对象没有预先定义目标标签的情况下分析数据,并识别其中的结构、相似性、紧凑表示或异常观测。

在上一课中,我们使用 (X, y) 样本对:对象的特征,以及模型需要学习预测的已知答案。这里的起点通常是特征矩阵 X,而没有需要复现的目标变量 y。

没有目标标签并不意味着算法没有目标。研究者需要提出问题:把相似的能耗曲线分组,将大量测量压缩成少数几个成分,或者找出与常见行为明显不同的观测。

不要将其与自监督学习(self-supervised learning)混淆。 在自监督学习中,训练信号由数据本身构造,例如模型学习恢复输入中被隐藏的部分,或预测序列的下一个片段。这种方法常用于大型模型的预训练。文献通常将其作为单独的学习范式,但不同研究对术语边界的使用并不完全一致。半监督学习(semi-supervised learning)则结合少量带标签数据和大量无标签数据。

例如,我们有数百栋建筑的运行记录:温度、湿度、能耗、时段和设备模式。算法可能发现重复的运行曲线,例如夜间运行、工作日或负荷峰值。只有在检查各组特征后,研究者才为其赋予有意义的名称。

发现数据结构左侧监督学习使用特征和已知答案;右侧无监督学习只接收特征,并在没有目标标签的情况下寻找结构。监督学习X — 特征y — 已知答案为新 X 预测 y无监督学习X — 特征未提供 y发现 X 中的结构
关键区别在于训练时是否提供目标答案。两种范式都需要有意义的数据和结果验证。

2. 聚类:寻找相似观测

聚类(Clustering)是按照选定标准对对象分组,使同一组内的对象较为相似,而不同组的对象差异较大。对于所有任务,并不存在唯一通用的相似性定义。

算法并不知道领域中的“相似”意味着什么。如果按年度能耗对建筑分组,可能得到一种结构;如果按每日负荷曲线分组,结果可能完全不同。结果取决于特征选择、特征尺度、距离度量和算法参数。

K-means:围绕中心形成群组

K-means要求预先指定群组数量 k。算法放置聚类中心,将每个观测分配给最近的中心,再把中心更新为所属观测的均值,并重复这些步骤,直到分配趋于稳定。它适合作为数值特征的基础方法,但更适合形状紧凑、尺度相近的群组。

k需要事先选择。不同的初始中心可能得到不同结果,因此实现通常会进行多次初始化。K-means 对特征尺度和离群值敏感:数值范围很大的特征可能主导距离计算。

层次聚类

层次聚类会构建合并或拆分对象的树状结构。在凝聚式方法中,最初每个对象各自成组,然后逐步合并距离较近的群组。可以在不同细节层次查看树状图,但距离度量和连接规则(linkage)会影响结果。

DBSCAN:基于密度的群组

DBSCAN寻找观测密度较高的区域,能够发现形状不规则的群组,并将孤立点标记为噪声。它不直接要求输入聚类数量,但对邻域半径和最小邻居数敏感;当不同群组的密度差异很大时,效果可能不理想。

不同形状的聚类三个簇具有不同的几何特征:紧凑簇、拉伸簇,以及形状不规则且密度不均的簇。灰色点表示未分配到任何簇的噪声点。紧凑簇拉伸簇密度不均噪声形状和密度会影响聚类结果
该图展示了不同的数据结构。DBSCAN 可以识别形状不规则的簇,并将孤立观测标记为噪声;结果取决于参数和数据密度。

3. 没有正确标签时,如何评估聚类?

无监督学习通常没有真实标签可供直接比较,因此评估比分类任务中的 accuracy 更复杂。

注意:较高的 silhouette score 并不能证明聚类真实、有用或具有因果意义。它只衡量所选特征空间中的一种几何性质。

4. 降维与 PCA

降维(Dimensionality Reduction)是将数据从特征较多的空间转换到坐标较少的空间,同时尽量保留原始数据中选定属性的过程。

如果每个对象有 80 个指标,人很难直接观察整体结构。降维方法会构建紧凑表示,用于可视化、减少噪声或后续分析。

PCA(主成分分析,Principal Component Analysis)会创建新的坐标轴,即主成分;每个主成分都是原始特征的线性组合。第一主成分沿着数据方差最大的方向,后续主成分在与前面正交的条件下尽可能解释剩余方差。PCA 并不是挑选最重要的原始特征,也不保证保留罕见但重要的事件。

t-SNE 和 UMAP 常用于将复杂表示可视化到二维空间。地图上的距离和群组大小可能受参数和随机性的影响。不能自动把分离的岛状区域解释为客观类别。

降维示意多个原始特征被转换为数量更少的新成分。原始数据多个特征转换例如 PCA新坐标轴紧凑表示更少坐标压缩必然会丢失部分信息
降维简化了数据表示,但不会自动保留原始数据的所有特征。

5. 异常检测

异常检测(Anomaly Detection)是在所选数据表示中,寻找明显偏离预期行为或大多数观测的对象或事件。

例如:建筑能耗曲线异常、设备温度与振动的罕见组合,或用户行为中不常见的操作序列。异常不一定是错误或故障,而是需要进一步检查的信号。

Isolation Forest 通过随机划分尝试隔离稀有观测;Local Outlier Factor 将某个点的局部密度与邻居密度进行比较。如果物理边界或运行要求已经明确,简单阈值规则也可能有用。

需要区分数据离群值与有意义的罕见事件。异常数值可能来自传感器故障、运行模式变化、真实故障,也可能是此前未见但有效的新状态。不要自动删除异常;首先调查其来源。

6. 连续案例:研究建筑运行模式

假设我们拥有建筑逐小时记录,包括室外温度、能耗、湿度、人员数量和时段。目标是理解重复出现的运行模式,而不是预测预先标注的类别。

  1. 提出问题。 找出典型的小时或日曲线。
  2. 选择观测单位。 例如一栋建筑的一天。没有明确的聚合规则时,不要混合小时记录与日记录。
  3. 选择特征。 平均负荷、峰值负荷、夜间能耗、温度变化范围和运行小时比例。每个指标都需要明确单位与计算周期。
  4. 准备特征。 检查缺失值、重复记录、时区和尺度。对于基于距离的方法,尺度尤其重要。
  5. 比较方法。 先以 K-means 作为基础方法,再检查层次聚类或 DBSCAN 是否改变结论。
  6. 验证结果。 检查群组画像、稳定性、内部指标和领域解释。
  7. 谨慎表述结论。 “在这个数据集中发现了三种重复曲线”比“建筑只有三种类型”更准确。

实践任务

为同一个任务提出两套不同特征:(a) 按能耗规模对建筑分组;(b) 按每日负荷曲线形状分组。对每套特征说明观测单位、尺度处理方法和一种误读风险。解释为什么建筑相同,结果仍可能不同。

优秀答案标准:说明聚类依赖研究问题和数据表示,而不是宣布某一种结果是唯一正确的。

7. 局限与检查清单

请记住。 当目标答案不可用时,无监督学习可以帮助探索数据。它的价值不在于算法发现了真相,而在于提出一种可检验的结构,再将其与原始数据、研究问题和领域知识进行比较。

8. Python 实践:K-means

示例使用 scikit-learn 生成合成点。生成器也会返回教学标签,但我们将其丢弃:聚类算法只接收特征矩阵 X。

from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 生成合成特征;丢弃生成器提供的参考标签。
X, _ = make_blobs(
    n_samples=300,
    centers=3,
    cluster_std=1.2,
    random_state=42
)

X_scaled = StandardScaler().fit_transform(X)
model = KMeans(n_clusters=3, n_init=10, random_state=42)
cluster_ids = model.fit_predict(X_scaled)

# 评估几何分离程度,而非语义正确性。
score = silhouette_score(X_scaled, cluster_ids)
print("Silhouette score:", round(score, 3))
print("Cluster IDs:", sorted(set(cluster_ids)))

代码说明: make_blobs 生成点;StandardScaler 将特征调整到可比较尺度;KMeans 寻找三个群组;silhouette_score 衡量几何分离程度。簇编号只是技术标识:簇 0 并不比簇 1 更好或更重要。

运行环境: Python 3.9+ 和当前版本的 scikit-learn。使用 python -m pip install scikit-learn 安装。在真实项目中,只能在当前分析阶段允许使用的数据上拟合转换器。