主成分分析(PCA)降维原理、特征值分解与SVD分解

版权声明:我的博客站点:www.zgcr1991.com https://blog.csdn.net/zgcr654321/article/details/88365695

PCA介绍

主成分分析(PCA)的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
PCA构建k维空间的具体过程:
PCA从原始n维空间中顺序地找一组相互正交的坐标轴,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的正交坐标轴。
为什么要正交?
正交是为了使数据的损失最小,另外,特征值的特征向量是正交的。

PCA降维原理

PCA将原本的数据降低维度,而使得降低了维度的数据之间的方差最大(也可以说投影误差最小)。基于上面两种解释,我们有两种理论来解释PCA降维,即最大化方差理论和最小化投影理论,它们最终推导得出的结果是相同的。

最大化方差理论

即将PCA定义为一种正交投影,使得原始数据在降维后的空间中各个维度的方差最大化。
首先,给出原空间的中心点:
x = 1 N n = 1 N x n \overline{x}=\frac{1}{N} \sum_{n=1}^{N} x_{n}
假设u1为投影向量,投影之后的方差为:
1 N n = 1 N ( u 1 T x n u 1 T x ) 2 = u 1 T S u 1 \frac{1}{N} \sum_{n=1}^{N}(u_{1}^{T} x_{n}-u_{1}^{T} \overline{x})^{2}=u_{1}^{T} S u_{1}
上面公式的含义是每个xi和x的平均值点都乘以投影向量u1,这样所有点被转换成了新的正交基u1中的坐标,我们在新坐标系中求距离的平方差就是投影之后的方差。
要确保方差最大,这是一个带有约束条件的问题,约束条件为u1为正交基。我们可以使用拉格朗日乘子法解决。
拉格朗日函数为:
u 1 T S u 1 + λ 1 ( 1 u 1 T u 1 ) u_{1}^{T} S u_{1}+\lambda_{1}\left(1-u_{1}^{T} u_{1}\right)
上式对u1T求导,并令导数为0,可得:
S u 1 = λ 1 u 1 S u_{1}=\lambda_{1} u_{1}
这是一个标准的特征值表达式,λ1为特征值,u1为对应的特征向量。上式左边取得最大值的条件就是λ1最大,也就是取得最大的特征值的时候。假设我们是要将一个D维的数据空间投影到M维的数据空间中(M < D), 那我们取前M个特征向量构成的投影矩阵就是能够使得方差最大的矩阵u1。

最小化投影理论

即找到一个k维正交基,最小化原始数据点到投影后数据点的距离平方和。
假设我们已经找到了这个k维正交基:
x n = i = 1 k α n i u i x_{n}=\sum_{i=1}^{k} \alpha_{n i} u_{i}
我们可以用近似法来表示投影后的点:
x ~ n = i = 1 M z n i u i + i = M + 1 k b i u i \tilde x_{n}=\sum_{i=1}^{M} z_{n i} u_{i}+\sum_{i=M+1}^{k} b_{i} u_{i}
上式得到的新x是由前M个基的线性组合加上后k - M个基的线性组合,注意这里的z是对于每个x都不同的,而b对于每个x是相同的,这样我们就可以用M个数来表示空间中的一个点,也就是使得数据降维。但是这样降维后的数据,必然会产生一些扭曲,我们用J描述这种扭曲,我们的目标是使J最小:
J = 1 N n = 1 N x n x ~ n 2 J=\frac{1}{N} \sum_{n=1}^{N}\left\|x_{n}-\tilde x_{n}\right\|^{2}
上式的含义使对于每一个点,将降维后的点与原始的点之间的距离的平方和加起来,求平均值,我们就要使得这个平均值最小。令:
J z n j = 0 z n j = x n T u j , J b j = 0 b j = x u j \frac{\partial J}{\partial z_{n j}}=0 \Rightarrow z_{n j}=x_{n}^{T} u_{j}, \quad \frac{\partial J}{\partial b_{j}}=0 \Rightarrow b_{j}=\overline{x} u_{j}
将上面得到的z与b带入上面xn降维的表达式,得:
x n x ~ n = i = M + 1 k ( ( x n x ) u i ) u i x_{n}-\tilde x_{n}=\sum_{i=M+1}^{k}((x_{n}-\overline{x}) u_{i}) u_{i}
将上式代入J,得:
J = 1 N n = 1 N i = M + 1 k ( x n T u i x u i ) 2 = i = M + 1 k u i T S u i J=\frac{1}{N} \sum_{n=1}^{N} \sum_{i=M+1}^{k}\left(x_{n}^{T} u_{i}-\overline x \cdot u_{i}\right)^{2}=\sum_{i=M+1}^{k} u_{i}^{T} S u_{i}
接下来与最大化方差理论中类似,我们列一个拉格朗日函数,然后对UiT求导,最终可得:
S u i = λ i u i S u_{i}=\lambda_{i} u_{i}
我们想要的前k个向量其实就是这里最大的k个特征值所对应的特征向量。

对PCA两种理论的直观解释

上面的两种理论其实可以更加直观地解释。想象一个二维坐标系,上面有一堆数据点,我们首先找出这些数据的中心点,然后通过中心点画一对互相正交的直线(新坐标系),将这个坐标系不断旋转。我们把数据点分别对两个新坐标轴做垂线,得到落在新坐标系上的新数据点。随着坐标系的旋转,显然转到某个角度时会有一个新坐标轴上的所有新数据点到中心点的距离的平方之和达到最大,而此时原数据点到这个新坐标轴的投影距离平方之和恰好达到最小。
为什么会这样呢?
其中就是简单的勾股定理,两边平方之和一定等于斜边的平方,而在上面的例子中,原数据点到中心点的距离就是斜边,它是不会变化的,因此当落在新坐标轴上的数据点到中心点的距离平方达到最大时,原数据点到这个新坐标轴的投影距离的平方恰好达到最小。

方阵A求取特征值和特征向量方法(特征值分解)

要求Ax=λx,首先(λE-Ax)=0,E为单位矩阵。要求向量x有非零解,即求其次线性方程组(λE-Ax)=0有非零解的值λ。即求行列式|λE-Ax|=0。解行列式获得的值即为矩阵A的特征值。将此值回代入原式求得相应的x,即为输入这个行列式的特征向量。
计算实例:
计算矩阵A的特征值与特征向量。
A = [ 3 2 4 2 0 2 4 2 3 ] A=\left[ \begin{matrix}3 &amp; 2 &amp; 4 \\\\ 2 &amp; 0 &amp; 2 \\\\ 4 &amp; 2 &amp; 3\end{matrix}\right]
计算行列式为:
λ E A = λ 3 2 4 2 λ 2 4 2 λ 3 |\lambda E-A|=\left| \begin{array}{ccc}{\lambda-3} &amp; {-2} &amp; {-4} \\\\ {-2} &amp; {\lambda} &amp; {-2} \\\\ {-4} &amp; {-2} &amp; {\lambda-3}\end{array}\right|
= ( λ 8 ) ( λ + 1 ) 2 =(\lambda-8)(\lambda+1)^{2}
计算得λ:
λ 1 = 8 , λ 2 = λ 3 = 1 \lambda_{1}=8, \lambda_{2}=\lambda_{3}=-1
对λ1=8,求其特征向量:
( λ 1 E A ) x = 0 \left(\lambda_{1} E-A\right) x=0
求得
α 1 = [ 2 1 2 ] \alpha_{1}=\left[ \begin{array}{l}{2} \\\\ {1} \\\\ {2}\end{array}\right]
对λ2=λ3=-1,求其特征向量:
( λ 2 E A ) x = 0 \left(\lambda_{2} E-A\right) x=0
求得
α 2 = [ 1 0 1 ] , α 2 = [ 1 2 0 ] \alpha_{2}=\left[ \begin{array}{c}{1} \\\\ {0} \\\\ {-1}\end{array}\right], \alpha_{2}=\left[ \begin{array}{c}{1} \\\\ {-2} \\\\ {0}\end{array}\right]

基于特征值分解协方差矩阵实现PCA算法

我们通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
样本每一个特征的均值计算公式:
x = 1 n i = 1 N x i \overline x=\frac{1}{n} \sum_{i=1}^{N} x_{i}
样本方差的计算公式:
S 2 = 1 n 1 i = 1 n ( x i x ) 2 S^{2}=\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\overline{x}\right)^{2}
样本X和Y的协方差计算公式:
Cov ( X , Y ) = E [ ( X E ( X ) ) ( Y E ( Y ) ) ] \operatorname{Cov}(X, Y)=E[(X-E(X))(Y-E(Y))]
= 1 n 1 i = 1 n ( x i x ) ( y i y ) =\frac{1}{n-1} \sum_{i=1}^{n}\left(x_{i}-\overline{x}\right)\left(y_{i}-\overline{y}\right)
设数据集为:
X = ( x 1 , x 2 , x 3 , , x n ) T X=(x_{1}, x_{2}, x_{3}, \dots, x_{n})^{T}
那么协方差矩阵为
1 n X X T \frac{1}{n} X X^{T}
利用特征值分解计算PCA的步骤:
首先将数据中每个特征的值去中心化,即减去该特征的均值。得到去中心化后的X。
然后计算协方差矩阵。
用特征值分解方法求上面协方差矩阵的特征值与特征向量。因为协方差矩阵是一个方阵,这里就是用线性代数中求其次线性方程组的特征值的方法。
对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。
将数据转换到k个特征向量构建的新空间中,即Y=PX。

如果我们通过特征值分解协方差矩阵,那么我们只能得到一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。

SVD分解原理

SVD分解的任务就是对任意MXN矩阵A,找到一组正交基使得经过它变换后还是正交基。
假设已经找到这样一组正交基:
( v 1 , v 2 , , v n ) (v_{1}, v_{2}, \ldots, v_{n})
那么矩阵A将其映射为:
( A v 1 , A v 2 , , A v n ) (A v_{1}, A v_{2}, \ldots, A v_{n})
如果要让它们两两正交,即满足:
A v i A v j = ( A v i ) T A v j = v i T A T A v j = 0 A v_{i} \cdot A v_{j}=(A v_{i})^{T} A v_{j}=v_{i}^{T} A^{T} A v_{j}=0
由最初假设可得
v i T v j = v i v j = 0 v_{i}^{T} v_{j}=v_{i} \cdot v_{j}=0
如果正交基v选择为ATA的特征向量,由于ATA是对称阵,v之间两两正交,那么有:
v i T A T A v j = v i T λ j v j = λ j v i T v j = λ j v i v j = 0 \begin{aligned} v_{i}^{T} A^{T} A v_{j}=&amp; v_{i}^{T} \lambda_{j} v_{j} =\lambda_{j} v_{i}^{T} v_{j} =\lambda_{j} v_{i} v_{j}=0 \end{aligned}
这样就找到了一组正交基,这组正交基经过矩阵A变换后还是正交基。将映射后的正交基单位化(正交单位化后特征向量模为1)得:
A v i A v i = λ i v i v i = λ i A v_{i} A v_{i}=\lambda_{i} v_{i} v_{i}=\lambda_{i}
故有:
A v i 2 = λ i 0 \left|\mathrm{A} v_{i}\right|^{2}=\lambda_{i} \geq 0
取单位向量:
A v i = σ i u i A v_{i}=\sigma_{i} u_{i}
σi就是奇异值,λi是特征值,这样我们就得到了奇异值与特征值之间的关系:
σ i = λ i \sigma_{i}=\sqrt{\lambda_{i}}
当k<i<=m时,对u1,u2,…,uk进行扩展u(k+1),…,um,使得u1,u2,…,um为m维空间中的一组正交基,即在A的零空间中选取:
( v k + 1 , v 2 , , v n ) (v_{k+1}, v_{2}, \dots, v_{n})
使得Avi=0,i>k,并取σi=0。于是可得:
A [ v 1 v 2 v k v k + 1 v n ] = [ u 1 u 2 u k u k + 1 u m ] [ 线 σ 1 σ k 0 ] A[v_{1} v_{2} \cdots v_{k} | v_{k+1} \cdots v_{n}]=[u_{1} u_{2} \cdots u_{k} | u_{k+1} \cdots u_{m}][右边这个矩阵左上角对角线是σ1到σk,其他值均为0]
把左边第二个矩阵的转置矩阵两边同乘,继而可以得到A矩阵的奇异值分解:
A = U Σ V T A=U \Sigma V^{T}
其中U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。

SVD分解求矩阵特征值的方法

假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:
A = U Σ V T A=U \Sigma V^{T}
其中U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵(酉矩阵是正交矩阵往复数域上的推广),即满足:
U T U = I , V T V = I U^{T} U=I, V^{T} V=I
下面来计算U,Σ,V这三个矩阵。
首先用A的转置和A做矩阵乘法,得到的矩阵求其特征值和特征向量。
( A T A ) v i = λ i v i \left(A^{T} A\right) v_{i}=\lambda_{i} v_{i}
将所有特征向量张成一个n×n的矩阵V,就是我们SVD公式里面的V矩阵。一般我们将V中的每个特征向量叫做A的右奇异向量。
现在我们将A和A的转置做矩阵乘法,得到的矩阵求其特征值和特征向量。
( A A T ) u i = λ i u i \left(A A^{T}\right) u_{i}=\lambda_{i} u_{i}
再将所有特征向量张成一个m×m的矩阵U,就是我们SVD公式里面的U矩阵。一般我们将U中的每个特征向量叫做A的左奇异向量。
Σ矩阵除了对角线上是奇异值其他位置都是0,我们只需求出每个奇异值σ即可。
进行以下推导:
A = U Σ V T A V = U Σ V T V A V = U Σ A v i = σ i u i σ i = A v i / u i A=U \Sigma V^{T} \Rightarrow A V=U \Sigma V^{T} V \Rightarrow A V=U \Sigma \Rightarrow A v_{i}=\sigma_{i} u_{i} \Rightarrow \sigma_{i}=A v_{i} / u_{i}
故只要求出奇异值σi,再平方就可以得到特征值λi。
为什么ATA的特征向量组成的就是我们SVD中的V矩阵,而AAT的特征向量组成的就是我们SVD中的U矩阵?
这里以V矩阵的证明为例。
A = U Σ V T A T = V Σ T U T A T A = V Σ T U T U Σ V T = V Σ 2 V T A=U \Sigma V^{T} \Rightarrow A^{T}=V \Sigma^{T} U^{T} \Rightarrow A^{T} A=V \Sigma^{T} U^{T} U \Sigma V^{T}=V \Sigma^{2} V^{T}
注意Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值。故有
Σ T Σ = Σ 2 \Sigma^{T} \Sigma=\Sigma^{2}
如果把上面ATA右乘V,可以看出ATA的特征向量组成的矩阵就是我们SVD中的V矩阵。
SVD分解计算实例:
对矩阵A进行SVD分解。
A = [ 0 1 1 1 1 0 ] A=\left[ \begin{array}{ll}{0} &amp; {1} \\\\ {1} &amp; {1} \\\\ {1} &amp; {0}\end{array}\right]
那么可求出ATA和AAT:
A T A = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 2 1 1 2 ] A^{T} A=\left[ \begin{array}{ccc}{0} &amp; {1} &amp; {1} \\\\ {1} &amp; {1} &amp; {0}\end{array}\right] \left[ \begin{array}{ll}{0} &amp; {1} \\\\ {1} &amp; {1} \\\\ {1} &amp; {0}\end{array}\right]=\left[ \begin{array}{ll}{2} &amp; {1} \\\\ {1} &amp; {2}\end{array}\right]
A A T = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 1 1 0 1 2 1 0 1 1 ] A A^{T}=\left[ \begin{array}{ll}{0} &amp; {1} \\\\ {1} &amp; {1} \\\\ {1} &amp; {0}\end{array}\right] \left[ \begin{array}{lll}{0} &amp; {1} &amp; {1} \\\\ {1} &amp; {1} &amp; {0}\end{array}\right]=\left[ \begin{array}{lll}{1} &amp; {1} &amp; {0} \\\\ {1} &amp; {2} &amp; {1} \\\\ {0} &amp; {1} &amp; {1}\end{array}\right]
ATA的特征值和特征向量为:
λ 1 = 3 , v 1 = [ 1 / 2 1 / 2 ] ; λ 2 = 1 , v 2 = [ 1 / 2 1 / 2 ] \lambda_{1}=3 , v_{1}=\left[ \begin{array}{c}{1 / \sqrt{2}} \\\\ {1 / \sqrt{2}}\end{array}\right] ; \lambda_{2}=1 , v_{2}=\left[ \begin{array}{c}{-1 / \sqrt{2}} \\\\ {1 / \sqrt{2}}\end{array}\right]
AAT的特征值和特征向量为:
λ 1 = 3 , u 1 = [ 1 / 6 2 / 6 1 / 6 ] ; λ 2 = 1 , u 2 = [ 1 / 2 0 1 / 2 ] ; λ 3 = 0 , u 3 = [ 1 / 3 1 / 3 1 / 3 ] \lambda_{1}=3 , u_{1}=\left[ \begin{array}{c}{1 / \sqrt{6}} \\\\ {2 / \sqrt{6}} \\\\ {1 / \sqrt{6}}\end{array}\right] ; \lambda_{2}=1 , u_{2}=\left[ \begin{array}{c}{1 / \sqrt{2}} \\\\ {0} \\\\ {-1 / \sqrt{2}}\end{array}\right] ; \lambda_{3}=0 , u_{3}=\left[ \begin{array}{c}{1 / \sqrt{3}} \\\\ {-1 / \sqrt{3}} \\\\ {1 / \sqrt{3}}\end{array}\right]
利用
σ i = λ i \sigma_{i}=\sqrt{\lambda_{i}}
求出奇异值:
σ 1 = 3 σ 2 = 1 \sigma_{1}=\sqrt{3},\sigma_{2}=1
最终得到A的奇异值分解为:
A = U Σ V T = [ 1 / 6 1 / 2 1 / 3 2 / 6 0 1 / 3 1 / 6 1 / 2 1 / 3 ] [ 3 0 0 1 0 0 ] [ 1 / 2 1 / 2 1 / 2 1 / 2 ] A=U \Sigma V^{T}=\left[ \begin{array}{ccc}{1 / \sqrt{6}} &amp; {1 / \sqrt{2}} &amp; {1 / \sqrt{3}} \\\\ {2 / \sqrt{6}} &amp; {0} &amp; {-1 / \sqrt{3}} \\\\ {1 / \sqrt{6}} &amp; {-1 / \sqrt{2}} &amp; {1 / \sqrt{3}}\end{array}\right] \left[ \begin{array}{cc}{\sqrt{3}} &amp; {0} \\\\ {0} &amp; {1} \\\\ {0} &amp; {0}\end{array}\right] \left[ \begin{array}{cc}{1 / \sqrt{2}} &amp; {1 / \sqrt{2}} \\\\ {-1 / \sqrt{2}} &amp; {1 / \sqrt{2}}\end{array}\right]

SVD分解的作用

对于奇异值,与特征值类似,奇异值矩阵中也是按照从大到小排列奇异值,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。即:
A m × n = U m × m Σ m × n V n × n T U m × k Σ k × k V k × n T A_{m \times n}=U_{m \times m} \Sigma_{m \times n} V_{n \times n}^{T} \approx U_{m \times k} \Sigma_{k \times k} V_{k \times n}^{T}
其中k可以比m和n小很多,这样矩阵A只需要上式最右边三个小矩阵就可以近似描述了。

基于SVD分解协方差矩阵实现PCA算法

基于SVD分解协方差矩阵实现PCA算法时,步骤几乎与上面完全相同,只是我们现在换成了用SVD分解来求取协方差矩阵的特征值与特征向量。
上面的方法当然也可以进行PCA降维,但是在实际用SVD分解实现PCA时,有些SVD的实现算法可以不先求出协方差矩阵XXT,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。这个方法在样本量很大的时候可以减少很多计算量。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的特征分解。
假设我们的样本是mxn的矩阵X,如果我们通过SVD找到了矩阵XTX最大的k个特征向量组成的kxn的矩阵VT,则我们可以做如下处理:
X m × k = X m × n V n × k T X_{m \times k}^{\prime}=X_{m \times n} V_{n \times k}^{T}
我们可以得到一个mxk的矩阵X’,这个矩阵和我们原来的m×n维样本矩阵X相比,列数从n减到了k,可见对列数进行了压缩。
也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。换句话说,我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。

保留主成分个数的评价指标

我们该如何选择保留的主成分个数k?在决定k值时,我们通常会考虑不同k值可保留的方差百分比。
一般而言,设数据矩阵为X,协方差矩阵的特征值为(按由大到小顺序排列):
λ 1 , λ 2 , , λ n \lambda_{1}, \lambda_{2}, \dots, \lambda_{n}
那么如果我们保留前k个成分,则保留的方差百分比可计算为:
j = 1 k λ j j = 1 n λ j \frac{\sum_{j=1}^{k} \lambda_{j}}{\sum_{j=1}^{n} \lambda_{j}}

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/88365695