主成分分析(PCA)
维数灾难和降维
在KNN算法中曾讲到,对于高维数据,会出现数据样本稀疏、距离计算困难等问题。但是这种问题并不是仅仅针对KNN算法,只是在KNN算法中这种问题会被放大,而其他的机器学习算法也会因为高维数据对训练模型造成极大的障碍,这种问题一般被称为维数灾难(curse of dimensionality)。
解决维数灾难最常用的方法是降维(dimension reduction),即通过某种数学变换将原始高维特征空间转变为一个低维子空间,在这个子空间中样本密度大幅提高,距离计算也变得更容易。
# 维数灾难和降维图例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.decomposition import PCA
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
np.random.seed(0)
X = np.empty((100, 2))
X[:, 0] = np.random.uniform(0, 100, size=100)
X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0, 10, size=100)
pca = PCA(n_components=1)
X_reduction = pca.fit_transform(X)
X_restore = pca.inverse_transform(X_reduction)
plt.scatter(X[:, 0], X[:, 1], color='g', label='原始数据')
plt.scatter(X_restore[:, 0], X_restore[:, 1],
color='r', label='降维后的数据')
plt.annotate(s='',xytext=(40,60),xy=(65,30),arrowprops=dict(arrowstyle='-',color='b',linewidth=5))
plt.legend(prop=font)
plt.show()
如上图所示,绿点即原始高维空间中的样本点,红点即我们降维后的样本点。由于图中的高维是二维,低维是一维,所以样本在低维空间是一条直线。
接下来我们的目标就是聊一聊如何做到把高维空间样本点映射到低维空间,即各种降维算法。
主成分分析学习目标
- 维数灾难和降维
- 主成分分析两个条件
- 基于主成分分析两个条件推导主成分分析
- 核主成分分析
- 主成分分析优缺点
主成分分析详解
主成分分析(principal component analysis,PCA)是最常用的一种降维方法,我们已经利用“维数灾难和降维图例”解释了降维的过程,PCA的降维过程则是尽可能的使用数据最主要的特征来代表数据原有的所有特征。但是有没有同学想过为什么使用PCA降维是上图的红点组成的线而不是蓝线呢?这里就需要说到我们PCA的两个条件了。
主成分分析两个条件
对于“维数灾难和降维图例”中的红线和蓝线我们可以把它看成一个超平面$S$,理论上红线和蓝线构成的超平面都可以做到对样本特征的降维,但是一般我们希望这种能够做到降维的超平面满足以下两个条件
- 最近重构性:样本点到这个超平面的距离都足够近
- 最大可分性:样本点到这个超平面上的投影尽可能分开
基于最近重构性和最大可分性,就可以得到主成分分析的两种等价推导。
基于最近重构性推导PCA
主成分分析目标函数
我们首先从最近重构性推导PCA,即样本点到这个超平面的距离足够近。
假设$m$个$n$维数据$(x^{(1)},x^{(2)},\cdots,x^{(m)})$都已经进行了中心化,即$\sum_{i=1}^mx^{(i)}=0$;在假设投影变换后得到的新坐标系为${w_1,w_2,\cdots,w_n}$,其中$w_i$是标准正交基向量,即$||w_i||=1,w_i^Tw_j=0$,其中$i\neq{j}$。
如果把数据从$n$维降到$n’$维,即丢弃新坐标系中的部分坐标,则新的坐标系为${w_1,w2,\cdots,w{n’}}$,则样本点$x^{(i)}$在$n’$维坐标系中的投影为
$$
z{i} = (z{i1},z{i2},\cdots,z{id’})^T
$$
其中$z_{ij}=w_j^Tx_i$,是$x_i$在低维坐标系下第$j$维的坐标。
如果我们用$z^{(i)}$重构$x^{(i)}$,则可以恢复的原始数据为
$$
\hat{xi}=\sum{j=1}^{d’}z_{ij}w_j
$$
现在考虑整个样本集,既可以获得原样本点$x_i$到基于投影重构的样本点$\hat{xi}$之间的距离为
$$
\begin{align}
\sum{i=1}^m{||\hat{x_i}-xi||}^2 & = \sum{i=1}^m{||Wz_i-xi||}^2 \
& = \sum{i=1}^m(Wz_i)^T(Wzi)-2\sum{i=1}^m(Wz_i)^Txi+\sum{i=1}^mx_i^Txi \
& = \sum{i=1}^mz_i^Tzi – 2\sum{i=1}^mz_i^TW^Txi+\sum{i=1}^mx_i^Txi \
& = \sum{i=1}^mz_i^Tzi-2\sum{i=1}^mz_i^Tzi+\sum{i=1}^mx_i^Txi \
& = -\sum{i=1}^mz_i^Tzi + \sum{i=1}^mx_i^Txi \
& = -tr(W^T(\sum{i=1}^mx_ixi^T)W)+\sum{i=1}^mx_i^Txi \
& = -tr(W^TXX^TW)+\sum{i=1}^mx_i^Tx_i
\end{align}
$$
由于涉及过多矩阵推导,此处不多赘述,看不懂的可以跳过。
其中$W=(w_1,w_2,\cdots,wd)$,其中$\sum{i=1}^mx_i^Tx_i$是数据集的协方差矩阵,$W$的每一个向量$wj$是标准正交基,而$\sum{i=1}^mx_i^Tx_i$是一个常量,最小化上式等价于
$$
\begin{align}
& \underbrace{min}_W\,-tr(W^TXX^TW) \
& s.t.\,W^TW=I
\end{align}
$$
主成分分析目标函数优化
主成分分析目标函数为
$$
\begin{align}
& \underbrace{min}_W\,-tr(W^TXX^TW) \
& s.t.\,W^TW=I
\end{align}
$$
最小化该目标函数其实并不难,可以发现最小化目标函数对应的$W$由协方差矩阵$XX^T$最大的$n’$个特征值对应的特征向量组成,利用拉格朗日乘子法可得
$$
J(W)=-tr(W^TXX^TW+\lambda_i(W^TW-I))
$$
对$W$求导等于0即可得
$$
\begin{align}
& -XX^TW+\lambda{W}=0 \
& XX^TW = \lambda{W}
\end{align}
$$
从上式可以看出,$W$是$XX^T$的$n’$个特征向量组成的矩阵,而$\lambda$有若干个特征值组成的矩阵,特征值在对角线上,其余位置为0。当我们将数据集从$n$维降到$n’$维时,需要找到最大的$n’$个特征值对应的特征向量。这个$n’$个特征向量组成的矩阵$W$即我们需要的矩阵。对于原始数据集,我们只需要用$z_i=W^Tx_i$,就可以把原始数据集降到最小投影距离的$n’$维数据集。
基于最大可分性推导PCA
从最大可分性出发,样本点$x_i$在新空间中超平面的投影是$W^Tx_i$,如果所有样本点的投影尽可能分开,则应该使投影后样本点的方差最大化。
投影后样本点的方差是$\sum_{i=1}^mW^Tx_ix_i^TW$,因此目标函数可以写成
$$
\begin{align}
& \underbrace{max}_W\,-tr(W^TXX^TW) \
& s.t.\,W^TW=I
\end{align}
$$
上式其实和基于最近重构性推导PCA的目标函数其实差不多,其中一个是加负号的最小化,一个是最大化。
对基于最大可分性推导得到的目标函数最大化,利用拉格朗日乘子法可以得到
$$
XX^TW = -\lambda{W}
$$
核主成分分析(KPCA)
PCA中,我们假设存在一个线性的超平面,可以对数据投影,但工业上大多数时候数据都是线性不可分的,这里就需要用到和核SVM一样的思想,即核主成分分析(kernelized PCA,KPCA),是基于核技巧对非线性可分数据进行降维。
KPCA首先会把数据从$n$维映射到更高的$N$维,让数据线性可分后又会把数据映射回低维$n’$,即$n'<n<N$。
假设我们将在高维特征空间把数据投影到由$W=(w_1,w_2,\cdots,wd)$确定的超平面上,则$W$为
$$
ZZ^TW = (\sum{i=1}^mz_iz_i^T)W=\lambda{W}
$$
其中$zi$是样本点再高维特征空间中的像,即特征分解问题变为
$$
\begin{align}
W & = {\frac{1}{\lambda}}(\sum{i=1}^mz_izi^T)W \
& = \sum{i=1}^mz_i{\frac{zi^TW}{\lambda}} \
& = \sum{i=1}^mz_i\alpha_i^j
\end{align}
$$
其中$a_i^j={\frac{1}{\lambda}}z_i^TW$是$\alpha_i$的第$j$个分量。
假设$z_i$是由原始样本点$x_i$通过映射$\phi$产生,即$z_i=\phi(xi)$,则特征分解问题变为
$$
(\sum{i=1}^m\phi(x_i)\phi(xi)^T)W = \lambda{W}
$$
$W$变为
$$
W=\sum{i=1}^m\phi(x_i)\alpha_i^j
$$
由于我们并不知道$\phi$是什么,一般情况下$\phi$不需要显示计算,通过核函数转换即可。因此引入核函数
$$
k(x_i,x_j)=\phi(x_i)^T\phi(x_j)
$$
将核函数和$w_j$代入特征分解问题,可得
$$
K\alpha^j=\lambda\alpha^j
$$
其中$K$为$k$对应的核矩阵,对于上述特征值分解问题,去$K$最大的$d’$个特征值对应的特征向量即可。
对于新样本$x$,他投影后的第$j\quad(j=1,2,\cdots,d’)$维坐标为
$$
\begin{align}
zj & = W^T\phi(x) \
& = \sum{i=1}^m\alpha_i^j\phi(xi)^T\phi(x) \
& = \sum{i=1}^m\alpha_i^jk(x_i,x)
\end{align}
$$
从上述特征分解可以看出,KPCA需要对所有样本求和,因此它的计算开销较大。
主成分分析流程
输入
样本集$D={x_1,x_2,\cdots,x_n}$;低维空间维数$n’$。
输出
降维后的样本集$D’$。
流程
- 对所有样本进行中心化:$x_i\leftarrow{xi}-{\frac{1}{m}}\sum{i=1}^m{x_i}$
- 计算样本的协方差矩阵$XX^T$
- 对协方差矩阵$XX^T$做特征值分解
- 取最大的$n’$个特征值所对应的特征向量$(w_1,w2,\cdots,w{n’})$,将所有的特征向量标准化后,组成特征向量矩阵$W$
- 对样本集中的每一个样本$x^{(i)}$,转化为新的样本$z^{(i)}=W^Tx^{(i)}$
- 得到输出样本集$n’=(z^{(1)},z^{(2)},\cdots,z^{(m)})$
降维后低维空间的维数$n’$通常是用户事先指定的,一般选择使用交叉验证的方法选择最好的$n’$值。对于PCA,有时候也会从重构的角度指定一个降维到的主成分比重阈值$t$,这个阈值的范围一般是$(0,1]$,然后选取使下式成立的最小$n’$值
$$
{\frac{\sum_{i=1}^{n’}\lambdai}{\sum{i=1}^{n}\lambda_i}}\geq{t}
$$
主成分分析优缺点
优点
- 只需要以方差衡量信息量,不受数据集以外的因素影响
- 主要计算是特征值分解,计算简单,易于实现
缺点
- 主成分由于是降维得到,没有原始样本那样较强的解释性
- 由于PCA降维会丢掉不少的信息,可能对后续的数据处理有影响
小结
PCA作为一个无监督学习的降维方法,只需要对特征值分解,就可以压缩数据,对数据去噪声。但是PCA还是有不少缺点的,针对PCA的缺点,也出现了很多PCA的变种,如解决非线性数据降维的KPCA;解决内存限制的增量的Incremental PCA;解决稀疏数据降维的Sparse PCA等。
由于PCA涉及过多的数学公式,以及有着较强逻辑和空间处理。如果不是很懂可以结合代码然后多看几遍。