[Python嗯~机器学习]---降维和PCA算法

降维和PCA算法

现在我们考虑一个问题,现实生活中的一个事务的特征是非常多的,有可能是上百维或者更高的,有的特征与特征之间
也有一定的联系,庞大的特征和样本集就使得我们的训练需要大量的时间,这时候我们就想有没有办法加快我们的训练
减少时间呢?

引入我们今天的概念----降维,进行数据压缩,使用更少的计算机内存或磁盘,加快学习算法。

如何进行降维?

数据压缩:

对于一个事物的特征我们取出两个来举例,如上图,一个单位是厘米一个单位是英尺,这就看出我们的数据时
高度冗余的,因为这两个特征都是长度计量单位。
如果我们通过某一种计算把这两个单位映射成一个单位,如上图中的斜线,那么二维就变成了一维。
以此类推,如果成千上万的特征中,我们能找到不同特征之间的关系就可以用类似的思路降低整体样本的维度。因为
冗余的多个特征带来的信息量跟一个特征带来的信息量没有太大差别。

如何进行数据压缩?

把样本使用不同的颜色进行标注。如上图。
在这种情况下,降维是什么呢?
实际上,我们其实要找到一条直线,然后把所有的数据都投影到这条线上。我们通过计算每一个样本在直线上的位置
得到一个新特征----Z1 。这样就把两个特征映射到一个新特征上,我们不考虑他的计量单位。
这样原来不同计量单位组成的一个二维特征就转换成了一个一维特征。
特征的减少就会对计算空间要求减少,就会使我们的算法运行的更快。

同理,我们能从二维降到一维,也能从三维降到二维。
类推,我们也能从更高维降到低维。我们只介绍下三维降到二维。
如上图,我们有一个三维的数据集。图一从某一个方向看,这些数据差不多在一个平面附近,那么我们想如果把三维
的数据映射到这一个平面内是不是就变成二维了,是不是降维了?
就像上面我们构建一个新的特征 z 一样,如果我们构建两个向量 z1、z2 是不是也能表示这个平面上的新的特征点?

所以,这就是我们对降维的表面认识,我们通过将高维数据向低维平面甚至是直线上进行投影,然后使用低维平面上
的坐标来表示它们,这样就得到了对原始数据的新的特征表示,当然这些新的表示本身的维度已经不像原始数据那样
高了。这样,一方面我们可以将数据进行压缩,另一方面,可以加快我们的机器学习算法。

降维后如何可视化表示低维度的数据?

降维的另一个应用:数据可视化。
例如,我们有一个样本数据集,它是关于世界上各个国家的一些不同指标数据。第一个特征我们看到时国家的GDP,
我们可以把它看成是一个特征,比如就是x1,而x2就是人均GDP,x3是人类发展指数,x4是国民平均寿命,后面就是
x5,x6等等。
这个数据集实际上可能非常大,因为描述一个国家几乎可以有无数种数据,所以这个数据集可能它的特征可能有非常
多。有什么办法能直观理解数据呢?绘图的方式可视化。

使用降维技术,我们可以使用降维后的特征,来代替降维前的特征。比如,用 z 表示这些国家。如上图。这些二维的
新特征虽然不能够完全地表达所有的信息,但能尽量在二维上保证拿到所能保持的最多的信息量。也许,降维以后得
到的新的特征,如上图z1,z2,实际上并没有可解释的物理含义,它们是原特征的一种新的表达,是有损的,而且它
们和原特征之间的关系并不是简单的5%x1+10%x2+7%x3这种,因此当降维以后,z1,z2的具体特征意义其实是不可
解释的。绘图也只是让我们理解大体上这些特征是干什么的罢了。

-----------------------------------------------------------------------分隔线---------------------------------------------------------------------------

好了,说了这么多理论,那么我们现实中如何降维呢?

主成分分析法(PCA算法)


如上图,假设有这样的一个数据集,这个数据集含有二维实数的特征。假设我们想对这些数据进行降维,从目前的二
维降到一维。就是要找到一条直线,将数据都投影到这条直线上。

如何才能找到一条好的直线来投影这些数据呢?

PCA就是寻找一个低维的平面,上例是直线,把所有样本投射到平面上,使得点到面的距离的平方和最小。所有点到
面的线段的平方和被称为投影误差。

强调:PCA之前要先进行均值归一化和特征规范化,使得特征x1和特征x2的均值为0,取值范围在可比较范围内。

从上图我们可以看出,斜率为正的那条直线投影误差最小,而斜率为负的直线投影误差就很大。



PCA的目标是,如果将数据从二维降到一维,我们将试着寻找一个向量,u(i),这个向量属于Rn空间,比如我们这里
是R2。我们将要做的是找到一个方向,将数据投影过来,使得投影误差能够最小。所以,在这个例子中,我们希望
PCA能够找到左图中向量,u(i)。我们需要将数据点都投影到这个方向上的直线上。这样,整体的投影误差就会比较小。
推广到 k 维:
一般的情况下,我们有 n 维数据,如果要降到k维,我们就不仅仅只是寻找单个向量来对数据进行投影,而是要找到k
个向量,它们定义了一个k维的超平面,而我们要做的就是把原始的数据点向这个k维超平面上进行投影,而这个寻找
的过程其实就是最小化投影误差的过程。例如,所以,我们有3维数据点,如上图右。我们用两个向量,比如u1,u2,
定义一个二维平面,把所有的数据点投影到这个二维平面上。
那么正式定义:我们将寻找一组向量,u1,u2一直到uk,将数据投影到这k个向量张成的线性子空间上。所以,实际上
PCA就是在寻找k个向量来对数据进行投影,进而最小化投影距离,也就是原始数据点和投影后的点之间的距离,在通
俗讲就是最小化投影误差。

线性回归和PCA的关系


看上去PCA和线性回归有点像。但是,
PCA和线性回归完全不同。
线性回归是拟合一条直线,目标是最小化点和直线之间的平方误差。就是预测值和实际值之间的差距,通俗讲,就是
同一个样本 x,预测的 y 和真实的 y 之间的误差。
PCA中,先给一个直线,如右图,使得点到直线的距离的平方和最小。

再者:
1、线性回归中,我们是有一个确定的目标变量要去预测,所以所有的特征 x 都是为了要去预测目标变量 y 的值。
2、PCA中,并没有目标变量y,仅仅只有一系列的特征,并且特征没有权重的概念,它们在降维时均被同等地对待。
所以,PCA和线性回归是完全两个不同的算法,虽然它们在某些方面看上去有点类似,但它们之间并没有潜在的关联。

所以PCA就是去寻找一个低维平面,以使得我们的数据投影到它上面以后,使得投影误差的平方最小化,也就是最小化
每一个数据点和其投影后的点之间的距离的平方。

PCA的实现逻辑


在使用PCA之前,我们需要首先将数据进行预处理。
给定一个有m个样本的训练集合,如上图。首先,对数据进行均值标准化,同时根据实际的数据来看是否需要进行特征
缩放。我们在监督学习中已经学习过均值标准化和特征缩放。
均值标准化要计算各特征的均值,然后将特征都减掉它们的均值,这将使得所有的特征的均值都是0。而如果不同的特
征有非常不同的取值范围,例如,x1是房屋的面积,x2是卧室数量,那么我们就需要使得各个特征有一个相对可比的取
值范围。类似在监督学习中,我们把特征减去它的均值,然后我们再除以sj,这里的sj是某种用于衡量xj取值范围的一种
度量,所以它可以是最大值减最小值,一般用 xj 的标准差。

在PCA中,需要计算两个东西。
1、计算向量,如左图u1,右图u1 u2。
2、新的特征z。左图 z 是一维的,右图 z 是二维的。

具体底层计算步骤,本人也不是太懂,调用python中的PCA模块就好了。

现在看看PCA是怎么降维的

要把 n 维数据降维成 k 维数据,首先要做的就是,计算协方差矩阵,而协方差矩阵通常使用大写的希腊字母 Σ 来表
示。
得到了协方差矩阵以后,我们继续要做的就是计算这个矩阵的特征向量。计算矩阵的特征向量,我们一般使用svd
计算,svd本身是奇异值分解的意思。用python库中的SVD可以实现PCA算法。
那么,根据协方差矩阵的定义,我们的 Σ 其实是一个 n*n 的矩阵。SVD输出的是三个矩阵,U,S 和 V,其中我们最
需要的就是矩阵 U。矩阵 U 也是一个 n*n 的矩阵,而这个矩阵 U 的列被证明就是我们的目标u1,u2,u3…。所以,矩
阵 U 也是一个 n*n 的矩阵。
那么,要降维到 k 维,需要做的就是提取前 k 个向量,也就是取 u1,u2,u3,…uk,也就是投影平面的k中的k个方
向,通过这 k 个向量就可以张成我们目标的 k 维投影平面。

如上图,通过SVD,我们得到了一个n*n的矩阵 U,然后使用前 k 个向量,我们就可以得到目标投影平面。
那么剩下的事情就是我们要计算投影后的z。映射过程如上图式子,推导过程有些复杂暂且讨论。

PCA算法,首先进行均值标准化,确保每一个特征的均值都是0,而特征放缩则根据具体情况看是否需要。

强调一下,我们降维后,得到的数据相较于原始的数据是有损的,但是它已经是在这个k维度上保留了最多信息的,
也就是说不可能还有其他的 k 维表示能比 PCA 更加能够保留原始特征所表达的特征。
所以,相当于在 PCA 降维的时候,实际上是丢掉了各个特征之间的相关性,尽量把独有的信息保留下来,而把冗余
的信息扔掉。维度 k 决定了信息损失的大小。选择 k 我们后面再讨论。

确定主成分的数量


在PCA中,将n维特征降到 k 维平面上。k 是 PCA 算法的一个参数,k 称为主成分。如何选择 k?
首先,PCA要做的是试图去减小投影误差平方的平均值。同时,我们定义数据的总方差,上图式子二,就是我们训
练样本中所有数据点的长度平方,它表达的物理含义是:训练样本距离全零向量的平均距离。
在挑选合适的 k 的时候,一个常见的经验方法是,选择较小的值,使得这两者之间的比值小于 0.01。从另一个方面
说,常见的选择 k 的方式是,我们想让平均投影误差平方,除以数据的总方差。可以理解为上面的 99% 的信息量在
降维以后仍然被保留了。
对于很多数据集,0.01都是一个不错的选择,因为很多数据集内部有非常大的冗余性,或者说它们之间高度相关,所
以我们设置 0.01 可以从非常高维降到很低的维度,而仍然可以保留 99% 的方差性。

在尝试 k=1,k=2,如果合适的 k=20,那么这个过程就要进行20次。有没有一个合适的方法能更好的完成这个工作
呢?
在 PCA 的实现过程中使用了 SVD,而 SVD 中的 S 矩阵实际上也是一个 n*n 的方阵,如上图。对角线上的元素
就是 s11, s22,s33,…,snn 。
这时候确定主成分就简单了,如下图

总结一下:如果不是有特定理由确定 k 的取值的话,一般我们都是使用奇异值分解中的 S 矩阵,通过对 S 矩阵的对
角线的遍历,来检查什么样的 k 能够满足 99% 的方差性被保留了

应用PCA的一些建议

在监督学习中,PCA 算法可以减少要处理的数据维度,从而使得学习算法更加高效。
那么我们的办法就是:
1、观察已经被标记的训练集,同时把特征分离出来,暂时不看标注y。拿到一份没有标注的仅仅是特征的数据集,比
如我们这里就拿到了m个1万维的样本。
2、对这些数据应用 PCA 算法,我们会得到一个降维后的特征数据集,比如我们这里的 z1一直到 zm。就是从1万维集
降到了1千维的数据集。我们再把原来的标注信息拿回来,得到一个新的训练集,也就是z1,y1,  z2,y2,...,  zm, ym。
3、用这样的低维特征训练集来进行监督学习。

那么,如果有了新的样本,比如说测试集中的样本 x,为了进行预测或者分类,要把这个新样本 x 通过 PCA来 把它投
影到同一个低维平面上,以得到这个样本 x 在低维上的表示 z,那么在得到 z 之后,我们再把它传递给我们的假设函数
hθ(z),就能够得到最终的预测。

应用PCA算法


pca的应用:首先是数据压缩,将数据从高维降到低维,这样可以使得数据量变得更小,以节省存储它们所需的内存
或者硬盘空间。其次,它可以用于加速我们的学习算法。此时,可以使用方差性保留率来确定k的取值。
另一方面,很重要的应用就是数据可视化,虽然我们通常知道如何去画二维数据,或者三维数据,但实际中我们遇到
的数据集都会有比较多的特征维度,因此我们需要把它们降维到二维或者三维,然后再使用可视化技术将这些数据展
现出来。

误用:

举例,严重误用的场景,尝试使用PCA去防止过拟合。部分人认为PCA可以防止过拟合,其原因是:如果我们有xi,
可能我们有 n 个特征,但是如果我们压缩这些数据,而使用 zi 来表示这些样本,这样我们就减少了特征的数量,因
为我们降维到了k。这时候,既然我们的特征变少了,那么按照我们之前的学习内容,我们就会认为我们的模型变得
更加简单了,因此也就更加不会过拟合了,这样我们就达到了防止过拟合的目的。

首先,过拟合我们首先考虑正则化。

PCA的本质是为了消除特征之间的相关性或者说信息的冗余性,因此我们保留了99%的方差性的话,那么我们非正式
地理解,那就是虽然降维了,但是信息量并没有减少,原来特征有多少信息量,现在仍然有多少信息量,那么如果不
使用正则化,那么模型的复杂度仍然会很类似之前的情况。因此,对于过拟合的情况,我们还是应该依赖正则化这项
技术,而不是PCA。


很多时候,当人们设计一个机器学习应用的时候,会想着写下这样的计划:

  1. 收集训练数据
  2. 在训练数据上使用pca把特征降维
  3. 然后在降维后的数据上运行学习算法,比如逻辑回归
  4. 然后再在测试集上验证模型效果

很多时候,我们直接把 PCA 纳入应用。不过我们认为,更加合理的方案是,在引入 PCA 之前,应该先尝试使用原始
数据看看效果是怎样的,是不是有引入PCA的必要。我们应该在必须要使用PCA的情况下才引入PCA。这种必要的情
况一般是:学习算法因为特征维度太高而导致运行速度很慢,或者因为数据太大导致内存或者硬盘存储不够,我们才
应该使用PCA来压缩数据,把样本使用更少的维度来表示。

以上就是主成分分析(PCA)的全部内容了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值