特征抽取 主成分分析PCA
| 2023-8-6
0  |  阅读时长 0 分钟
type
Post
status
Published
date
Sep 10, 2021
slug
summary
tags
Scikit-Learn
category
数据分析
icon
password
Property

原理

PCA的思想

PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。假如数据集是维的,共有个数据,希望将这个数据的维度从维降到维,并且这维的数据集尽可能的代表原始数据集。
数据从n维降到n'维肯定会有损失,但是希望损失尽可能的小,那么如何让这维的数据尽可能表示原来的数据呢?
 
先看看最简单的情况:,也就是将数据从二维降维到一维,数据如下图。希望找到某一个维度方向,可以代表这两个维度的数据。图中列了两个向量方向:,那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出好。
notion image
为什么 好呢?
可以有两种解释:
  • 样本点到这个直线的距离足够近
  • 样本点在这个直线上的投影能尽可能的分开
从1维推广到任意维,则希望的降维的标准为:样本点到这个超平面的距离足够近,或者样本点在这个超平面上的投影能尽可能的分开。
基于上面的两种标准,可以得到PCA的两种等价推导:基于最小投影距离和基于最大投影方差

基于最小投影距离

假设维数据 都已经进行了中心化,即。经过投影变换后得到的新坐标系为 ,其中是标准正交基,即
 
如果将数据从 维降到 维,即丢弃新坐标系中的部分坐标,则新的坐标系为 ,样本点 维坐标系中的投影为:。其中在低维坐标系里第维的坐标。
如果用来恢复原始数据,则得到的恢复数据 ,其中为标准正交基组成的矩阵。
现在考虑整个样本集,希望所有的样本到这个超平面的距离足够近,即最小化下式:
将这个式子进行整理,可以得到:
第(1)步用到了;第(2)步是平方和展开;第(3)步用到了矩阵转置公式;第(4)步用到了;第(5)步合并同类项;第(6)步用到了和矩阵的迹;
 
是数据集的协方差矩阵, 的每一个向量是标准正交基,是一个常量。最小化上式等价于:
直接观察也可以发现最小值对应的由协方差矩阵最大的 个特征值对应的特征向量组成。用数学推导也很容易,利用拉格朗日函数可以得到:
求导有,整理下即为:
这样可以更清楚的看出,个特征向量组成的矩阵,的若干特征值组成的矩阵,特征值在主对角线上,其余位置为0。当数据集从维降到维时,需要找到最大的个特征值对应的特征向量。 个特征向量组成的矩阵 即为需要的矩阵。对于原始数据集,只需要用 ,就可以把原始数据集降维到最小投影距离的维数据集。
谱聚类的优化过程和PCA的非常类似,只不过谱聚类是求前 个最小的特征值对应的特征向量,而PCA是求前个最大的特征值对应的特征向量。

基于最大投影方差

假设维数据 都已经进行了中心化,即。经过投影变换后得到的新坐标系为 ,其中是标准正交基,即
如果将数据从 维降到 维,即丢弃新坐标系中的部分坐标,则新的坐标系为 ,样本点 维坐标系中的投影为:。其中在低维坐标系里第维的坐标。
对于任意一个样本,在新的坐标系中的投影为,在新坐标系中的投影方差为,要使所有的样本的投影方差和最大,也就是最大化 的迹,即:
和基于最小投影距离的优化目标完全一样,只是一个是加负号的最小化,一个是最大化
利用拉格朗日函数可以得到:
求导有,整理下即为:
和上面一样可以看出,个特征向量组成的矩阵,的若干特征值组成的矩阵,特征值在主对角线上,其余位置为0。当数据集从维降到维时,需要找到最大的个特征值对应的特征向量。 个特征向量组成的矩阵W即为需要的矩阵。对于原始数据集,只需要用 ,就可以把原始数据集降维到最小投影距离的维数据集。

PCA算法流程

求样本 维的主成分其实就是求样本集的协方差矩阵的前个特征值对应特征向量矩阵,然后对于每个样本,做如下变换
 
输入:维样本集,要降维到的维数
输出:降维后的样本集
  1. 对所有的样本进行中心化:
  1. 计算样本的协方差矩阵
  1. 对矩阵进行特征值分解
  1. 取出最大的个特征值对应的特征向量,将所有的特征向量标准化后,组成特征向量矩阵
  1. 对样本集中的每一个样本,转化为新的样本
  1. 得到输出样本集
 
有时候不指定降维后的的值,而是换种方式,指定一个降维到的主成分比重阈值,这个阈值之间。假如个特征值为 ,则可以通过下式得到:

实例

notion image
notion image
notion image
notion image
notion image
 
 
 

优缺点

主要优点有:
  • 仅仅需要以方差衡量信息量,不受数据集以外的因素影响
  • 各主成分之间正交,可消除原始数据成分间的相互影响的因素
  • 计算方法简单,主要运算是特征值分解,易于实现
 
主要缺点有:
  • 主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
  • 方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响
 
为了克服PCA的一些缺点,出现了很多PCA的变种,比如为解决非线性降维的KPCA,还有解决内存限制的增量PCA方法Incremental PCA,以及解决稀疏数据降维的PCA方法Sparse PCA等。
 

核主成分分析KPCA

在上面的PCA算法中,假设存在一个线性的超平面,可以让我们对数据进行投影。但是有些时候,数据不是线性的,不能直接进行PCA降维。
这里就需要用到和支持向量机一样的核函数的思想,先把数据集从维映射到线性可分的高维,然后再从N维降维到一个低维度,这里的维度之间满足
假设高维空间的数据是由维空间的数据通过映射产生,则对于维空间的特征分解:
映射为:
通过在高维空间进行协方差矩阵的特征值分解,然后用和PCA一样的方法进行降维。一般来说,映射不用显式的计算,而是在需要计算的时候通过核函数完成。由于KPCA需要核函数的运算,因此它的计算量要比PCA大很多。
 
 

代码

从零实现PCA

 

调库实现PCA

sklearn.decomposition.PCA的主要参数:
n_components:
意义:PCA算法中所要保留的主成分个数
赋值int,比如n_components=1,将把原始数据降到一个维度
赋值(0,1]之间数,指定主成分的方差和所占的最小比例阈值,让PCA类根据样本特征方差来决定降维到的维度数
赋值string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比
也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)
 
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。
若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;
若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
 
whiten:
类型:bool,缺省时默认为False
意义:白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果PCA降维后有后续的数据处理动作,可以考虑白化
 
svd_solver
即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法; full则是传统意义上的SVD,使用了scipy库对应的实现;arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现;默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了
 
除了这些输入参数外,有两个PCA类的成员值得关注。第一个是explained_variance_,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。
inverse_transform() 将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)
 
 
 
 
使用不同数量的输入特征评估相同的变换和模型,并选择导致最佳平均性能的特征数量(降维量)
notion image
为每个配置的维度数量的准确度分数分布创建一个箱须图。
可以看到分类精度随着组件数量的增加而增加的趋势,限制在 15 个。
 
 
 

增量PCA (Incremental PCA)

它主要是为了解决单机内存限制的。有时候样本量可能是上百万+,维度可能也是上千,直接去拟合数据可能会让内存爆掉, 此时可以用IncrementalPCA类来解决这个问题。IncrementalPCA先将数据分成多个batch,然后对每个batch依次递增调用partial_fit函数,这样一步步的得到最终的样本最优降维
 
PCA 对象非常有用,但针对大型数据集的应用,仍然具有一定的限制。 最大的限制是 PCA 仅支持批处理,这意味着所有要处理的数据必须放在主内存。 IncrementalPCA 对象使用不同的处理形式,即允许部分计算以小型批处理方式处理数据的方法进行,而得到和 PCA 算法差不多的结果。 
 
IncrementalPCA 可以通过以下方式实现核外(out-of-core)主成分分析:
  • 基于从本地硬盘或网络数据库中连续获取的数据块之上, 使用 partial_fit 方法。
  • 在 memory mapped file (通过 numpy.memmap 创建)上使用 fit 方法。
IncrementalPCA 类为了增量式的更新 explained_variance_ratio_ ,仅需要存储估计出的分量和噪声方差。 这就是为什么内存使用量依赖于每个批次的样本数量,而不是数据集中需要处理的样本总量。
 
 

Kernel PCA

Kernel:

  • ‘linear’:
  • ‘poly’: 
    • 由gamma参数确定,p由degree参数确定,r由coef0参数确定
  • ‘rbf’: 
    • 由gamma参数确定
  • ‘sigmoid’: 
    • 由gamma参数确定,r由coef0参数确定
  • ‘precomputed’
notion image
 

稀疏主成分分析 ( SparsePCA 和 MiniBatchSparsePCA )

他们PCA类的区别主要是使用了L1的正则化,这样可以将很多非主要成分的影响度降为0,这样在PCA降维的时候我们仅仅需要对那些相对比较主要的成分进行PCA降维,避免了一些噪声之类的因素对我们PCA降维的影响。
SparsePCA和MiniBatchSparsePCA之间的区别则是MiniBatchSparsePCA通过使用一部分样本特征和给定的迭代次数来进行PCA降维,以解决在大样本时特征分解过慢的问题,当然,代价就是PCA降维的精确度可能会降低。
使用SparsePCA和MiniBatchSparsePCA需要对L1正则化参数进行调参
 
目录