实验目的

1、了解数据降维的各种算法原理
2、熟练掌握sklearn.decomposition中降维方法的使用

实验原理

主成分分析算法(Principal Component Analysis, PCA)的目的是找到能用较少信息描述数据集的特征组合。它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分。这也就意味着,借助这种方法,就能通过更少的特征捕获到数据集的大部分信息。

主成分分析原理

设法将原来变量重新组合成一组新的相互无关的几个综合变量,同时根据实际需要从中可以取出几个较少的总和变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析,也是数学上处理降维的一种方法。主成分分析是设法将原来众多具有一定相关性(比如P个指标),重新组合成一组新的互相无关的综合指标来代替原来的指标。通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。最经典的做法就是用F1(选取的第一个线性组合,即第一个综合指标)的方差来表达,即Va(rF1)越大,表示F1包含的信息越多。因此在所有的线性组合中选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合,为了有效地反映原来信息,F1已有的信息就不需要再出现在F2中,用数学语言表达就是要求Cov(F1,F2)=0,则称F2为第二主成分,依此类推可以构造出第三、第四,……,第P个主成分。

sklearn中主成分分析的模型

class sklearn.decomposition.PCA(ncomponents=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)
sklearn.decomposition.PCA参数介绍
接下来我们主要基于sklearn.decomposition.PCA类来讲解如何使用scikit-learn进行PCA降维。PCA类基本不需要调参,一般来说,我们只需要指定要降维到的维度,或者希望降维后主成分的方差和占原始维度所有特征方差和的比例阈值就可以了。
现在我们介绍一下sklearn.decomposition.PCA的主要参数:
1) n_components:这个参数指定了希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的浮点数。当然,我们还可以将参数设置为”mle”,此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以使用默认值,即不输入n_components,此时n_components=min(样本数,特征数)。
2) whiten:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1。对于PCA降维本身来说,一般不需要白化。如果在PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
3) 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
,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。第二个是explainedvariance_ratio,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。

实验环境

  • Linux Ubuntu 16.04
  • Python 3.6
  • Anaconda 4
  • IPython Notebook

    实验内容

    本实验介绍了主成分分析算法PCA并以实例验证

    实验步骤

    1.打开终端模拟器,切换到/data目录下,开启jupyter notebook
    1. cd /data
    2. jupyter notebook —ip=’127.0.0.1’

2.创建一个 .ipynb文件
1.9 机器学习——PCA数据降维 - 图1
3.导入相关的可视化库

  1. %matplotlib inline
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns;sns.set()

数据准备

4.构建示例数据:

1.9 机器学习——PCA数据降维 - 图2
如上所示,第一组示例数据为一组样本量为200的随机的二维数组

PCA分析

5.导入 Scikit-Learn 中用于主成分分析的 PCA 模块,构建一个主成分分析模型对象,并进行训练。在这次构建中,我们设定 PCA 函数的参数 n_components 为2,这意味这我们将得到特征值最大的两个特征向量

1.9 机器学习——PCA数据降维 - 图3
n_components参数表示PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n

6.模型训练完成后, components_ 属性可以查看主成分分解的特征向量:

1.9 机器学习——PCA数据降维 - 图4

7.使用.shape方法查看矩阵形状

1.9 机器学习——PCA数据降维 - 图5

8.使用type()方法查看pca.components_类型

1.9 机器学习——PCA数据降维 - 图6

查看主成分的解释能力

9.explainedvariance代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分

1.9 机器学习——PCA数据降维 - 图7

主成分轴(Principal Axes)的可视化

10.我们可以通过如下方式将主成分分析中的特征向量描绘出来,下图中向量的起点为样本数据的均值

1.9 机器学习——PCA数据降维 - 图8

基于PCA的降维

11.将n_components设置为1,并使用fit()方法进行拟合

1.9 机器学习——PCA数据降维 - 图9

降维处理

12.将数据X转换成降维后的数据X_pca,并打印X和X_pca的矩阵形状

1.9 机器学习——PCA数据降维 - 图10

13.使用切片打印X的前十项

1.9 机器学习——PCA数据降维 - 图11

14.使用切片打印X_pca的前十项

1.9 机器学习——PCA数据降维 - 图12

PCA的逆向处理

15.将降维后的数据转换成原始数据

1.9 机器学习——PCA数据降维 - 图13

计算主成分的个数

16.导入sklearn.datasets模块中的load_digits函数

1.9 机器学习——PCA数据降维 - 图14

17.使用digits.data训练PCA模型并将结果可视化

1.9 机器学习——PCA数据降维 - 图15
至此,实验结束!