PCA主成分分析学习笔记

学习A-LOAM源码的时候,在scan-to-map特征点匹配这一段中是搜索最近的5个点,然后通过PCA(主成分分析)或者最小二乘的方式获得直线和平面的表达式,最后通过采样来获得最后的匹配点,这样做显然会更加鲁棒。但是什么是PCA忘了,特此记录一下。

1. 应用背景

  今天任何数据都会有着大量的变量,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。
  由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。

2. 数据降维

  降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。
  降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

3. PCA具体原理

3.1 PCA概念

  PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
  通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
  由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。
  既然提到协方差矩阵,那么就简单介绍一下方差和协方差的关系。然后概括介绍一下特征值分解矩阵原理、奇异值分解矩阵的原理。

3.2 协方差和散度矩阵

样本均值:
x ‾ = 1 n ∑ i = 1 N x i \overline{x} = \frac{1}{n}\sum\limits_{i = 1}^N{x_i} x=n1i=1Nxi
样本方差:
S 2 = 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) 2 S^2 = \frac{1}{n-1}\sum\limits_{i = 1}^n{(x_i-\overline{x})^2} S2=n11i=1n(xix)2
样本X和样本Y的协方差:
C o v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] = 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) ( y i − y ‾ ) Cov(X,Y) = E[(X-E(X))(Y - E(Y))] = \frac{1}{n-1}\sum\limits_{i = 1}^n{(x_i-\overline{x})(y_i-\overline{y})} Cov(X,Y)=E[(XE(X))(YE(Y))]=n11i=1n(xix)(yiy)
由上面的公式,我们可以得到以下结论:

  1. 方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征;方差是协方差的特殊情况。

  2. 方差和协方差的除数是n-1,这是为了得到方差和协方差的无偏估计。

  协方差为正时,说明X和Y是正相关关系;协方差为负时,说明X和Y是负相关关系;协方差为0时,说明X和Y是不相关的。Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差实际上是协方差矩阵(对称方阵)。例如,对于3维数据(x,y,z),计算它的协方差就是:
C o v ( X , Y , Z ) = [ C o v ( x , x ) C o v ( x , y ) C o v ( x , z ) C o v ( y , x ) C o v ( y , y ) C o v ( y , z ) C o v ( z , x ) C o v ( z , y ) C o v ( z , z ) ] Cov(X,Y,Z) = \begin{bmatrix}Cov(x,x)&Cov(x,y)&Cov(x,z)\\\\Cov(y,x)&Cov(y,y)&Cov(y,z)\\\\Cov(z,x)&Cov(z,y)&Cov(z,z)\end{bmatrix} Cov(X,Y,Z)= Cov(x,x)Cov(y,x)Cov(z,x)Cov(x,y)Cov(y,y)Cov(z,y)Cov(x,z)Cov(y,z)Cov(z,z)
  而散布矩阵(散度矩阵)即为协方差矩阵的n-1倍,n即总样本个数。
S = ∑ i = 1 n ( x i − x ‾ ) ( y i − y ‾ ) S = \sum\limits_{i = 1}^n{(x_i-\overline{x})(y_i-\overline{y})} S=i=1n(xix)(yiy)
  它们的特征值和特征向量是一样的。这里值得注意的是,散度矩阵是SVD奇异值分解的一步,因此PCA和SVD是有很大联系。

3.3 特征值分解矩阵原理

(1) 特征值与特征向量

  如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式:
A v = λ v Av = \lambda v Av=λv
  其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

(2) 特征值分解矩阵

  对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:
A = Q Σ Q − 1 A = Q\Sigma Q^{-1} A=QΣQ1
  其中,Q是矩阵A的特征向量组成的矩阵, Σ \Sigma Σ则是一个对角阵,对角线上的元素就是特征值。

3.4 SVD分解矩阵原理

  奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:
A = U Σ V T A = U\Sigma V^T A=UΣVT
  假设A是一个 m × n m × n m×n的矩阵,那么得到的U是一个 m × m m × m m×m的方阵,U里面的正交向量被称为左奇异向量。 Σ \Sigma Σ是一个 m × n m × n m×n的矩阵, Σ \Sigma Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。 V T V^T VT是v的转置矩阵,是一个 n × n n × n n×n的矩阵,它里面的正交向量被称为右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。
SVD分解矩阵A的步骤:

(1) 求 A A T AA^T AAT的特征值和特征向量,用单位化的特征向量构成 U。

(2) 求 A T A A^TA ATA的特征值和特征向量,用单位化的特征向量构成 V。

(3) 将 A A T AA^T AAT或者 A T A A^TA ATA的特征值求平方根,然后构成 Σ \Sigma Σ

3.5 PCA算法两种实现方法

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

输入:数据集 X = { x 1 , x 2 , x 3 , . . . , x n } X = \{x_1,x_2,x_3,...,x_n\} X={ x1,x2,x3,...,xn},需要降到k维。

 1) 去平均值(即去中心化),即每一位特征减去各自的平均值。

 2) 计算协方差矩阵 1 n X X T \frac{1}{n}{XX^T} n1XXT,
 注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

 3) 用特征值分解方法求协方差矩阵 1 n X X T \frac{1}{n}{XX^T} n1XXT的特征值与特征向量。

 4) 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为向量组成特征向量矩阵P。

 5) 将数据转换到k个特征向量构建的新空间中,即 Y = P X Y=PX Y=PX

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

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

输入:数据集 X = { x 1 , x 2 , x 3 , . . . , x n } X = \{x_1,x_2,x_3,...,x_n\} X={ x1,x2,x3,...,xn},需要降到k维。

 1) 去平均值,即每一位特征减去各自的平均值。

 2) 计算协方差矩阵。

 3) 通过SVD计算协方差矩阵的特征值与特征向量。

 4) 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为向量组成特征向量矩阵。

 5) 将数据转换到k个特征向量构建的新空间中。
在PCA降维中,我们需要找到样本协方差矩阵 X X T {XX^T} XXT的最大k个特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵 X X T {XX^T} XXT,当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

  1. 有一些SVD的实现算法可以先不求出协方差矩阵 X T X {X^TX} XTX也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。

  2. 注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?

假设我们的样本是 m × n m × n m×n的矩阵X,如果我们通过SVD找到了矩阵 X T X {X^TX} XTX最大的k个特征向量组成的 n × k n × k n×k的矩阵 V T V^T VT,则我们可以做如下处理:

X m ∗ n ′ = X m ∗ n V n ∗ k T X^{'}_{m * n} = X_{m*n}V^T_{n*k} Xmn=XmnVnkT
  可以得到一个 m × k m\times k m×k的矩阵 X ′ X^{'} X,这个矩阵和我们原来 m × k m\times k m×k的矩阵 X X X相比,列数从n减到了k,可见对列数进行了压缩。也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。

4. PCA的理论推导

PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。

我在这里只介绍最大方差理论:
在这里插入图片描述

在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。

因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

比如我们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化):
在这里插入图片描述

假设我们选择两条不同的直线做投影,那么左右两条中哪个好呢?根据我们之前的方差最大化理论,左边的好,因为投影后的样本点之间方差最大(也可以说是投影的绝对值之和最大)。

5. 选择降维后的维度K(主成分的个数)

PCA所做的事是尽可能最小化平均平方映射误差(Average Squared Projection Error) ,它是原始数据x和映射值 x_approx(i) 之间的差。即x和其在低维表面上的映射点之间的距离的平方。
1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 \frac{1}{m}\sum\limits_{i = 1}^m\Vert x^{(i)} - x_{approx}^{(i)}\Vert^2 m1i=1mx(i)xapprox(i)2
数据的总变差 (Total Variation) :是这些样本x(i)的长度的平方的均值。即这些训练集中每个训练样本长度的平均值。它的意思是 “平均来看我的训练样本距离零向量多远?”
1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \frac{1}{m}\sum\limits_{i = 1}^m\Vert x^{(i)} \Vert^2 m1i=1mx(i)2
选择K值的经验法则:选择平均平方映射误差除以数据的总变差的比值小于等于0.01的最小的k值。
1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 ⩽ 001 \frac{\frac{1}{m}\sum\limits_{i = 1}^m\Vert x^{(i)} - x_{approx}^{(i)}\Vert^2}{\frac{1}{m}\sum\limits_{i = 1}^m\Vert x^{(i)} \Vert^2} \leqslant 001 m1i=1mx(i)2m1i=1mx(i)xapprox(i)2001
总结:通常采用的决定k值的方法是对协方差矩阵调用一次 svd 函数,然后用以下公式来找出满足这个表达式的最小的k值。
在这里插入图片描述
算出左边红框的数值,会告诉你百分之多少的差异性被保留下来。当然,该值也可以选择95%,90%,依据需求而定。

Reference:
[1] 主成分分析(PCA)原理详解
[2] 机器学习课程笔记(第八周-2)降维问题 主成分分析法PCA

猜你喜欢

转载自blog.csdn.net/qq_20184333/article/details/127561907