PCA
1.相关背景
在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。
因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。
2. 性质
缓解维度灾难:PCA 算法通过舍去一部分信息之后能使得样本的采样密度增大(因为维数降低了),这是缓解维度灾难的重要手段;
降维具有如下一些优点:
- 使得数据集更易使用。
- 降低算法的计算开销。
- 去除噪声。
- 使得结果容易理解。 降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。
降噪:当数据受到噪声影响时,最小特征值对应的特征向量往往与噪声有关,将它们舍弃能在一定程度上起到降噪的效果;
过拟合:PCA 保留了主要信息,但这个主要信息只是针对训练集的,而且这个主要信息未必是重要信息。有可能舍弃了一些看似无用的信息,但是这些看似无用的信息恰好是重要信息,只是在训练集上没有很大的表现,所以 PCA 也可能加剧了过拟合;
特征独立:PCA 不仅将数据压缩到低维,它也使得降维之后的数据各特征相互独立;
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和Y的协方差:
由上面的公式,我们可以得到以下结论:
(1) 方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征;方差是协方差的特殊情况。
(2) 方差和协方差的除数是
协方差为正时,说明
散度矩阵
对于数据
3.3 特征值分解矩阵原理
(1) 特征值与特征向量
如果一个向量
其中,
对于矩阵A,有一组特征向量
其中,Q是矩阵A的特征向量组成的矩阵,
3.4 SVD分解矩阵原理
奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:
假设A是一个
SVD分解矩阵A的步骤:
(1) 求
(2) 求
(3) 将
3.5 PCA算法两种实现方法
(1) 基于特征值分解协方差矩阵实现PCA算法
输入:数据集
去平均值(即去中心化),即每一位特征减去各自的平均值。
计算协方差矩阵
,注:这里除或不除样本数量 或 ,其实对求出的特征向量没有影响。 用特征值分解方法求协方差矩阵
的特征值与特征向量。 对特征值从大到小排序,选择其中最大的k个。然后将其对应的
个特征向量分别作为行向量组成特征向量矩阵 。 将数据转换到
个特征向量构建的新空间中,即 。
(2) 基于SVD分解协方差矩阵实现PCA算法
输入:数据集,需要降到k维。
输入:数据集
去平均值(即去中心化),即每一位特征减去各自的平均值。
计算协方差矩阵。
通过SVD计算协方差矩阵的特征值与特征向量。
对特征值从大到小排序,选择其中最大的
个。然后将其对应的 个特征向量分别作为列向量组成特征向量矩阵。 将数据转换到
个特征向量构建的新空间中。
在PCA降维中,我们需要找到样本协方差矩阵的最大
- 有一些SVD的实现算法可以先不求出协方差矩阵
也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。
2)注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?
假设我们的样本是
可以得到一个
4.理论推导
PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。
图中,红色点表示样例,蓝色点表示在
(1) 拉格朗日乘子法
在叙述求协方差矩阵对角化时,我们给出希望变化后的变量有**:变量间协方差为 0 且变量内方差尽可能大**。然后我们通过实对称矩阵的性质给予了推导,此外我们还可以把它转换为最优化问题利用拉格朗日乘子法来给予推导。
样本点
其中
构造拉格朗日函数:
5. 细节
5.1 零均值化
当对训练集进行 PCA 降维时,也需要对验证集、测试集执行同样的降维。而对验证集、测试集执行零均值化操作时,均值必须从训练集计算而来,不能使用验证集或者测试集的中心向量。
其原因也很简单,因为我们的训练集时可观测到的数据,测试集不可观测所以不会知道其均值,而验证集再大部分情况下是在处理完数据后再从训练集中分离出来,一般不会单独处理。如果真的是单独处理了,不能独自求均值的原因是和测试集一样。
另外我们也需要保证一致性,我们拿训练集训练出来的模型用来预测测试集的前提假设就是两者是独立同分布的,如果不能保证一致性的话,会出现 Variance Shift 的问题。
5.2 与 SVD 的对比
这是两个不同的数学定义。我们先给结论**:特征值和特征向量是针对方阵才有的,而对任意形状的矩阵都可以做奇异值分解**。
PCA:方阵的特征值分解,对于一个方阵 A,总可以写成:
其中,
SVD:矩阵的奇异值分解其实就是对于矩阵$ A$ 的协方差矩阵
其中:
所以,
PCA 需要对协方差矩阵
而实际上 Sklearn 的 PCA 就是用 SVD 进行求解的,原因有以下几点:
- 当样本维度很高时,协方差矩阵计算太慢;
- 方阵特征值分解计算效率不高;
- SVD 除了特征值分解这种求解方式外,还有更高效更准确的迭代求解方式,避免了
的计算; - 其实 PCA 与 SVD 的右奇异向量的压缩效果相同。
参考文献: