PCA是基本的线性降维方法,同时也是一种监督学习降维方法。PCA是希望降维之后,尽量保留原始数据的方差结构,所以我们需要投影方向a使得投影之后数据的方差最大化。
PCA是通过求解协方差矩阵的特征向量作为投影方向,如果我们要把原始数据降维到k维,把协方差矩阵前k大的特征值所对应的特征向量作为投影方向,证明见PPT。
步骤:
1. 假设有m个d为数据,把这些数据用矩阵的形式表示X=(x1, x2, … , xm),矩阵中的每一列代表一个数据,所以矩阵X的大小为d*m。
2. 对d维数据去均值,每一维度减去这维度整个数据集的平均值。
3. 计算协方差矩阵S:S=XX’/(m-1),协方差矩阵是对称的半正定矩阵。
4. 选取协方差矩阵S中前k个(1<=k<= rank(S))最大特征值所对应的特征向量,组成变换矩阵A,其每一行代表一个特征向量,大小为k*d。
5. 通过z_i = Ax_i讲原始d维数据x_i变换到k维数据z_d。
经过PCA变换之后,原始的高位数据有d维降到了k维空间,并且保存了变换后的数据保留了原始数据的协方差结构,因此可以代表原始数据。
协方差矩阵是对称的半正定矩阵,所以可以用SVD方法求特征值特征向量。对于维度不是很高的原始数据,SVD可以快速求解;如果处理比较高维的数据,SVD分解将是一个非常费时的过程,比如人脸分辨率为256*256时,则需要对65536*65536大小的矩阵进行分解。那有什么方法来解决这个问题呢,直接做一个简单的变换就行。
我们求解矩阵X’X的特征值和特征向量,而不是XX’,此时的矩阵大小为m*m(m为数据样本个数),我们有:
X’X*v_i = u_i* v_i
两边乘上X,得到
(XX’)X*v_i = u_i* (X*v_i)
从上述可以发现,只需要先求解矩阵X’X的特征向量,然后对得到的特征向量左乘矩阵X,得到就是矩阵XX’的特征向量。通过这种方法,把原本对高维矩阵的SVD分别转换成了对低维矩阵的分解(该方法适用于数据的维度远大于数据的个数)。
应用:
PCA最典型的应用就是在人脸识别中,人脸数据是一个非常高维度的数据,通过PCA把它投影到特征脸空间,大大加快了认识识别的速度和准确度。