当前位置:   article > 正文

这次终于理解了PCA主成分分析(附代码)

pca主成分分析代码

在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响。同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或者有一些特征带有的信息和其他一些特征是重复的(比如一些特征可能会线性相关)。

我们希望能够找出一种办法来帮助我们衡量特征上所带的信息量,让我们在降维的过程中,能够即减少特征的数量,又保留大部分有效信息——将那些带有重复信息的特征合并,并删除那些带无效信息的特征等等——逐渐创造出能够代表原特征矩阵大部分信息的,特征更少的,新特征矩阵。

主成分分析(PCA)

PCA(Principal Components Analysis)即主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们可以达到数据降维的目的。

PCA从原始变量出发,通过旋转变化(即原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(即数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。

主成分分析是一种基于变量协方差矩阵对数据进行压缩降维,去噪的有效方法,PCA的思想是将 维特征映射到 维上 ,这 维特征称为主元(主成分),是旧特征的线性组合,这些线性组合最大化样本方差,尽量使用新的 个特征互不相关。这  维是全新的正交特征,是重新构造出来的 维特征,而不是简单地从 维特征中取出其余 维特征。

PCA原理数学基础

在开始学习PCA数学原理之前,我们先来温习下PCA原理需要用到的数学基础。

如果你对此基础滚瓜烂熟可以跳过。如果你对PCA的数学原理眼花缭乱,也建议你直接跳过...

PCA使用方差作为信息量的衡量指标,并且特征值分解来找出空间 。PCA的思想是将 维特征映射到 维空间上 ,这 维特征是全新的正交特征,是重新构造出来的 维特征,而不是简单地从 维特征中去除其余 维特征。

那么如何衡量投影向量的优劣呢?在数学上有三种方法衡量投影的优劣!PCA可以被定义为数据在低维线性空间上的正交投影,这个线性空间被称为主⼦空间(principal subspace),使得投影数据的⽅差被最⼤化(Hotelling, 1933),即最大方差理论。等价地,它也可以被定义为使得平均投影代价最⼩的线性投影,即最小误差理论。平均投影代价是指数据点和它们的投影之间的平均平⽅距离(Pearson, 1901)。

简而言之,一种是基于最小投影距离,另一种是基于最大投影方差。本文我们基于最大投影方差进行介绍,如果对这两者均有兴趣,这里推荐一个博文PCA原理[1],对两者方法有个详细的公式推导,可以借鉴一下。

内积与投影

两个维数相同的向量的内积被定义为:

402 Payment Required

内积运算将两个向量映射为一个实数,其计算方式非常容易理解,但是其意义并不明显。

内积的几何意义

假设 和 是两个 维向量,我们知道 维向量可以等价表示为 维空间中的一条从原点发射的有向线段,为了简单起见,我们假设 和 均为二维向量,则

那么在二维平面上 和 可以用两条发自原点的有向线段表示,如下图:

3070d11df5ee8e7dcd85ddd87a69c568.png

现在我们从 点向 所在直线引入一条垂线,我们知道垂线与 的交点叫做 在 上的投影,再假设 与 的夹角为 ,则投影的矢量长度为(这里假设向量 的模为1)

其中 是向量 的模,也就是 线段的标量长度。

注意区分矢量长度和标量长度,标量长度总是大于等于0,值就是线段的长度;而矢量长度可能为负,其绝对值是线性长度,而符号取决于其方向与标准方向相同或者相反。

内积的正式表示:

与 的内积等于 到 的投影长度乘以 的模,在进一步,如果我们假设 的模为1,即 那么就变成了下面公式(也就是上面我们说的投影的矢量长度):

也就是说,设向量 的模为1,则 与 的内积值等于 向 所在直线投影的矢量长度!这就是内积的一种几何解释,也就是我们得到的第一个重要结论。

在线性代数中,基(basis)(也称为基底)是描述、刻画向量空间的基本工具。向量空间的基是它的一个特殊的子集,基的元素称为基向量。向量空间中任意一个元素,都可以唯一地表示成基向量的线性组合。

如何理解呢?

一个二维向量可以对应二维笛卡尔直角坐标系中从原点出发的一条有向线段,例如下面这个向量:

145d5e9cb5bd416df9f4869783e9183a.png

在代数中使用线段终点的点的坐标表示向量,例如上面的向量可以表示为(3,2)

我们隐式引入一个定义:以 轴和 轴上正方向长度为1的向量为标准,那么一个向量(3,2)实际上是说在 轴投影为3而 轴投影为2,注意投影是一个矢量,所以可以为负。

更正式的说,向量(x,y)实际上表示线性组合:

不难证明所有二维向量都可以表示为这样的线性组合,此处 (1,0)(0,1) 叫做二维空间的一组基:

adf6515ff9087a1934baeabc00fce763.png

所以,要准确描述向量,首先要确定一组基,然后给出基所在的各个直线上的投影值,就可以了,只不过我们经常省略第一步,而默认以 (1,0)(0,1) 为基。

我们之所以默认选择 (1,0)(0,1) 为基,当然是比较方便,因为他们分别是 和 轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应,非常方便。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内可以直观认为是两个不再一条直线上的向量。

例如, (1,1)(1,-1) 也可以成为一组基。一般来说,我们希望基的模是1,因为从内积的意义可以看到,如果基的模式1,那么就可以方便的用向量点乘基而直接获得其在新基上的坐标了!

实际上,对应于任何一个向量我们总可以找到其同方向上模为1的向量,只要让两个分量分别除以模就好了,例如上面的基就可以变为:和。

现在我们想获得(3,2)在新基上的坐标,即在两个方向上的投影矢量值,那么根据内积的几何意义,我们只要分别计算(3,2)和两个基的内积,不难得到新的坐标为 。

下图给出了新的基以及(3,2)在新基上坐标值的示意图:

bd39398d39834e9e6e62047927f709a6.png

另外这里要注意的是,我们列举的例子中基是正交的(即内积为0,或者说相互垂直),但是可以成为一组基的唯一要求就是线性无关,非正交的基也是可以的,不过因为正交基有较好的性质,所以一般使用的基都是正交的。

基变换

上面的基变换的例子,将(3,2)变换为新基上的坐标,就是用(3,2)与第一个基做内积运算,作为第一个新的坐标分量,然后用(3,2)与第二个基做内积运算,作为第二个新坐标的分量。于是一组向量的基变换被表示为矩阵的相乘:

矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。更抽象的说:一个矩阵可以表示为一种线性变换

最大方差理论

在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。因此我们认为,最好的 维特征是将 维样本点变换为 维后,每一维上的样本方差都尽可能的大。

首先,考虑在一维空间 () 上的投影。我们可以使用 维向量 定义这个空间的方向。为了方便(并且不失一般性),我们假定选择一个单位向量,从而 (注意,我们只对 的方向感兴趣,而对 本身的大小不感兴趣)。

886e0352860034ece88ef2921b01f0e8.png

如上图所示,红色点表示原样本点 , 是蓝色直线的斜率也是直线的方向向量,而且是单位向量,直线上的蓝色点表示原样本点 在 上的投影。容易知道投影点离原点的距离是 ,由于这些原始样本点的每一维特征均值都为0,因此投影到 上的样本点的均值仍然是0。

假设原始数据集为 ,我们的目标是找到最佳的投影空间 ,其中 是单位向量且 与 正交, 何为最佳的 ?就是原始样本点投影到 上之后,使得投影后的样本点方差最大。

由于投影后均值为0,因此投影后的总方差为:

是不是似曾相识,没错,它就是原始数据集 的协方差矩阵(因为 的均值为0,因为无偏估计的原因,一般协方差矩阵除以 ,这里用 )。

则有

λ

上式两边同时左乘 ,注意到 (单位向量),则有

λ

所以 是矩阵 的特征值所对应的特征向量。

欲使投影后的总方差最大,即 最大,因此最佳的投影向量 是特征值 最大时对应的特征向量,因此,当我们将 设置为与具有最大的特征值 的特征向量相等时,方差会达到最大值。这个特征向量被称为第一主成分。

我们可以用一种增量的方式定义额外的主成分,方法为:在所有与那些已经考虑过的方向正交的所有可能的方向中,将新的方向选择为最大化投影方差的方向。如果我们考虑 维投影空间的一般情形,那么最大化投影数据方差的最优线性投影由数据协方差矩阵 的 个特征向量 定义,对应于 个最大的特征值 。可以通过归纳法很容易地证明出来。

因此,我们只需要对协方差矩阵进行特征值分解,得到的前 大特征值对应的特征向量就是最佳的 维新特征,而且这 维新特征是正交的。得到前 个 以后,原始数据集 通过变换可以得到新的样本。

PCA原理推导

现在有了上述数据基础作为铺垫,理解PCA原理推导就不算难事了。

假设原始数据集 为 维随机变量 , 其均值 向量 ,其协方差矩阵为:

402 Payment Required

由 维随机变量 到 维随机变量 的线性变换   的线性变换为:

402 Payment Required

其中

这可能不容易理解,我们在二维空间内举例:

e2267a793aec61980f20c004805295fc.png

我们现在有一组简单的数据,有特征 和 ,三个样本数据的坐标点分别为(1,1),(2,2),(3,3)。我们可以让 和 分别作为两个特征向量,很轻松地用一个二维平面来描述这组数据。这组数据现在每个特征的均值都为2,方差则等于:

402 Payment Required

每个特征的数据一模一样,因此方差也都为1,数据的方差总和是2。

现在我们的目标是:只用一个特征向量来描述这组数据,即将二维数据降为一维数据,并且尽可能地保留信息量, 即让数据的总方差尽量靠近2。于是,我们将原本的直角坐标系逆时针旋转45°,形成了新的特征向量 和 组成的新平面,在这个新平面中,三个样本数据的坐标点可以表示为 , , 。可以注意到, 上的数值此时都变成了0,因此 明显不带有任何有效信息了(此时的方差 也为0了)。此时, 特征上的数据均值是 ,而方差则可表示成:

402 Payment Required

上的数据均值为0,方差也为0。

此时,我们根据信息含量的排序,取信息含量最大的一个特征,因为我们想要的是一维数据。所以可以将 删除,同时也删除图中的 特征向量,剩下的 就代表了曾经需要两个特征来代表的三个样本点。通过旋转原有特征向量组成的坐标轴来找到新特征向量和新坐标平面,我们将三个样本点的信息压缩到了一条直线上,实现了 二维变一维,并且尽量保留原始数据的信息。一个成功的降维,就实现了。

从上述例子中我们可以发现,经过线性变换的随机变量 的均值、方差和协方差统计量可以表示为:

402 Payment Required

当随机变量 到 维随机变量 的线性变换满足如下条件是,变换后的 分别为随机变量 的第一主成分、第二主成分、 第三主成分、...、第 主成分。

  1. 线性变换的系数向量 为单位向量,有 。

  2. 线性变换后的变量 与 线性无关,即协方差 。

  3. 变量 是随机变量 所有线性变换中方差最大的, 是与 线性无关的所有线性变换中方差最大的。

上述三个条件给出了求解主成分的基本方法。根据优化目标和约束系件,我们可以使用拉格朗日乘子法求解主成分。

以第一主成分为例求解:

402 Payment Required

定义拉格朗日函数如下:

要求极值,需对拉格朗日函数对 求导并令其等于0:

根据矩阵特征值与特征向量的关系,由式可知 为 的特征值, 对应的单位特征向量。假设 是 的最大特征值 对应的单位特征向量,那么 ,均为上述优化问题的最优解。所以 为第一主成分,其方差为对应协方差短阵的最大特征值:

这样,第一主成分的推导就算完成了。同样的方法可用来求解第 主成分,第 主成分的方差对第 个特征值为:

PCA算法流程

算法输入数据集

  1. 按列计算数据集 的均值 及,对数据进行去中心化处理,然后令

  2. 求解矩阵 的协方差矩阵,并将其记为

  3. 计算协方差矩阵 的特征值和相应的特征向量

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

  5. 计算 ,即将数据集 投影到选取的特征向量上,这样就得到了我们需要的已经降维的 维数据集

注意,计算一个 矩阵的完整的特征向量分解的时间复杂度为 。如果我们将数据集投影到前 个主成分中,那么我们只需寻找前 个特征值和特征向量。这可以使用更高效的方法得到,例如幂方法(power method) (Golub and Van Loan, 1996),它的时间复杂度为 ,或者我们也可以使用 EM 算法。

PCA实例

下面举一个简单的例子,说明PCA的过程。

假设我们的数据集有10个二维数据,

  1. (2.5,2.4), (0.5,0.7), (2.2,2.9),
  2. (1.9,2.2), (3.1,3.0), (2.3, 2.7),
  3. (2, 1.6), (1, 1.1), (1.5, 1.6), (1.1, 0.9)

需要用PCA降到1维特征。

首先我们对样本中心化,这里样本的均值为(1.81, 1.91),所有的样本减去这个均值向量后,即中心化后的数据集为

  1. (0.69, 0.49), (-1.31, -1.21), (0.39, 0.99),
  2. (0.09, 0.29), (1.29, 1.09), (0.49, 0.79),
  3. (0.19, -0.31), (-0.81, -0.81), (-0.31, -0.31),
  4. (-0.71, -1.01)

现在我们开始求样本的协方差矩阵,由于我们是二维的,则协方差矩阵为:

对于我们的数据,求出协方差矩阵为:

求出特征值为:
(0.0490833989, 1.28402771),

对应的特征向量分别为:

由于最大的 k=1 个特征值为1.28402771,
对应于的 k=1个特征向量为

402 Payment Required

则我们的

我们对所有的数据集进行投影 ,得到PCA降维后的10个一维数据集为:

  1. (-0.827970186, 1.77758033, -0.992197494,
  2. -0.274210416, -1.67580142, -0.912949103,
  3. 0.0991094375, 1.14457216, 0.438046137,
  4. 1.22382056)

PCA 优缺点及应用

优点

  • 它是无监督学习,完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。

  • 用PCA技术可以对数据进行降维,同时对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。

  • 各主成分之间正交,可消除原始数据成分间的相互影响。

  • 计算方法简单,易于在计算机上实现。

缺点

  • 如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。

  • 贡献率小的主成分往往可能含有对样本差异的重要信息。

  • 特征值矩阵的正交向量空间是否唯一有待讨论。

  • 特征值分解有一些局限性,比如变换的矩阵必须是方阵。

  • 在非高斯分布的情况下,PCA方法得出的主元可能并不是最优的,此时在寻找主元时不能将方差作为衡量重要性的标准。

PCA降维准则

  • 最近重构性:样本集中所有点,重构后的点距离原来的点的误差之和最小。

  • 最大可分性:样本在低维空间的投影尽可能分开。

PCA算法应用

  • 高维数据集的探索与可视化。

  • 数据压缩。

  • 数据预处理。

  • 图象、语音、通信的分析处理。

  • 降维(最主要),去除数据冗余与噪声。

思考|PCA和特征选择技术都是特征工程的一部分,它们有什么不同?

特征工程中有三种方式:特征提取,特征创造和特征选择。仔细观察上面的降维例子和上周我们讲解过的特征 选择,你发现有什么不同了吗?

特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,我们依然知道这个特 征在原数据的哪个位置,代表着原数据上的什么含义。

而PCA,是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某 些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓PCA都建立了怎样的新特征向 量,新特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而 来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。以PCA为代表的降维算法因此是 特征创造(feature creation,或feature construction)的一种。

可以想见,PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标 签之间的关系不具有意义。在线性回归模型中,我们使用特征选择。

PCA 代码实现

这里通过numpy直接计算,以及使用sklearn中集成的PCA降维两种实现方法,以更好地理解PCA降维过程。

如果你只需要理解和使用sklearn中的PCA,可以跳过该节,直接阅读Sklearn 中的PCA参数及方法。

  1. # coding:utf-8
  2. import numpy as np
  3. from sklearn.datasets import load_iris
  4. from sklearn.decomposition import PCA
  5. import matplotlib.pyplot as plt
  6. def pca(data, n_components):
  7.     '''
  8.     pca is O(D^3)
  9.     :param data: (n_samples, n_features(D))
  10.     :param n_dim: target dimensions
  11.     :return: (n_samples, n_components)
  12.     '''
  13.     # 减去均值,也可以进行标准化处理(除以方差)
  14.     data = data - np.mean(data, axis = 0, keepdims = True)
  15.   # 计算协方差矩阵
  16.     cov_matrix = 1/m * np.matmul(data.T, data)
  17.     # 计算协方差矩阵特征值及对于的特征向量
  18.     eig_values, eig_vector = np.linalg.eig(cov_matrix)
  19.     # print(eig_values)
  20.     # 对特征值进行排序,并取前n_components组
  21.     indexs_ = np.argsort(-eig_values)[:n_components]
  22.     picked_eig_values = eig_values[indexs_]
  23.     picked_eig_vector = eig_vector[:, indexs_]
  24.     data_ndim = np.matmul(data, picked_eig_vector)
  25.     return data_ndim
  26. # data 降维的矩阵(n_samples, n_features)
  27. # n_dim 目标维度
  28. # fit n_features >> n_samples, reduce cal
  29. if __name__ == "__main__":
  30.     data = load_iris()
  31.     X = data.data
  32.     Y = data.target
  33.     data_2d1 = pca(X, 2)
  34.     plt.figure(figsize=(8,4))
  35.     plt.subplot(121)
  36.     plt.title("my_PCA")
  37.     plt.scatter(data_2d1[:, 0], data_2d1[:, 1], c = Y)
  38.     sklearn_pca = PCA(n_components=2)
  39.     data_2d2 = sklearn_pca.fit_transform(X)
  40.     plt.subplot(122)
  41.     plt.title("sklearn_PCA")
  42.     plt.scatter(data_2d2[:, 0], data_2d2[:, 1], c = Y)
  43.     plt.show()

2c6fe989129cc6b97b607f0a60e48136.png

Sklearn中PCA重要参数及方法

n_components

n_components 是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的 值,一般输入[0, min(X.shape)]范围中的整数。

选择最好的n_components:累积可解释方差贡献率曲线

当参数n_components中不填写任何值,则默认返回min(X.shape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。

累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值。

使用sklearn自带鸢尾花数据集举例

08617f482f265858ca5b68bb3b02c7e0.png

  1. import numpy as np
  2. import pandas as pd 
  3. import matplotlib.pyplot as plt
  4. from sklearn.datasets import load_iris 
  5. from sklearn.decomposition import PCA
  6. iris = load_iris()
  7. y = iris.target
  8. X = iris.data 
  9. pca_line = PCA().fit(X) 
  10. plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_)) 
  11. plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
  12. plt.xlabel("number of components after dimension reduction"
  13. plt.ylabel("cumulative explained variance ratio")
  14. plt.show()

5882144bf5e7f1577423017d2d070786.png

最大似然估计自选超参数

除了输入整数,n_components还有哪些选择呢?矩阵分解的理论发展在业界独树一帜,数学大神Minka, T.P.在麻省理工学院媒体实验室做研究时找出了让PCA用最大似然估计(maximum likelihood estimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法。

  1. pca_mle = PCA(n_components="mle"
  2. pca_mle = pca_mle.fit(X)
  3. X_mle = pca_mle.transform(X)
  4. # 可以发现,mle为我们自动选择了3个特征
  5. pca_mle.explained_variance_ratio_.sum()

得到了比设定2个特征时更高的信息含量,对于鸢尾花这个很小的数据集来说,3个特征对应这么高的信息含量,并不需要去纠结于只保留2个特征,毕竟三个特征也可以可视化。

按信息量占比选超参数

输入[0,1]之间的浮点数,并且让参数svd_solver =='full',表示希望降维后的总解释性方差占比大于n_components 指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留97%的信息量,就可以输入n_components = 0.97,PCA会自动选出能够让保留的信息量超过97%的特征数量。

  1. pca_f = PCA(n_components=0.97,svd_solver="full"
  2. pca_f = pca_f.fit(X)
  3. X_f = pca_f.transform(X)
  4. pca_f.explained_variance_ratio_

svd_solve

Svd_solver是奇异值分解器,奇异值分解可以不计算协方差矩阵等等结构复杂计算冗长的矩阵,就直接求出新特征空间和降维后的特征矩阵。不计算协方差矩阵,直接找出一个新特征向量组成的n维空间,而这个  维空间就是奇异值分解后的右矩阵

右奇异矩阵 有着如下性质:

就是n_components,是我们降维后希望得到的维度。若 为 的特征矩阵, 就是结构为 的矩阵,取这个矩阵的前 行(进行切片),即将 转换为结构为 的矩阵。而 与原特征矩阵  相乘,即可得到降 维后的特征矩阵 。

Sklearn将降维流程拆成了两部分:一部分是计算特征空间 ,由奇异值分解完成,另一部分是映射数据和求解新特 征矩阵,由主成分分析完成,实现了用SVD的性质减少计算量,却让信息量的评估指标是方差,具体流程如下图:

8c3c2fcd3fda0fcd2cc76429c1045836.png

参数svd_solver是在降维过程中,用来控制矩阵分解的一些细节的参数。有四种模式可选:"auto", "full", "arpack", "randomized",默认"auto"

"auto"

基于X.shape和n_components的默认策略来选择分解器:如果输入数据的尺寸大于500x500且要提取的特征数小于数据最小维度min(X.shape)的80%,就启用效率更高的"randomized"方法。否则,精确完整的SVD将被计算,截断将会在矩阵被分解完成后有选择地发生

"full"

从scipy.linalg.svd中调用标准的LAPACK分解器来生成精确完整的SVD,适合数据量比较适中,计算时间充足的情况,生成的精确完整的SVD的结构为:

"arpack"

从scipy.sparse.linalg.svds调用ARPACK分解器来运行截断奇异值分解(SVD truncated),分解时就将特征数量降到n_components中输入的数值  ,可以加快运算速度,适合特征矩阵很大的时候,但一般用于特征矩阵为稀疏矩阵的情况,此过程包含一定的随机性。截断后的SVD分解出的结构为:

"randomized"

通过Halko等人的随机方法进行随机SVD。在"full"方法中,分解器会根据原始数据和输入的 n_components值去计算和寻找符合需求的新特征向量,但是在"randomized"方法中,分解器会先生成多个随机向量,然后一一去检测这些随机向量中是否有任何一个符合我们的分解需求,如果符合,就保留这个随机向量,并基于这个随机向量来构建后续的向量空间。这个方法已经被Halko等人证明,比"full"模式下计算快 很多,并且还能够保证模型运行效果。适合特征矩阵巨大,计算量庞大的情况。

利用inverse_transform实现降噪

降维的目的之一就是希望抛弃掉对模型带来负面影响的特征,而我们相信,带有效信息的特征的方差应该是远大于噪音的,所以相比噪音,有效的特征所带的信息应该不会在PCA过程中被大量抛弃。inverse_transform能够在不恢复原始数据的情况下,将降维后的数据返回到原本的高维空间,即是说能够实现”保证维度,但去掉方差很小特 征所带的信息“。利用inverse_transform的这个性质,我们能够实现噪音过滤。

准备工作
  1. from sklearn.datasets import load_digits 
  2. from sklearn.decomposition import PCA 
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. digits = load_digits() 
  6. digits.data.shape
  7. def plot_digits(data):
  8.    """
  9.    定义画图函数
  10.    """
  11.     fig, axes = plt.subplots(4,10,figsize=(10,4)
  12.                             ,subplot_kw = {"xticks":[],"yticks":[]}
  13.                             )
  14.     for i, ax in enumerate(axes.flat):
  15.         ax.imshow(data[i].reshape(8,8),cmap="binary"
  16. plot_digits(digits.data)

457e5d5a3ebe90d24d90884c109769ef.png

为数据加上噪音
  1. np.random.RandomState(42)
  2. #在指定的数据集中,随机抽取服从正态分布的数据 
  3. #两个参数,分别是指定的数据集,和抽取出来的正太分布的方差 
  4. noisy = np.random.normal(digits.data,2)
  5. plot_digits(noisy)

7ec0b4c3a9734ee159ee65ed1ce4d816.png

降维、逆转降维结果,实现降噪
  1. pca = PCA(0.5).fit(noisy) 
  2. X_dr = pca.transform(noisy) 
  3. without_noise = pca.inverse_transform(X_dr) 
  4. plot_digits(without_noise)

5416c08900c8c14fcec15879daa6606c.png

参考资料

[1]

https://www.cnblogs.com/pinard/p/6239403.html

[2]

https://blog.csdn.net/u013719780/article/details/78352262

[3]

http://www.360doc.com/content/13/1124/02/9482_331688889.shtml

[4]

鲁伟《机器学习公式推导与代码实现》

[5]

菜菜的sklearn课堂

-------- End --------

8e859635980c5ff9bfd35454fae0c035.png

b22b90e29fe9e103be0e58950300b12c.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/127179
推荐阅读
相关标签
  

闽ICP备14008679号