Python AI 教学 | 主成分分析(PCA)原理及其应用

1

问题导入

假如你是一家淘宝店店主,你所负责运营的淘宝店2018年全年的流量及交易情况可以看成是一组记录的集合,其中每一天的数据是一条记录,(日期,浏览量,访客数,下单数,成交数,成交金额),这是一个六维的数据,但我们可以发现,“浏览量”和“访客数”往往具有较强的相关关系,而“下单数”和“成交数”也具有较强的相关关系,如果删除其中一个指标,不会丢失太多信息。我们知道,很多机器学习算法的复杂度和数据的维数有着密切关系,甚至与维数呈指数级关联。在实际机器学习中处理成千上万甚至几十万维的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。但降维意味着信息的丢失,不过鉴于实际数据(如上面所述的淘宝店数据)本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低,这就是我们要介绍的降维方法——PCA(主成分分析法)。

2

简介

主成分分析(Principal Component Analysis),是一种用于探索高维数据的技术。PCA通常用于高维数据集的探索与可视化,还可以用于数据压缩,数据预处理等。PCA可以把可能具有线性相关性的高维变量合成为线性无关的低维变量,称为主成分(principal components),新的低维数据集会尽可能的保留原始数据的变量,可以将高维数据集映射到低维空间的同时,尽可能的保留更多变量。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

3

数学原理

样本集 ?=?×?,表示 ,表示 ?个样例, 个样例, ?个特征维度 :

1、 首先对特征值进行归一化处理:

2、求样本集的协方差矩阵

所以C为一个n x n的矩阵

可以直观地看到,协方差矩阵C是一个对称矩阵,Cij=Cji,对角线是各个特征的方差

因为矩阵是一个实对称矩阵,所以具备实对称的特征:

1) C的不同特征值对应的特征向量是正交的;

2) C的特征值都是实数,特征向量都是实向量;

3) C可对角化,且相似对角阵上的元素即为矩阵本身特征值;

3、根据以上性质,我们可以得到个线性无关的非零特征向量e1,e2,...,en,这些特征向量构成的特征矩阵E=(e1 e2 ... en)满足:

上述的矩阵是一个对角矩阵,除了对角线有值,其他位置都是0。

对于特征矩阵X,因为可能存在大量的冗余数据,我们将它转换到另外一个特征空间,得到新的特征矩阵Z:

我们希望这个特征空间中各个特征彼此是线性无关的,也就是说各个特征向量是正交关系,那么在新的特征空间中,其协方差也应该是一个对角矩阵:

对角线是方差,其他位置是协方差,协方差为0,代表着两个向量正交。

假设特征空间转换的过程可以表达为Z=XU,矩阵D代入该表达式可以得到:

也就是说U=E,U就是矩阵C特征向量所组成的矩阵。矩阵D对角线上每个值就是矩阵C的特征值。

4、我们将D中的特征值按照从大到小,将特征向量从左到右进行排序,然后取其中前K个,经过压缩转换(Z=XU),就得到降维之后的数据矩阵Z:

X是m x n的矩阵,U是n x k的矩阵,Z是m x k的矩阵

4

算法实现

定义pca函数,并保存为py文件,文件命名pca.py:

函数介绍

(1)numpy.mean:计算沿指定轴的算术平均值

语法:

numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>)

示例:

(2)numpy.cov :在给定数据和权重下,估计协方差矩阵。

语法:

numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)

示例:

(3)numpy.argsort:返回对数组进行排序的索引。

语法:

numpy.argsort(a, axis=-1, kind='quicksort', order=None)

示例:

5

应用

现有150行,5组特征的鸢尾花数据(局部如下图所示),并保存在名为“testdata.txt”的文件中。现对其用PCA方法进行降维处理,并将其降维后的数据重构后与原数据进行比较,展示PCA的全过程,帮助大家理解PCA的思想。

1、在进行PCA之前,先将最后一列文本型数据去掉,得到只包含数值型数据的矩阵,定义一个删除列操作的函数并同样的保存在前述的pca.py文件中:

2、定义一个函数将数据集中的空值用均值填满,同样地,将其保存进pca.py文件里面:

3、新建一个py文件,并调用前面构造好的pca函数:

运行结果(局部):

4、利用pca函数中数据恢复语句将降维后的数据再恢复,并将其与原始数据进行对比,以图的形式展现,先将定义好的画图函数保存在pca.py文件中:

调用函数:

运行结果:

责编 | 老薛 张钒

原文发布于微信公众号 - 程序猿声(ProgramDream)

原文发表时间:2019-06-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券