PCA算法全称是Principal Component Analysis,即主成分分析算法。它是一种维数约减(Dimensionality Reduction)算法,即把高维度数据在损失最小的情况下转换为低维度数据的算法。显然,PCA可以用来对数据进行压缩,可以在可控的失真范围内提高运算速度。
1.PCA算法原理
我们先从最简单的情况谈起。假设需要把一个二维数据降维成一维数据,要怎么做呢?如下图所示。
我们可以想办法找出一个向量 u ( 1 ) u^{(1)} u(1),以便让二维数据的点(方形点)到这个向量所在的直线上的平均距离最短,即投射误差最小。
这样就可以在失真最小的情况下,把二维数据转换为向量 u ( 1 ) u^{(1)} u(1)所在直线上的一维数据。再进一步,假设需要把三维数据降为二维数据时,我们需要找出两个向量 u ( 1 ) u^{(1)} u(1)和 u ( 2 ) u^{(2)} u(2),以便让三维数据的点在这两个向量决定的平面上的投射误差最小。
如果从数学角度来一般地描述PCA算法就是:当需要从n维数据降为k维数据时,需要找出k个向量 u ( 1 ) u^{(1)} u(1), u ( 2 ) u^{(2)} u(2),……, u ( k ) u^{(k)} u(k),把n维的数据投射到这k个向量决定的线性空间里,最终使投射误差最小化的过程。
思考:什么情况下,进行PCA运算时误差为0?在上图中,当这些二维数据在同一条直线上时,进行PCA运算后,误差为0。
问题来了,怎样找出投射误差最小的k个向量呢?要完整的用数学公式推导这个方法,涉及较多高级线性代数的知识,这里不再详述。感兴趣的话可以参考后面扩展部分的内容。下面我们直接介绍PCA算法求解的一般步骤。
假设有一个数据集,用m x n维的矩阵A表示。矩阵中每一行表示一个样本,每一列表示一个特征,总共有m个样本,每个样本有n个特征。我们的目标是减少特征个数,保留最重要的k个特征。
1.数据归一化和缩放
数据归一化和缩放是一种数学技巧,旨在提高PCA运算时的效率。数据归一化的目标是使特征的均值为0。数据归一化公式为:
x j ( i ) = a j ( i ) − μ j x_j^{(i)}=a_j^{(i)}-\mu_j xj(i)=aj(i)−μj
其中, a j ( i ) a_j^{(i)} aj(i)是指第i个样本的第j个特征的值, μ j \mu_j μj表示的是第j个特征的均值。当不同的特征值不在同一个数量级上的时候,还需要对数据进行缩放。数据归一化在缩放的公式为:
x j ( i ) = a j ( i ) − μ j s j x_j^{(i)}=\frac{a_j^{(i)}-\mu_j}{s_j} xj(i)=sjaj(i)−μj
其中, a j ( i ) a_j^{(i)} aj(i)是指第i个样本的第j个特征的值, μ j \mu_j μj表示的是第j个特征的均值, s j s_j sj表示第j个特征的范围,即 s j = m a x ( a j ( i ) ) − m i n ( a j ( i ) ) s_j=max(a_j^{(i)})-min(a_j^{(i)}) sj=max(aj(i))−min(aj(i))。
2.计算协方差矩阵的特征向量
针对预处理后的矩阵X,先计算其协方差矩阵(Covariance Matrix):
Σ = 1 m X T X \Sigma=\frac{1}{m}X^TX Σ=m1XTX
其中, Σ \Sigma Σ表示协方差矩阵,用大写的Sigma表示,是一个n * n维的矩阵。
接着通过奇异值分解来计算协方差矩阵的特征向量:
[ U , S , V ] = s v d ( Σ ) [U,S,V]=svd(\Sigma) [U,S,V]=svd(Σ)
其中,svd是奇异值分解(Singular Value Decomposition)运算,是高级线性代数的内容。经过奇异值分解后,有3个返回值,其中矩阵U是一个n * n的矩阵,如果我们选择U的列作为向量,那么我们将得到n个列向量 u ( 1 ) u^{(1)} u(1), u ( 2 ) u^{(2)} u(2),……, u ( n ) u^{(n)} u(n),这些向量就是协方差矩阵的特征向量。它表示的物理意义是,协方差矩阵 Σ \Sigma Σ可以由这些特征向量进行线性组合得到。
3.数据降维和恢复
得到特征矩阵后,就可以对数据进行降维处理了。假设降维前的值是 x ( i ) x^{(i)} x(i),降维后是 z ( i ) z^{(i)} z(i),那么
z ( i ) = U r e d u c e T x ( i ) z^{(i)}=U_{reduce}^{T}x^{(i)}