Part V · 第 18 章 无监督与自监督学习 · 18.1

聚类与 PCA

机器人记录下的数据大多没有标签:抓取位置、关节轨迹、点云、相机图像。无监督学习先问两个最朴素的问题:哪些数据点属于同一类(聚类),以及描述每个点真正需要几个数(降维)。本节在浏览器里实时运行 k-means(Lloyd 算法与 k-means++)、用 EM 训练高斯混合模型,把 PCA 看成“方差最大”与“重建误差最小”的同一件事,看清这些线性、团块状的方法在哪里失效,最后用 PCA 找出机器人手的“特征抓取”(eigengrasp)。

约 40 分钟 前置:1.12 奇异值分解 · 4.4 高斯分布 · 4.6 最大似然与 MAP 6 个交互

    1为什么机器人需要它

    前面几章的学习都有“标准答案”:16.1 节的回归和分类,每个输入都配着一个目标 \(y\)。可机器人每天产生的数据绝大多数没人标注。一个演示者在桌上做了 150 次抓取,日志里只有夹爪闭合时的位置,没人写下“这次抓的是杯子”;一只 15 个关节的灵巧手记录了几千个抓取姿态,没人告诉你哪些关节总是一起动;一段拾放演示是一条长长的时间序列,没人标出“这里开始抬起”。

    无监督学习从数据本身找结构。本节讲两类最基本、至今仍到处在用的工具:

    • 聚类:把数据分成 \(K\) 组,同组的点彼此相近。k-means 用“最近的中心”做硬划分;高斯混合模型(GMM)给每个点一个属于各组的概率,用 EM 算法训练,它建立在 4.4 节的多元高斯和 4.6 节的最大似然之上。
    • 主成分分析(PCA):找一个低维的线性子空间,让数据投影上去后损失最少。1.12 节已经用 SVD 算过点云的主方向和法向量;这里讲它的统计含义:为什么“方差最大”和“重建误差最小”是同一个问题,“解释方差”怎么读,以及该保留几个成分。

    它们在机器人里随处可见:把桌面点云分割成一个个物体,把视觉特征量化成“视觉单词”用于回环检测,把演示切成阶段,把动作空间离散成几个“模式”,把高维的手部姿态压缩成两三个协同量。它们的共同弱点同样重要:k-means 只认圆团,PCA 只认平面,数据一弯就失效。这正是 18.2 节自编码器要解决的问题。

    2直觉:插旗、站队、挪旗

    在桌面上插 \(K\) 面小旗(中心 \(\hl{mu}{\boldsymbol\mu_k}\))。然后反复做两件事:① 站队:每个数据点走到离它最近的旗子下面;② 挪旗:每面旗子挪到它队伍的平均位置(重心)。这就是 Lloyd 算法,人们口中的 k-means。它在降低一个量:每个点到自己旗子的距离平方之和

    $$ \hl{J}{J}=\sum_{n=1}^{N}\big\|\mathbf x_n-\boldsymbol\mu_{c(n)}\big\|^2 $$

    其中 \(c(n)\) 是点 \(\mathbf x_n\) 所在的组。站队这一步,在旗子不动时为每个点选了最近的旗,\(J\) 不会变大;挪旗这一步,在队伍不变时把旗子放到重心,而重心正是使队内距离平方和最小的点(第 5 节),\(J\) 也不会变大。\(J\) 只降不升,而把 \(N\) 个点分成 \(K\) 组的方式只有有限多种,所以算法一定会停。但它停下的地方只是“两步都改进不了”的地方,不一定是全局最好的分法。下图让你亲手体验这两点。

    FIG 1Lloyd 算法:一步一步地站队、挪旗
    每个点是演示者在 100 × 70 cm 桌面上闭合夹爪的位置(模拟数据,随机种子固定):“3 个物体”共 150 次抓取,“5 个物体”共 180 次。方块是中心 \(\boldsymbol\mu_k\),可以拖动;底色是离每个中心最近的区域,各组的色调依次为红、蓝、绿、琥珀、紫、青。按“① 站队”之前,点不带组的色调(画成坐标轴的颜色);之后染成所属中心的色调。“② 挪旗”时细箭头从旧中心指向新中心。右图是每半步之后的 \(J/N\)(cm²),绿色虚线是 30 次 k-means++ 重启中最好的 \(J/N\),记作 \(J^\star/N\)。
    试一试
    • 保持默认设置(3 个物体,\(K=3\)),交替按“① 站队”和“② 挪旗”,或直接按“运行”,直到收敛(一次站队后没有任何点换组)。默认起点要挪 8 次旗,\(J/N\) 从 582 降到 72.8 cm²,而且每半步都不升;注意中间那段几乎平坦的“停滞”。
    • 让 Lloyd 卡在坏的局部极小:按“角落起点”(所有中心挤在左上角)或者把所有中心拖到同一个角落,再运行到收敛。收敛后的 \(J\) 至少是 \(J^\star\) 的 1.5 倍(读数里的比值)。“角落起点”下有一面旗一个点都没分到:它成了“空簇”。
    核心洞见

    k-means 是坐标下降:未知数分两块,一块是每个点的组号(离散),一块是中心(连续),轮流固定一块、最优地解另一块。每一步都精确最优,所以 \(J\) 单调下降、有限步收敛;但整体问题是非凸的组合优化,坐标下降只保证停在一个“两块都不能单独改进”的点。起点决定结局。

    3动手:软聚类、初始化与选 K

    高斯混合模型与 EM

    k-means 用欧氏距离判断“最近”,等于默认每个组都是同样大小的圆团。真实的组常常不是:同一个长条形物体上的抓取点沿物体长轴散开;一个大托盘旁边放着一个小螺丝盒。高斯混合模型换一种说法:数据是这样产生的,先以概率 \(\hl{pi}{\pi_k}\) 选一个组 \(k\),再从这个组的高斯 \(\mathcal N(\boldsymbol\mu_k,\hl{Sigma}{\Sigma_k})\) 里抽一个点。每组有自己的位置、形状(协方差椭圆,4.4 节)和份额。

    训练它的 EM 算法和 Lloyd 长得几乎一样,只是“站队”变软了:E 步算每个点属于每组的后验概率,即责任 \(\hl{gamma}{\gamma_{nk}}\)(贝叶斯公式,4.2 节);M 步用这些责任作权重,重新估计每组的 \(\pi_k,\boldsymbol\mu_k,\Sigma_k\)(加权的最大似然,4.6 节)。每一轮 EM 都不会降低数据的对数似然(第 5 节证明)。

    FIG 2k-means 对 GMM:EM 实时训练
    三组模拟的抓取数据:“长条”是两个平行的长条形物体(各 110 次抓取),“大小悬殊”是一个散开的大托盘(200 次)旁边一个紧凑的小盒子(30 次),“3 个物体”同 FIG 1。GMM 模式下,每组画出马氏距离 1 和 2 的椭圆(4.4 节),旁边标出份额 \(\pi_k\);点的色调是责任最大的那一组,越不确定(最大责任越小)越透明。k-means 模式下底色是最近中心的区域。被分到“错误物体”的点(按最佳的一一对应把组和真实物体配对之后)画成空心圆圈。“一致率”是配对后分对的比例。右图是每轮之后的平均对数似然(GMM)或 \(J/N\)(k-means)。为防止某个高斯塌缩到单个点上,每个协方差都加了 0.001 cm² 的下限。悬停或点按某个点可以读出它的责任。
    • 选“长条”和 k-means(\(K=2\)),运行到收敛:k-means 把两个长条拦腰切开,一致率只有约 60%,并且换几个种子(“新种子”)都一样。这不是初始化不好:这样切开的 \(J\) 确实更小。
    • 切到 GMM(仍是“长条”),按“运行”:对数似然一路上升,两个椭圆拉长并转到长条的方向,大约 25 轮后收敛,一致率达到 95% 以上(默认种子是 100%)。再试“大小悬殊”:k-means 约 71%,GMM 约 99%,小盒子的份额 \(\pi\) 约 0.14。

    初始化与选 K

    FIG 1 已经看到:Lloyd 的结局取决于起点。最常见的起点有两种。随机起点(Forgy 法):随机挑 \(K\) 个数据点当初始中心,容易把两个中心放进同一团、另一团没有中心。k-means++(Arthur 与 Vassilvitskii,2007):第一个中心随机挑,之后每个新中心按“到已有中心的最近距离的平方” \(D(\mathbf x)^2\) 成比例地抽样,离现有中心远的点更容易被选中,于是中心自然散开。它在期望意义下保证结果不差于最优解的 \(O(\log K)\) 倍,实践中再配合多次重启取最好的一次。

    另一个问题是 \(K\) 本身。\(J^\star(K)\)(\(K\) 个组时能达到的最小 \(J\))随 \(K\) 单调下降,\(K=N\) 时为 0,所以不能拿 \(J\) 直接选 \(K\)。常用的经验法是“肘部”:画 \(J^\star(K)\) 对 \(K\),找下降突然变缓的那个拐点。对 GMM 可以用信息准则(第 5 节的 BIC)。下图是一个货架上的 8 个格子,每格 25 次抓取。

    FIG 3100 次重启:随机起点对 k-means++,以及肘部
    左:货架俯视图,8 个格子各 25 个点(模拟)。移动 K 滑块时显示该 K 下最好的解;按一次“100 次 …”后,显示这一批里最差的那次。右上:100 次运行收敛后的 \(J/J^\star\) 分布,红色是随机起点,蓝色是 k-means++;最左一格是“命中”(与 \(J^\star\) 相差不到 1%),\(J^\star\) 是 60 次 k-means++ 重启中最好的一次。右下:肘部曲线 \(J^\star(K)/N\),琥珀色点是当前 K。每次改变 K,两种方法的随机数都从同一个种子重新开始,所以“改 K 后的第一批”结果可以复现。
    • 看肘部曲线,把 K 设在“拐点”上(读数里的 \(J^\star(K)/J^\star(K-1)\) 从 0.5 左右突然跳到 0.9 以上的前一个 K)。它正好等于格子数。
    • 在 \(K=8\) 时两个按钮各按一次:改 K 后的第一批里,随机起点只有 21 次命中,平均 \(J/J^\star\) 约 2.2;k-means++ 有 60 次命中,平均约 1.5,而且平均只需约 3 次迭代(随机起点约 6 次)。即使用 k-means++,也有四成的运行没找到最优:所以要重启。
    值得注意

    (1) GMM 胜过 k-means,靠的是更丰富的模型(每组自己的协方差),不是更好的优化:FIG 2 里 k-means 把长条切开,是因为在它的目标 \(J\) 下这样切就是更好的。选错了模型,优化得再好也没用。 (2) GMM 也有局部极小,而且参数更多(2D 里每组 6 个:2 个均值、3 个协方差、1 个份额),收敛也更慢(“大小悬殊”要 60 多轮),所以实践中常先用 k-means 的结果给 EM 初始化。 (3) 在 FIG 3 的最差运行里,常见的毛病是“两个中心挤在一格,另有一个中心横跨两格”,正是 FIG 1 那种局部极小。

    4另一个视角:不是分组,而是压缩:PCA

    聚类用 \(K\) 个“原型”概括数据;降维换个角度,用更少的坐标描述每一个点。设想一台机械臂做了 120 次够取,每次记录肩关节角 \(q_1\) 和肘关节角 \(q_2\)。抬肩时人总是同时伸肘,两个角高度相关:点云是一根斜着的细长条。如果只允许用一个数描述每次够取,最好的办法是在这根长条上画一条直线 \(\hl{u}{\mathbf u}\)(单位向量),用点在这条线上的投影坐标 \(z=\mathbf u^\top(\mathbf x-\bar{\mathbf x})\) 代替原来的两个角。

    线该朝哪个方向?有两种说法。一种是让投影后的坐标方差最大,保留尽可能多的“变化”;另一种是让每个点到直线的距离平方和(重建误差,即图中的残差 \(\hl{res}{\mathbf r_n}\))最小。下图告诉你它们是同一个方向:对每个点,到均值的距离平方 = 投影长度平方 + 残差平方(勾股定理),左边与方向无关,所以投影方差最大时残差一定最小。这个方向就是协方差矩阵 \(S\) 最大特征值 \(\hl{lam}{\lambda_1}\) 的特征向量,第一主成分。

    FIG 4转动直线:方差最大 = 重建误差最小
    左:120 次够取的肩角 \(q_1\) 与肘角 \(q_2\)(度,模拟数据),蓝点是数据,琥珀色直线是方向 \(\mathbf u\)(拖动线上的圆形手柄转动它),琥珀小点是投影,红色短线是残差。中空的十字是直线经过的点:开启“中心化”时是均值 \(\bar{\mathbf x}\),关闭时是原点。勾选“显示主轴”会画出两条绿色虚线主轴。右:投影的均方长度随直线角度 \(\theta\) 的变化(中心化时就是投影方差 \(\mathbf u^\top S\mathbf u\)),虚线是总量(中心化时是 \(\operatorname{tr}S\),关闭时是 \(\|\mathbf x\|^2\) 的均值),琥珀点是当前角度;曲线和虚线之间的距离就是残差均方。
    • “显示主轴”保持关闭,拖动手柄,把直线转到与第一主成分相差 2° 以内(看右图曲线的最高点,读数会显示差多少度)。这时残差最小:投影保留了约 97.9% 的方差,单个角度描述一次够取几乎不丢信息。
    • 关闭“中心化”,再找过原点的最佳直线(拖动或按“对准最佳方向”,与最佳方向相差 2° 以内):它指向点云的均值(约 60°),而不是沿着点云的伸展方向(约 −44°),却号称“保留了”约 95%。忘记减均值时,第一主成分描述的是“数据离原点多远”。

    换到“各向同性”的点云:两个方向的方差差不多(约 110 对 88),右图的曲线几乎是平的,第一主成分只解释约 56%,换一个样本(“新样本”)主轴就会大幅转动。PCA 的方向只在特征值明显分开时才有意义。

    线性与团块的极限

    PCA 找的是平的子空间,k-means 找的是凸的团块(每组是一个 Voronoi 多边形)。数据一弯,两者都会出问题。下图第一组数据是夹爪沿圆碗边缘擦拭的路径(3/4 个圆):它本质上是一维的(一个角度就能描述每个点),但一条直线只能保留约 70% 的方差。一个补救办法是分段线性:先用 k-means 把数据切成 \(K\) 段,再在每段里各做一次一维 PCA,即局部 PCA,也就是概率模型里的“混合 PCA”的简化版。第二组数据是激光雷达在一根圆柱和外圈圆墙上的点:两组是同心圆环,k-means 怎么画直线边界也分不开它们,但若换一个特征,用点到圆心的半径 \(\|\mathbf x-\mathbf c\|\),问题立刻变成一维、可分。选对特征,线性方法就够了;核方法(核 PCA、谱聚类)和 18.2 节的自编码器,都是让机器自己学这种特征。

    FIG 5数据一弯:局部 PCA 与换特征
    “擦拭路径”:160 个点(cm,噪声 0.9 cm),每段的点染上该段的色调,琥珀色线段是每段的一维主轴(画到该段投影的范围),红色短线是残差。“相对误差”是残差平方和除以数据的总方差(\(N\) 乘以 \(\operatorname{tr}S\))。K = 1 就是普通 PCA。“同心圆环”:70 个柱面点和 150 个墙面点,用 K = 2 的 k-means(30 次 k-means++ 重启中最好的一次)分组,色调表示分到的组;十字是计算半径用的圆心 \(\mathbf c\)。
    • 在“擦拭路径”上逐步增大 K:K = 1 时相对误差约 30%,K = 2 约 3.2%;增大到相对误差低于 0.5% 为止(K = 4,约 0.43%)。再往上几乎不降:剩下的就是 0.9 cm 的测量噪声。
    • 切到“同心圆环”:用坐标 \((x,y)\) 聚类,一致率只有约 50%(k-means 把两环一起切成左右两半);把特征换成“半径”,一致率变成 100%。

    5再看数学

    k-means:目标与两步的最优性

    数据 \(\mathbf x_1,\dots,\mathbf x_N\in\R^D\)。把分组写成指示量 \(r_{nk}\in\{0,1\}\),\(\sum_k r_{nk}=1\)。目标函数是

    $$ \hl{J}{J}(r,\boldsymbol\mu)=\sum_{n=1}^{N}\sum_{k=1}^{K} r_{nk}\,\|\mathbf x_n-\hl{mu}{\boldsymbol\mu_k}\|^2 $$

    站队:固定 \(\boldsymbol\mu\),\(J\) 对每个 \(n\) 分开,各自取 \(r_{nk}=1\) 给距离最小的 \(k\),这显然是最优的。挪旗:固定 \(r\),\(J\) 是 \(\boldsymbol\mu_k\) 的凸二次函数,令梯度为零:

    $$ \frac{\partial J}{\partial\boldsymbol\mu_k}=-2\sum_n r_{nk}(\mathbf x_n-\boldsymbol\mu_k)=0\quad\Longrightarrow\quad \boldsymbol\mu_k=\frac{\sum_n r_{nk}\,\mathbf x_n}{\sum_n r_{nk}} $$

    即重心。另一种看法:对任意点 \(\mathbf m\),\(\sum_{n\in k}\|\mathbf x_n-\mathbf m\|^2=\sum_{n\in k}\|\mathbf x_n-\boldsymbol\mu_k\|^2+N_k\|\boldsymbol\mu_k-\mathbf m\|^2\),所以偏离重心只会多出一项。两步都精确最优,\(J\) 单调不增;分组方式至多 \(K^N\) 种,且一次真正的改变会严格降低 \(J\),所以有限步内收敛。若某组变空(FIG 1 的“角落起点”),重心无定义,本页让它留在原地;实际库里常把它重新放到离现有中心最远的点上。

    找全局最优的 k-means 划分在一般情况下是 NP 难的,所以只能靠好的起点和重启。k-means++ 的抽样规则是:已选中心集合为 \(\mathcal C\) 时,下一个中心取 \(\mathbf x_n\) 的概率为

    $$ P(\mathbf x_n)=\frac{D(\mathbf x_n)^2}{\sum_m D(\mathbf x_m)^2},\qquad D(\mathbf x)=\min_{\mathbf c\in\mathcal C}\|\mathbf x-\mathbf c\|,\qquad \mathbb E\big[J_0\big]\le 8(\ln K+2)\,J^\star $$

    其中 \(J_0\) 是抽样得到的初始中心本身的代价:右边的界对它就已经成立(Arthur 与 Vassilvitskii,2007),之后的 Lloyd 迭代只会让 \(J\) 更小。

    高斯混合与 EM

    $$ p_\theta(\mathbf x)=\sum_{k=1}^{K}\hl{pi}{\pi_k}\,\mathcal N(\mathbf x;\boldsymbol\mu_k,\hl{Sigma}{\Sigma_k}),\qquad \log p_\theta(\mathcal D)=\sum_{n=1}^{N}\log\sum_{k=1}^{K}\pi_k\,\mathcal N(\mathbf x_n;\boldsymbol\mu_k,\Sigma_k) $$

    对数里面有求和,导数为零的方程没有闭式解。EM 的做法是引入隐变量“这个点来自哪一组”。E 步:用当前参数算后验(责任)

    $$ \hl{gamma}{\gamma_{nk}}=\frac{\pi_k\,\mathcal N(\mathbf x_n;\boldsymbol\mu_k,\Sigma_k)}{\sum_j\pi_j\,\mathcal N(\mathbf x_n;\boldsymbol\mu_j,\Sigma_j)} $$

    M 步:把责任当作“每个点有 \(\gamma_{nk}\) 份属于第 \(k\) 组”,做加权的最大似然,记 \(N_k=\sum_n\gamma_{nk}\):

    $$ \pi_k=\frac{N_k}{N},\qquad \boldsymbol\mu_k=\frac1{N_k}\sum_n\gamma_{nk}\mathbf x_n,\qquad \Sigma_k=\frac1{N_k}\sum_n\gamma_{nk}(\mathbf x_n-\boldsymbol\mu_k)(\mathbf x_n-\boldsymbol\mu_k)^\top $$

    为什么似然不降:对任意满足 \(\sum_k q_{nk}=1\) 的权重 \(q_{nk}>0\),由于对数是凹函数(Jensen 不等式),

    $$ \log\sum_k\pi_k\mathcal N(\mathbf x_n;\boldsymbol\mu_k,\Sigma_k)=\log\sum_k q_{nk}\frac{\pi_k\mathcal N(\cdot)}{q_{nk}}\;\ge\;\sum_k q_{nk}\log\frac{\pi_k\mathcal N(\mathbf x_n;\boldsymbol\mu_k,\Sigma_k)}{q_{nk}} $$

    当 \(q_{nk}=\gamma_{nk}\) 时等号成立(E 步让下界在当前参数处贴住似然),M 步再对参数最大化这个下界(它对每组是可以闭式求解的加权高斯似然)。似然 ≥ 新下界 ≥ 旧下界 = 旧似然,所以每一轮都不降。这个下界在 19.1 节的 VAE 里会再次出现,那里叫 ELBO。与 k-means 的关系:令所有 \(\Sigma_k=\sigma^2I\)、\(\pi_k=1/K\) 固定,让 \(\sigma\to0\),责任变成 0 或 1(离最近中心的那组得 1),M 步只剩更新均值:EM 退化为 k-means。

    两个坑。一是奇异性:如果某个高斯的均值正好落在一个数据点上、方差趋于 0,该点的密度趋于无穷,似然无上界。FIG 2 给每个协方差加了 \(\varepsilon I\),\(\varepsilon=0.001\) cm²(这让 M 步不再是严格的极大化,但在本页数据上对数似然的下降不超过 \(10^{-7}\));更严格的做法是给协方差加先验做 MAP(4.6 节)。二是选 K:似然随 K 单调上升。贝叶斯信息准则 \(\mathrm{BIC}=-2\log p_{\hat\theta}(\mathcal D)+P\ln N\)(\(P\) 为自由参数个数:2D 中每组有 2 个均值和 3 个全协方差参数,共 5 个,再加 \(K-1\) 个份额)取最小,就在拟合与复杂度之间做了折中。

    PCA:方差最大与误差最小

    记均值 \(\bar{\mathbf x}=\frac1N\sum_n\mathbf x_n\),把中心化后的数据按行堆成 \(N\times D\) 矩阵 \(\tilde X\),样本协方差 \(S=\frac1N\tilde X^\top\tilde X\)(统计软件常用 \(\frac1{N-1}\),只差一个比例,方向不变)。沿单位向量 \(\mathbf u\) 的投影方差为 \(\mathbf u^\top S\mathbf u\)。在 \(\|\mathbf u\|=1\) 的约束下最大化它(拉格朗日乘子,6.7 节):

    $$ \nabla_{\mathbf u}\big[\hl{u}{\mathbf u}^\top S\mathbf u-\lambda(\mathbf u^\top\mathbf u-1)\big]=0\;\Longrightarrow\; S\mathbf u=\lambda\mathbf u,\qquad \mathbf u^\top S\mathbf u=\lambda $$

    所以驻点都是特征向量,投影方差就是特征值,最大值在 \(\hl{lam}{\lambda_1}\) 处(1.11 节:对称矩阵的特征向量正交,特征值为实数且这里非负)。误差的那一面:点 \(\tilde{\mathbf x}_n\) 在直线上的重建是 \(\mathbf u\mathbf u^\top\tilde{\mathbf x}_n\),

    $$ \frac1N\sum_n\|\hl{res}{\mathbf r_n}\|^2=\frac1N\sum_n\big\|\tilde{\mathbf x}_n-\mathbf u\mathbf u^\top\tilde{\mathbf x}_n\big\|^2=\underbrace{\frac1N\sum_n\|\tilde{\mathbf x}_n\|^2}_{\operatorname{tr}S}-\;\mathbf u^\top S\mathbf u $$

    这就是 FIG 4 的“勾股定理”:残差均方 = 总方差 − 投影方差。推广到 \(q\) 个成分:取 \(W_q=[\mathbf v_1,\dots,\mathbf v_q]\)(前 \(q\) 个特征向量),编码 \(\mathbf z=W_q^\top(\mathbf x-\bar{\mathbf x})\),解码 \(\hat{\mathbf x}=\bar{\mathbf x}+W_q\mathbf z\),均方重建误差恰为被丢掉的特征值之和,“解释方差比” \(\eta_q\) 为保留的那部分:

    $$ \frac1N\sum_n\|\mathbf x_n-\hat{\mathbf x}_n\|^2=\sum_{i>q}\lambda_i,\qquad \eta_q=\frac{\sum_{i\le q}\hl{lamk}{\lambda_i}}{\sum_{i=1}^{D}\lambda_i} $$

    与 SVD 的关系(1.12 节):\(\tilde X=U\Sigma V^\top\),则 \(S=\frac1N V\Sigma^2V^\top\),所以主方向就是 \(V\) 的列,\(\lambda_i=\sigma_i^2/N\);1.12 节的“\(\sigma_i/\sqrt N\) 是沿该方向的标准差”说的正是 \(\sqrt{\lambda_i}\)。数值上直接对 \(\tilde X\) 做 SVD 比先算 \(S\) 再求特征值更稳(不会把条件数平方),\(N\ll D\) 时(例如图像)也更省。最小重建误差这件事就是 1.12 节的 Eckart–Young 定理:秩 \(q\) 截断 SVD 是最好的秩 \(q\) 近似。

    标准化:PCA 依赖单位。若特征的单位不同(弧度与牛顿),应先把每一维除以自己的标准差,相当于对相关矩阵做 PCA。白化:用 \(\Lambda_q^{-1/2}W_q^\top(\mathbf x-\bar{\mathbf x})\) 得到协方差为单位阵的坐标。概率 PCA(Tipping 与 Bishop,1999)把 PCA 写成一个线性高斯隐变量模型 \(\mathbf x=W\mathbf z+\bar{\mathbf x}+\boldsymbol\epsilon\),\(\mathbf z\sim\mathcal N(0,I)\),\(\boldsymbol\epsilon\sim\mathcal N(0,\sigma^2I)\),其最大似然解张成同一个主子空间。把线性的编码、解码换成神经网络,就是 18.2 节的自编码器;再把隐变量当成概率分布,就是 19.1 节的 VAE。

    三者是一家

    k-means 用 \(K\) 个点(零维)近似数据,PCA 用一个 \(q\) 维平面,局部 PCA 用 \(K\) 个 \(q\) 维小平面;GMM 和概率 PCA 是前两者的概率版本。它们都最小化某种平方重建误差(或最大化高斯似然),也都只看二阶统计量(均值与协方差),这既是它们简单可靠的原因,也是它们看不见弯曲结构的原因。

    6机器人中的它:灵巧手的特征抓取

    9.3 节提到过“协同”:人手的抓取姿态高度相关,少数几个主成分就能解释大部分方差(Santello、Flanders 与 Soechting,1998)。Ciocarlie 与 Allen(2009)把这件事用到机器人上:在几个主成分张成的“特征抓取”(eigengrasp)空间里搜索抓取,而不是在全部关节空间里搜索,让多指灵巧手的抓取规划快得多。下图用一只示意的 15 关节手(5 根手指,每根 3 个屈曲角)演示这个流程。数据是模拟的:80 个抓取姿态由三种“协同”(整手握拳、拇指与食指捏合、尺侧手指与桡侧手指的反向运动)随机组合再加 3° 的独立噪声生成,PCA 并不知道这一点,它要从 80 × 15 的数据里自己找出来。

    FIG 6特征抓取:15 个关节,2 到 3 个旋钮
    左:5 根手指的侧视图并排画出(T 拇指、I 食指、M 中指、R 无名指、L 小指),每根手指从底部的掌根出发,0° 为伸直,屈曲向右弯。“协同探索”模式下,琥珀色手是 \(\bar{\mathbf q}+\sum_i z_i\sqrt{\lambda_i}\,\mathbf v_i\),三个滑块 \(z_i\) 以各成分的标准差为单位。“重建抓取”模式下,紫色虚线是数据里的第 n 个抓取,琥珀色是只用前 q 个成分的重建。右:每个成分的解释方差(蓝色柱)和累计值(琥珀色折线),绿色虚线是 90%。
    • “协同探索”模式下把 \(z_1\) 推到 +1.5 以上,\(z_2,z_3\) 保持在 ±0.5 以内:五根手指一起握拢(拇指动得最少),这一个数同时驱动 15 个关节。再单独动 \(z_2\),看拇指和食指如何与无名指、小指反向运动。
    • 切到“重建抓取”,增大 q,直到全部 80 个抓取的平均重建误差(RMS)低于 3°:需要 q = 3(约 2.7°,此时累计解释方差约 98.4%)。q = 1 时约 11.2°,q = 2 时约 4.8°;q 再大,每多一个成分只再降约 0.2°(q = 4 时 2.5°),因为剩下的主要是 3° 的独立噪声,均匀摊在其余各个方向上,再加成分只是在拟合噪声。

    第一个成分解释约 74%,前两个约 95%,前三个约 98.4%,之后每个成分只剩约 0.2%:碎石图(scree plot)在第 3 个成分之后变平,这就是“该保留几个”的读法。注意 PCA 找到的方向只是张成同一个子空间,未必和生成数据的三种协同一一对应:主成分彼此正交,而我们设计的三种协同并不正交,所以 \(\mathbf v_1\) 是“握拳”混了一点其他成分(例如拇指几乎不参与)。

    真实系统里

    点云分割:桌面场景常先用 RANSAC(11.5 节)拟合并去掉桌面,再对剩下的点做欧氏聚类,把彼此距离小于阈值的点连成一个物体(PCL 里的 EuclideanClusterExtraction),或用 DBSCAN 这类基于密度的聚类:它们不需要预先给 K,也不要求团块是圆的。每个点的法向量来自邻域的局部 PCA(1.12 节、12.1 节)。 视觉词袋与回环检测:ORB-SLAM 的回环检测(15.2 节)用 DBoW2 词袋库,其“视觉单词”是对大量特征描述子做层次化 k-means 式聚类得到的树(思路来自 Nistér 与 Stewénius 2006 的词汇树);一幅图像变成单词的直方图,就能快速检索相似的历史帧。 演示学习:Calinon 等(2007)用 GMM 拟合多次演示中的(时间,位置)数据,再用高斯混合回归(GMR)生成平滑的轨迹;把演示切成“够取、抓取、抬起”等阶段,也常从对每个时刻的特征(速度、夹爪开合、高度)做聚类开始,实际系统再加上隐马尔可夫模型之类的时间模型,避免标签逐帧乱跳。 动作的模式:Behavior Transformer(Shafiullah 等,NeurIPS 2022)先用 k-means 把演示里的连续动作聚成 K 个中心,策略预测“哪个中心”(分类)再加一个连续的偏移量,从而能表示多峰的动作分布;这与 17.5 节的动作 token 化、22.2 节的多峰策略直接相关。 手:除了 Ciocarlie 与 Allen 的特征抓取规划,“协同”的思想也启发了用少数电机驱动多关节的欠驱动手(9.3 节)。

    7常见误区

    误区 1:不管单位就直接算距离

    k-means 和 PCA 都建立在欧氏距离和方差上,而它们完全取决于单位。把关节角(弧度,变化约 0.3)和夹爪力(牛顿,变化约 20)放进同一个向量,力的方差是角度的四千多倍,聚类和主成分几乎只看力。先标准化(每维减均值、除以标准差),或者有意识地选择有物理意义的权重。反过来,若各维单位相同且大小本身有意义(例如都是关节角、都是像素),标准化反而会放大噪声维度。

    误区 2:以为 k-means 能找到任何形状的组

    k-means 的每个组是一个凸的 Voronoi 区域,它偏爱大小相近的圆团。长条、大小悬殊、环形的组都会被切错(FIG 2、FIG 5),而且这不是优化失败,是目标函数本身就偏爱错的答案。按数据形状选方法:椭圆形用 GMM,任意形状且密度均匀用 DBSCAN 一类的密度方法,弯曲流形用谱聚类或先学特征。

    误区 3:只跑一次,或者用 J 选 K

    一次 Lloyd 的结果取决于起点:FIG 3 里即便用 k-means++,也有四成的运行停在局部极小。总是用 k-means++ 并重启多次(scikit-learn 的 KMeans 就有 n_init 参数),取 \(J\) 最小的那次。但不要用 \(J\) 比较不同的 K:K 越大 \(J\) 一定越小。用肘部、BIC、轮廓系数,或者最好是下游任务的效果来选。

    误区 4:GMM 的塌缩与过多参数

    最大似然下,一个高斯可以缩到一个点上让似然无穷大(第 5 节),在重复的数据点(例如机器人静止时的多帧相同读数)上特别容易发生。给协方差加下限或先验,必要时用对角协方差或所有组共享协方差。\(D\) 维全协方差每组有 \(D(D+1)/2\) 个参数,维数一高,数据量很快不够,常先用 PCA 降维再拟合 GMM。

    误区 5:误读主成分

    (a) 忘记中心化,第一主成分会指向均值(FIG 4)。 (b) 特征向量的符号和顺序是任意的:\(-\mathbf v\) 同样是特征向量,特征值相近时顺序和方向都不稳定(FIG 4 的“各向同性”),不同数据集算出的主成分不能直接逐个对比。 (c) 方差大不等于重要:对任务关键的那个方向(例如决定抓取成败的手指微调)可能方差很小,被 PCA 当噪声扔掉。 (d) 角度数据要注意周期性:\(179^\circ\) 和 \(-179^\circ\) 只差 2°,却被当成相差 358°,应先展开或用 \((\cos q,\sin q)\)。 (e) 数据弯曲时,解释方差比会低估真实的低维结构(FIG 5 里一维的路径只有 70%)。

    8小练习

    1. 关于 Lloyd 算法(k-means),下列哪一项正确?
    两步各自精确最优:站队给每个点最近的中心,挪旗把中心放到重心(使队内距离平方和最小),所以 J 单调不增,选项 A 错。分组方式有限,且每次真正的改变严格降低 J,所以有限步停止。但这只是坐标下降的不动点:FIG 1 的“角落起点”停在 J 约为最优 4 倍的地方,所以选项 B 和 D 都错,选项 C 正确。
    2. 一组二维数据的协方差矩阵特征值为 9 和 1。只保留第一主成分时,解释方差比和均方重建误差分别是多少?
    解释方差比 \(=\lambda_1/(\lambda_1+\lambda_2)=9/10=90\%\),按方差而不是标准差算(选项 C 错)。均方重建误差等于被丢掉的特征值之和 \(\sum_{i>q}\lambda_i=\lambda_2=1\)(选项 B 把保留和丢弃弄反了)。选项 D 的 3 是被保留的第一成分的标准差 \(\sqrt{\lambda_1}\),与误差无关。所以是选项 A。
    3. 一个 GMM 的所有组都固定为 \(\Sigma_k=\sigma^2I\)、\(\pi_k=1/K\),只学均值。让 \(\sigma\to0\),EM 变成什么?
    \(\gamma_{nk}\propto\exp(-\|\mathbf x_n-\boldsymbol\mu_k\|^2/2\sigma^2)\)。\(\sigma\to0\) 时,距离最近的那一项比其他项大得无法比较,归一化后它趋于 1、其余趋于 0:这就是 k-means 的硬站队,均值更新就是重心。责任相等(选项 B)是 \(\sigma\to\infty\) 的极限。这里方差是固定的而不是学出来的,所以不会出现塌缩导致的发散(选项 C)。所以是选项 D。
    4. 机器人记录二维特征:腕关节角(弧度,标准差约 0.3)和夹爪力(牛顿,标准差约 20),两者弱相关。不做标准化直接 PCA,第一主成分大致指向哪里?
    PCA 只看协方差矩阵的数值。力那一维的方差约 \(20^2=400\),角度约 \(0.3^2=0.09\),弱相关时最大特征向量几乎就是力轴。PCA 照样能算(选项 D 错),只是结果被单位左右;“重要”与否 PCA 并不知道(选项 C 错)。若把力换算成千牛,结论就会反过来:这正是要先标准化的原因(误区 1)。所以是选项 B。
    5. 二维数据均匀分布在半径为 \(R\) 的圆周上(例如转台边缘一个标记点的轨迹)。PCA 的结果是?
    \(\mathbf x=R(\cos t,\sin t)\),\(t\) 均匀分布,则 \(\mathbb E[x^2]=\mathbb E[y^2]=R^2/2\),\(\mathbb E[xy]=0\),协方差是 \(\tfrac{R^2}{2}I\):任何方向都是主方向,每个方向只解释一半。PCA 只看二阶统计量,看不出“一维但弯曲”的结构,这正是 FIG 5 和 18.2 节自编码器的出发点。所以是选项 C。

    9延伸阅读

    • C. M. Bishop, Pattern Recognition and Machine Learning, Springer, 2006, Ch. 9 and 12 — k-means、GMM 与 EM,PCA 与概率 PCA 的标准教材讲法
    • S. P. Lloyd, Least Squares Quantization in PCM, IEEE Transactions on Information Theory, 1982 (Bell Labs memo of 1957) — “站队、挪旗”算法的出处
    • D. Arthur & S. Vassilvitskii, k-means++: The Advantages of Careful Seeding, SODA 2007 — \(D^2\) 抽样与 \(O(\log K)\) 的保证
    • A. P. Dempster, N. M. Laird & D. B. Rubin, Maximum Likelihood from Incomplete Data via the EM Algorithm, Journal of the Royal Statistical Society B, 1977 — EM 算法的经典论文
    • K. Pearson, On Lines and Planes of Closest Fit to Systems of Points in Space, Philosophical Magazine, 1901; H. Hotelling, Analysis of a Complex of Statistical Variables into Principal Components, Journal of Educational Psychology, 1933 — PCA 的两个源头:最小误差与最大方差
    • M. E. Tipping & C. M. Bishop, Probabilistic Principal Component Analysis, Journal of the Royal Statistical Society B, 1999 — PCA 作为线性高斯隐变量模型
    • B. Schölkopf, A. Smola & K.-R. Müller, Nonlinear Component Analysis as a Kernel Eigenvalue Problem, Neural Computation, 1998 — 核 PCA
    • M. Santello, M. Flanders & J. F. Soechting, Postural Hand Synergies for Tool Use, Journal of Neuroscience, 1998 — 人手姿态的低维协同
    • M. T. Ciocarlie & P. K. Allen, Hand Posture Subspaces for Dexterous Robotic Grasping, International Journal of Robotics Research, 2009 — 在特征抓取空间里规划机器人抓取
    • S. Calinon, F. Guenter & A. Billard, On Learning, Representing, and Generalizing a Task in a Humanoid Robot, IEEE Transactions on Systems, Man, and Cybernetics B, 2007 — 用 GMM/GMR 表示演示
    • N. M. Shafiullah, Z. J. Cui, A. Altanzaya & L. Pinto, Behavior Transformers: Cloning k Modes with One Stone, NeurIPS 2022 — 用 k-means 的动作中心加偏移表示多峰动作