PCA原理推导及Matlab实现

主成分分析(Principal Component Analysis),简称PCA,是一种常用的数据降维方法,用于数据预处理。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量。


PCA思想

所谓降维,就是找到k个超平面,把原n维空间的数据投影到这k个超平面上,使原n维数据降为k维。

而PCA降维的核心思想是:降维后的数据尽可能分散

图中的二维数据,在 F1 平面上投影后成了一维数据,并且分散度最大,这个 F1 ,就是PCA要找的超平面。

具体讲,PCA的目的,是找到一个投影矩阵,使得样本点投影后尽可能分散,即使得样本点投影后的方差最大,并且为了避免投影的堆叠,投影矩阵中的各个向量应该是正交的。

如何做投影

由线性代数中基变换和坐标变换的概念可知道,元素在不同基下的坐标关系为:

即可通过坐标与变换矩阵的内积得到变换后的坐标

假设有m个样本 X ,每个样本维度为n

通过与投影矩阵 W 做内积

维度从n维降到了k维

投影后的样本为

用数学语言描述:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大。

推导过程

样本为 X ,投影基为 w ,投影后样本为 Y

样本方差计算公式里分母为m-1而不是m的目的是为了让方差的估计是无偏的,具体原因可以参考相关的数理统计书籍,在本文中这个问题并不重要,在此不做探讨。

下面推导方差 D 最大的条件(注:下面推导中的向量均为列向量)

定义矩阵

则有

其中

正是样本 X 的协方差矩阵,而协方差矩阵是半正定矩阵

由半正定矩阵的性质可知:

半正定矩阵的二次型存在最大值:



存在最大值

证明1

协方差矩阵是实对称矩阵

由于 W 为正交矩阵,所以有

对于方差矩阵(对角线上为方差值,其他位置均为0)有

因此方差矩阵 D 是协方差矩阵 C 的相似对角矩阵,对角线上元素为C 的特征值,而 W 中的每个列向量正是 C 的特征向量,并且特征值的排列次序与特征向量的排列次序相对应。

证明2

使用 拉格朗日乘数法

目标函数:

约束条件:

构造拉格朗日函数:

w 求导并令导数为0,求得 f(w) 的极大值

显然,w 即为协方差矩阵C的特征向量,代回原式

所以 C 的最大特征值正是 Y 的最大方差

这里解决一个问题,为什么一阶导数为0时,函数取得的是极大值呢?

由二阶导数:

可知,当 λ 取最大值时二阶导数半负定,所以,目标函数在最大特征值所对应的特征向量上取得最大值

(注:PCA的证明方法有不下十种,这里只是提及了其中的两种证明方法)

因此如果我们需要将N维的样本矩阵,降维到K维,我们只需要选择出协方差矩阵 C 的前K个最大的特征值对应的特征向量,排列成W矩阵即可,就是我们所需的投影矩阵 W

PCA降维步骤

  • 将M个N维的样本组成N行M列的样本矩阵X
  • 将样本矩阵去中心化
  • 方差归一化,让每个特征的权重都一样 (非必要项,根据数据实际情况选择)
  • 计算样本的协方差矩阵 C
  • 求出协方差矩阵 C 的特征值和特征向量
  • 对特征值以及对应的特征向量按照倒序排列,取前K个特征向量组成投影矩阵 W

Matlab 完整实现代码已经托管到我的github仓库

https://github.com/Leungtamir/pca

谢谢大家