Hello 大家好,这篇文章是它们的续作。在本篇文章里, 让我们重点来讨论讨论一下 kernel PCA。
kernel PCA: 讲它又不得不夹私货,kernel tricks。 相信大家对 kernel tricks 都不陌生,最直观的印象是它能把线性算法变成非线性, 深刻一点的理解是它自带样本空间映射功能, 可以把低维 feature 映射到高维:
从 kernel method 的定义可以看出其实它在本质上还是算点积,不同的是首先要把 x 映射到新 的空间里,通过映射函数 , 但是 kernel method 又有个别名叫 kernel tricks, 因为我们不用费劲去寻找映射函数的具体形式, 因为可以被很方便地计算出来。举个例子,大家一定都听说过 RBF kernel 有一个非常拉风的功能: 可以把 feature 映射到无穷维,推倒过程如下:
这样就把 RBF kernel 写成了两个无穷维的向量的点积形式,相当于把 x 给映射到了无穷维。 精髓的是,我们并不需要跑到无穷维上就能直接算出这个点积的值。这就是 kernel tricks, kernel PCA 顾名思义就是用上了 kernel tricks 的 PCA, 相信读到这里 大家基本上都能想到 kernel PCA 大概要怎么玩了:
1. 利用 kernel tricks 计算 kernel matrix K
2. 对K做SVD分解,找到topk的特征向量
3. 把高维数据 x 投射到 k 个特征向量上,从而把它降低到 k 维
但是这里有个很深的坑, 而且不得不承认作者自己在很长的一段时间里都是在这个坑里度过 的。假设样本 X 维度为 , 表示 n 个样本,m 个 feature, 按照 PCA 的思路, 我们要对协方差矩阵 做 SVD 分解,并且 C 的维度将会是; 但是 kernel PCA 的思路却是对 kernel matrix K 做 SVD 分解,如果是线性 kernel 的话, 维度是 。所以 kernel PCA 感觉与 PCA 南辕而北辙, 一个在协方差矩阵 C 上玩,另 一个在 kernel matrix K 上玩, 根本不是同一类东西。但其实他俩并不矛盾,kernel PCA 本质上确实是 PCA, 而且也确实继承了 kernel method 那 “把样本映射到高维空间” 的能力。下面让我们试着从传统 PCA 的角度来推出线性 kernel PCA:
这之中最重要的一步是 ,就是把特征矩阵 U 用 X 来线性地表示出来(可以证明 U 一定可以如此地表示出来)。下一步就是把 X 映射到低维空间:
啰嗦了这么多,其实就是想要证明 PCA 不但可以从协方差矩阵 C 的角度入手, 也可以从 kernel matrix K 的角度入手,于是把上面的线性 kernel 换成其他的 kernel,就得到了 kernel PCA。kernel PCA 降维打击后的蛋卷是这样的
但是蛋卷貌似看不出 kernel PCA 的作用,感觉跟普通的 PCA 没什么区别, 不过下面这个例子就能看出它的效果。
本文转载自:https://zhuanlan.zhihu.com/p/25097144