无监督学习
在没有人工标签的数据中发现结构、分组或低维表示。
前置知识
通俗直觉
有些数据没有可直接使用的目标标签,例如用户行为向量、文档集合或传感器记录。仍然可以研究样本之间的结构、低维表示或异常模式,但不能直接使用监督学习中的“答案是否预测正确”作为唯一标准。
无监督方法没有免除评价需求,只是评价证据通常更难设计。得到几个分组后,还要检查它们是否稳定、可解释,以及是否有助于后续任务。
无监督学习主要利用输入数据本身的结构,而不以每条样本的人工目标标签作为训练信号。聚类、降维与部分密度/异常检测方法属于常见任务。
聚类编号只是算法对分组的命名,不会自动成为业务类别。降维后的轴也通常是数学组合,需要解释其与原始特征的关系。
把一堆物品按外形和材质自然分堆,并没有预先告诉算法哪一堆必须叫什么。同一批物品按重量或颜色描述,可能得到不同分组,所以结果依赖表示与距离。
四个点怎样分成两组
构造点 (1,1)、(1,2)、(8,8)、(9,8),初始中心取 (1,1) 和 (8,8)。最近中心分配把前两点放在一组、后两点放在另一组;更新后的中心是 (1,1.5) 与 (8.5,8)。
这说明的是几何分组过程。把两组编号交换,几何结果没有改变;若把第二个特征乘以 100,再不调整尺度,距离含义却会发生实质变化。
核心原理
输入特征与尺度决定“相似”的含义。一个数值范围巨大的特征可能主导欧氏距离,因此预处理属于方法本身,而不是可忽略的前置步骤。
K-Means 交替做两件事:把样本分给最近中心,再把每个中心更新为所属样本的均值。给定簇数和目标,迭代寻找一个局部解,并不保证揭示真实类别。
簇数、初始化和距离假设会改变结果。对任意形状的簇、异常点或密度差异很大的数据,K-Means 未必适合;应按问题结构比较其他方法。
评价可以结合重采样稳定性、轮廓系数、独立数据、领域解释或下游效果。若后来取得真实标签,可以做外部评价,但不能反过来把反复挑选后的最佳标签匹配当成未使用标签的独立发现。
数学公式
目标是让每个样本靠近它所属簇的中心 μ。
工作流程
- 选择表示和相似度
- 初始化簇中心
- 分配样本到最近中心
- 更新中心直到稳定
代码示例
NumPy
example.pyimport numpy as np
X = np.array([[1,1], [1,2], [8,8], [9,8]])
centers = np.array([[1,1], [8,8]], dtype=float)
for _ in range(5):
labels = ((X[:, None] - centers) ** 2).sum(2).argmin(1)
centers = np.array([X[labels == k].mean(0) for k in range(2)])
print(labels, centers)- 广播计算样本到所有中心的距离
- 按标签重新计算均值
代码手写了 K-Means 的两步迭代。真实任务还需处理初始化、空簇与簇数选择。
本机核对输出
example.py[0 0 1 1] [[1. 1.5]
[8.5 8. ]]应用场景
- 用户分群
- 异常检测
- 降维可视化
常见误区
- 簇不一定对应真实类别
- 距离尺度会改变结果