没有标签的世界
前面几篇讲的分类器——SVM、决策树、k-NN——都需要标签:有人告诉模型"这个点是 A 类"。但现实中,标注数据是昂贵的:
- 给 100 万张图片标注要花几万美元。
- 绝大多数文本数据(网页、书籍、代码)天然没有分类标签。
- 用户行为数据(点击、浏览)虽然海量,但没有人告诉你"这个用户属于哪个群体"。
无监督学习就是在没有标签的情况下发现数据的结构。两个最经典的任务:
- 聚类——自动把数据分成几个「团」。不知道有几类,也不知道该叫什么名字,让算法自己找。
- 降维——把高维数据投影到低维,同时尽量保留信息。100 维的特征也许只有 3 维是真正有用的。
这两个任务的几何直觉惊人地相似:聚类是「给空间染色」(跟分类一样,只是颜色是自己发现的),降维是「换一个角度看数据」。
k-means:找 k 个中心
k-means 是最直接的聚类算法。给定 (你想分几组),重复两步直到收敛:
第一步(Assignment):把每个点划给离它最近的中心。 第二步(Update):把每个中心挪到它管辖的点的重心。
数学上,k-means 在最小化所有点到各自中心的距离之和:
其中 是点 被分配到的簇编号, 是那个簇的中心。每一步 都在下降,所以一定收敛。
点「下一步」看这个过程怎么跑:
收敛后,空间被切成 块 Voronoi 区域——跟 k-NN 的决策边界形状一模一样,只是这次中心不是数据点,而是自己找到的「代表」。
k-means 的三个关键性质:
- 初始化敏感——不同的起始中心可能收敛到不同的局部最优。k-means++ 通过聪明的初始化缓解这个问题。
- 只能找球形的团——因为用的是欧氏距离,椭圆形或弯曲形的簇它找不好。
- 必须预设 ——如果你不知道数据有几个团,这是个难题。
选 k 的困境
k-means 不会告诉你 应该是多少。常用的两个启发式:
肘部法(Elbow method)——画 对 的曲线。随着 增大, 单调下降,但在某个点之后下降变慢(曲线出现「肘」)。拐点就是一个合理的 。
轮廓系数(Silhouette)——对每个点算:「它离自己簇的平均距离」vs「它离最近别的簇的平均距离」。系数高意味着簇内紧、簇间疏。
两个方法都不完美——没有免费的午餐。在实际工程里(比如用户分群、embedding 聚类), 通常由业务需求决定而不是算法决定。
PCA:转一下坐标
主成分分析(PCA) 不是分类也不是聚类——它是换坐标。
回忆线性代数那篇的特征向量:一个对称矩阵的特征向量就是它「不被旋转」的方向。PCA 做的事就是找数据协方差矩阵的特征向量——也就是数据散布最广的方向。
具体步骤:
- 算数据的协方差矩阵 (假设已中心化)。
- 做特征值分解:。
- 特征值从大到小排列。最大特征值对应的特征向量 = 数据方差最大的方向 = 第一主成分(PC1)。
- 把数据投影到前 个主成分上:。
几何直觉:PCA 就是旋转坐标系,让第一个轴对准数据伸展最远的方向。然后你可以砍掉方差小的末几个轴——它们贡献的信息少,扔掉也不太影响。
切换下面的按钮,看 60 个点从 2D 投影到 PC1 方向:
投影后点只在一条线上——从 2 维降到了 1 维。损失的只是垂直于 PC1 方向的那点方差(窄轴方向的信息)。如果原始数据确实主要沿一个方向分布,这个损失微乎其微。
SVD 与降维
PCA 的计算核心是奇异值分解(SVD)。对任意矩阵 ,SVD 把它分解成三部分:
- 的列就是主成分方向(右奇异向量)。
- 的对角元素(奇异值)衡量每个方向上数据的「伸展程度」。
- 是数据在各主成分上的坐标。
截断 SVD——只保留最大的 个奇异值和对应的向量——就是 PCA 降维。
这是在所有秩- 矩阵里,对 的最优近似(Eckart–Young 定理)。「最优」的意思是 Frobenius 范数误差最小——没有任何其他 维投影能保留更多信息。
这个定理解释了为什么 PCA/SVD 在降维上如此有效:它不是「某种还不错的降维」,而是数学上证明的最优线性降维。