经典 PCA 是线性变换,重构数据矩阵是原矩阵的投影变换,当数据点云分布呈现明显的非线性时,线性PCA不能很好压缩维度,达不到提取主成分的效果。例如三维空间中,点云是一条曲线分布,曲线不位于任意平面内,则对点云进行投影变换只能变换到三维空间,所以线性PCA的主成分还是3个。但曲线可以看作只有一维,“沿曲线切线方向”的维度,这就需要通过非线性变换,获得该主成分。
假设数据矩阵为 A A A ,每列为一个样本点 a i \mathbf{a}_{i} ai ,对每个样本进行非线性变换,变换函数为 Φ \Phi Φ ,注意不是线性变换,即变换函数 Φ \Phi Φ 不是矩阵。令变换后的样本为 b i = Φ ( a i ) \mathbf{b}_{i} = \Phi(\mathbf{a}_{i}) bi=Φ(ai) ,数据矩阵为 B B B ,则 B = Φ ( A ) B = \Phi(A) B=Φ(A) 。我们对数据矩阵 B B B 进行线性 PCA,希望获得对数据矩阵 A A A 非线性变换能力。
数据矩阵 B B B 线性PCA变换为: B B T u = λ u BB^T\mathbf{u} = \lambda \mathbf{u} BBTu=λu ,其中 λ ≥ 0 \lambda \ge 0 λ≥0 是对称半正定矩阵 B B T BB^T BBT 特征值, u \mathbf{u} u 是对应特征向量,最大前 k k k 个特征值对应的特征向量即为主方向。如果我们知道非线性变换函数 Φ \Phi Φ 的具体函数形式,则可以得到特征向量,就完美解决了非线性PCA。很可惜,对于具体问题,很难或者几乎不可能得到 Φ \Phi Φ 的具体函数形式,所以需要另辟蹊径,这时神奇的核技巧发挥作用。具体如下:
B B T u = λ u BB^T\mathbf{u} = \lambda \mathbf{u} BBTu=λu 两边左乘 B T B^T BT 得
B T B B T u = λ B T u B^TBB^T\mathbf{u} = \lambda B^T\mathbf{u} BTBBTu=λBTu
令 K = B T B K=B^TB K=BTB,单位向量 p = κ B T u \mathbf{p} = \kappa B^T\mathbf{u} p=κBTu,则 K p = λ p K\mathbf{p} =\lambda \mathbf{p} Kp=λp,所以 λ ≥ 0 \lambda \ge 0 λ≥0 是对称半正定矩阵 K K K 特征值, p \mathbf{p} p 是对应特征向量。注意 B B T , B T B BB^T,B^TB BBT,BTB 有相同的特征值,但特征向量不同。假设我们通过核技巧,能计算出矩阵 K K K ,则我们就能得到 p 、 λ \mathbf{p}、\lambda p、λ 。由于 p \mathbf{p} p 是单位向量,则 1 = p T p = κ 2 u T B B T u = κ 2 u T λ u = κ 2 λ 1 = \mathbf{p}^T\mathbf{p} = \kappa^2 \mathbf{u}^TBB^T\mathbf{u} = \kappa^2 \mathbf{u}^T\lambda \mathbf{u} = \kappa^2\lambda 1=pTp=κ2uTBBTu=κ2uTλu=κ2λ,所以 κ = 1 / λ \kappa =1/ \sqrt{\lambda} κ=1/λ 。
现在计算任意样本 x \mathbf{x} x 的主成分即在特征向量 u \mathbf{u} u 上的投影,根据 B B T u = λ u BB^T\mathbf{u} = \lambda \mathbf{u} BBTu=λu 得 u = 1 / λ B B T u \mathbf{u} = 1/ \lambda BB^T\mathbf{u} u=1/λBBTu;因为 p = κ B T u \mathbf{p} = \kappa B^T\mathbf{u} p=κBTu 得 B T u = p / κ B^T\mathbf{u} = \mathbf{p}/ \kappa BTu=p/κ 。
y i u = x T u = x T 1 / λ B B T u = 1 / λ x T B B T u = 1 / λ x T B p / κ = 1 λ ( x T B ) p y^u_i = \mathbf{x}^T\mathbf{u} = \mathbf{x}^T 1/\lambda BB^T\mathbf{u} \\ = 1/ \lambda \mathbf{x}^TBB^T\mathbf{u} \\ = 1/ \lambda \mathbf{x}^TB \mathbf{p}/\kappa \\ = \frac{1}{\sqrt{\lambda}} (\mathbf{x}^TB) \mathbf{p} yiu=xTu=xT1/λBBTu=1/λxTBBTu=1/λxTBp/κ=λ1(xTB)p
则整个样本在特征向量 u \mathbf{u} u 上的主成分为
y u = 1 λ B T B p = 1 λ K p = 1 λ λ p = λ p \mathbf{y}^u = \frac{1}{\sqrt{\lambda}} B^TB \mathbf{p} \\ = \frac{1}{\sqrt{\lambda}} K \mathbf{p} \\ = \frac{1}{\sqrt{\lambda}} \lambda \mathbf{p} \\ = \sqrt{\lambda}\mathbf{p} yu=λ1BTBp=λ1Kp=λ1λp=λp
所以现在剩下的核心问题是如何计算矩阵 K = B T B K=B^TB K=BTB ,根据矩阵四种乘法方式,得到矩阵 K K K 任意位置的元素为
K i j = b i T b j = Φ T ( a i ) Φ ( a j ) K_{ij} = \mathbf{b}^T_{i}\mathbf{b}_{j} \\ = \Phi^T(\mathbf{a}_{i})\Phi(\mathbf{a}_{j}) Kij=biTbj=ΦT(ai)Φ(aj)
可见其为原向量变换后的内积,由于不知道变换函数 Φ \Phi Φ ,所以没有办法知道 K i j K_{ij} Kij ,又陷入困局。借助神奇的核函数可以解决此困局,令
K i j = Φ T ( a i ) Φ ( a j ) = k ( a i , a j ) K_{ij} = \Phi^T(\mathbf{a}_{i})\Phi(\mathbf{a}_{j}) \\ = k(\mathbf{a}_{i},\mathbf{a}_{j}) Kij=ΦT(ai)Φ(aj)=k(ai,aj)
k ( a i , a j ) k(\mathbf{a}_{i},\mathbf{a}_{j}) k(ai,aj) 称为核函数,只要知道核函数的表达式,就可以绕过变换函数 Φ \Phi Φ ,得到 K i j K_{ij} Kij ,终于解决了问题。
核函数应该满足什么条件呢?由于需要 K p = λ p K\mathbf{p} =\lambda \mathbf{p} Kp=λp, λ ≥ 0 \lambda \ge 0 λ≥0 成立,即要求 K K K 是半正定矩阵。所以只要满足 K K K 是半正定矩阵的函数都能作为核函数,故有无穷多核函数。
最常用的核函数是高斯核,也称径向基核函数: k ( a i , a j ) = exp ( − ∥ a i − a j ∥ 2 2 σ 2 ) k(\mathbf{a}_{i},\mathbf{a}_{j}) = \exp(-\frac{\|\mathbf{a}_{i}-\mathbf{a}_{j}\|^2}{2\sigma^2}) k(ai,aj)=exp(−2σ2∥ai−aj∥2), σ > 0 \sigma > 0 σ>0 为高斯核的宽度,其次是多项式核: k ( a i , a j ) = ( a + b a i T a j ) d k(\mathbf{a}_{i},\mathbf{a}_{j}) = (a + b\mathbf{a}^T_{i}\mathbf{a}_{j})^d k(ai,aj)=(a+baiTaj)d, d ≥ 1 , a ≥ 0 , b > 0 d \ge 1,a \ge 0, b > 0 d≥1,a≥0,b>0 , d d d 是多项式的次数。
总结核PCA方法为:
1、根据核函数,计算核数据矩阵 K = B T B , K i j = k ( a i , a j ) K=B^TB, K_{ij} = k(\mathbf{a}_{i},\mathbf{a}_{j}) K=BTB,Kij=k(ai,aj),注意 K K K 必须是半正定矩阵;
2、矩阵 K K K 进行特征值分解 K p = λ p K\mathbf{p} = \lambda \mathbf{p} Kp=λp ,得到一系列大于零的特征值(从大到小顺序排列) λ 1 , ⋯ , λ r \lambda_1,\cdots,\lambda_r λ1,⋯,λr 及对应特征向量 p 1 , ⋯ , p r \mathbf{p}_1,\cdots,\mathbf{p}_r p1,⋯,pr ,根据能量法则选择前 k k k 个最大主方向 p i \mathbf{p}_i pi;
3、所有样本在对应主方向 p i \mathbf{p}_i pi 上的分量: y i = λ i p i \mathbf{y}_i = \sqrt{\lambda}_i\mathbf{p}_i yi=λipi 。
细心的读者可能会发现,对矩阵 K K K 进行特征值分解需要矩阵 B B B 是中心化的,即每个变换后向量 b i \mathbf{b}_{i} bi 要减去平均向量 b ˉ i \mathbf{\bar b}_{i} bˉi 。即使原始向量 a i \mathbf{a}_{i} ai 是中心化的,但由于非线性变换,也不能保证 b i \mathbf{b}_{i} bi 是中心化的。对其中心化,读者可自行推导得到: K ˉ = K − 1 n K − K 1 n + 1 n K 1 n \bar K = K - \mathbf{1}_n K - K \mathbf{1}_n + \mathbf{1}_n K \mathbf{1}_n Kˉ=K−1nK−K1n+1nK1n ,其中矩阵 1 n \mathbf{1}_n 1n 尺寸为 n × n n \times n n×n ,元素值均为 1 / n 1/n 1/n , n n n 是样本数量。核PCA方法相应需要修改的地方是第二步,矩阵 K K K 进行特征值分解变为矩阵 K ˉ \bar K Kˉ 进行特征值分解,其它不变。
核PCA方法优点是,如同线性PCA,越大特征值对应的主成分越重要,能对非线性的点云进行降维。缺点是,核数据矩阵 K K K 的维度为 n × n n \times n n×n, n n n 是样本数量,所以当样本数量很多时,对其进行特征值分解比较困难,故不能适应大数据。计算样本在主方向上的分量的计算量与样本数量成正比,故样本数量很多时,计算效率比较低,特征向量 p i \mathbf{p}_i pi 尺寸为 n n n ,故样本数量很多时,存储量大。
要对非线性点云的主方向提取获得好效果,样本在样本空间中必须采样足够密,以致采样到的点云能近似表达点云构成的完整高维曲面形状。如果密度不够,则曲面会存在很多“大洞”,这些“大洞”处的样本性质是不可能由大洞附近样本推断出来。由于点云是曲面,“大洞”处点云性质可能与其最接近处的点云差别很大。为什么不采集足够密的样本呢,现在不是大数据时代吗?很可惜,这会遭遇“维数灾难”!假设样本空间维度为 m m m ,样本分布在单位立方体内,每维假设均匀等间隔采样,间隔为 d d d ,则总样本数是 ( 1 d ) m (\frac{1}{d})^m (d1)m ,当 m m m 很大时,比如最常见图像,语言,语音等,其维度假设最小在 100 左右,实际上会远大于100,当 1 d = 1000 \frac{1}{d}=1000 d1=1000 时,需要 1 0 300 10^{300} 10300 样本数,宇宙基本粒子总数才 1 0 80 10^{80} 1080 个!实际上任何机器学习算法,只要涉及非线性,都需要密采样,都会遭遇“维数灾难”问题,只是有的算法比较聪明,能更好地根据附近点云预测大洞处点云,此时我们称算法的泛化性能更好,所谓泛化性能就是算法预测大洞处点云的能力,或者说举一反三的能力。泛化性能好的算法可以降低采样密度。目前对于图像来说,卷积网络是最好的算法,语言文字是 Transformer 网络,其它的不好说。
核PCA方法中核矩阵 K K K 仅利用了样本的核函数信息,丢失了很多其它信息,故其表达样本的能力有限,泛化性能不强,需要密采样才能获得好效果,但密采样会有巨量样本,核PCA方法不能处理巨量样本,故核PCA方法使用受限。只有点云曲面足够简单,如比较平滑接近超平面,则“大洞”处的样本性质很容易由大洞附近样本推断出来,不需要密采样,样本数据少,就能获得好效果。即使点云曲面足够简单,核PCA方法理论上还会遭遇一个最大困难,对于某个具体问题,如何选择最优核函数没有指导方法,是高斯核函数更好,还是多项式更好不清楚,或者其它核函数,每种核函数的最优参数是多少也不清楚,需要不断地试错,来得到较好的结果。但是核PCA是无监督算法,本身是无法判断降维效果好坏的,需要结合分类或回归问题来判断,这限制了核PCA应用范围。鄙人认为,目前任何机器学习算法只要涉及非线性,理论上都找不到最优参数,需要不断调参,因为非线性所对应点云的曲面形状可任意,每种曲面理论上都存在最优参数,不同曲面对应的最优参数不同,目前数学还没有很好的工具对高维点云进行非线性表达即表达不了任意曲面,所以也就在理论上找不到最优参数。所以大家不要嘲笑深度学习是调参术,不调参不行啊!试问哪个机器学习算法不需调参,只是参数多少而已,但参数过少的算法,效果差强人意。连最简单(很少非线性)的最小二乘法的正则化参数都难以找到解析最优值。
PCA的数据矩阵为 A A A ,核PCA的数据矩阵为 B B B ,但由于不知道具体的非线性变换 Φ \Phi Φ ,可以认为数据矩阵为核矩阵 K K K ,核矩阵共有 n n n 列,故每列可以看作样本非线性变换后的样本,变换后样本维度为 n n n 维。样本 a i \mathbf{a}_i ai 变换后样本 b i \mathbf{b}_i bi 在第 j j j 维分量为 k ( a i , a j ) k(\mathbf{a}_i,\mathbf{a}_j) k(ai,aj) 是核函数值,所以样本属性完全由核函数决定。采用高斯核函数时, k ( a i , a j ) = exp ( − ∥ a i − a j ∥ 2 2 σ 2 ) k(\mathbf{a}_{i},\mathbf{a}_{j}) = \exp(-\frac{\|\mathbf{a}_{i}-\mathbf{a}_{j}\|^2}{2\sigma^2}) k(ai,aj)=exp(−2σ2∥ai−aj∥2),当样本在原始空间中欧式距离近时,核值大,距离远时,核值小。根据奇异值能量守恒定律,可以认为矩阵元素越大对奇异值贡献度越大,所以欧式距离近的样本 a j \mathbf{a}_{j} aj 对样本 a i \mathbf{a}_{i} ai 影响更大,高斯核函数体现远亲不如近邻原则。参数 σ \sigma σ 度量了样本有效作用距离,为了看清楚其影响,我们执其两端。假设 σ \sigma σ 趋近 0 0 0 ,则只要距离 ∥ a i − a j ∥ \|\mathbf{a}_{i}-\mathbf{a}_{j}\| ∥ai−aj∥ 大于 0 ,则核值为 0,只有距离等于 0 时核值为 1。所以此时核矩阵为单位矩阵,每个样本为标准单位向量 e i \mathbf{e}_i ei,分散度最大,所有特征值均为 1 ,无法压缩,核PCA失败。假设 σ \sigma σ 趋近正无穷大 ,则只要距离 ∥ a i − a j ∥ \|\mathbf{a}_{i}-\mathbf{a}_{j}\| ∥ai−aj∥ 是有限值,则核值为 0,每个样本为零向量,所以此时核矩阵为零矩阵,样本收缩到原点,无法区分,核PCA也失败。所以 σ \sigma σ 不能太小,否则样本分散太开,所有成分都是同等重要,无法压缩;也不能太大,否则样本过度聚集,无法区分,存在一个合适取值区间或最优值。鄙人估计 σ \sigma σ 较优值应该是:首先计算每个样本与其最近样本距离,然后求这些最近距离的平均值, σ \sigma σ 较优值应该和平均值相当。高斯核函数远亲不如近邻原则,当点云曲面接近平面时是合理的,但当曲面高度非线性时是不合理的,生活中的近在眼前远在天边就是这个道理,近在眼前表示原空间两个样本距离近,远在天边表示变换空间两个样本距离远。该理论同样适用支持向量机核函数, σ \sigma σ 太小,样本分散太开,所有样本都是支持向量,造成过拟合;也不能太大,否则正负样本过度聚集,无法正确分类。