前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 7-3 求数据的主成分pca

机器学习入门 7-3 求数据的主成分pca

作者头像
触摸壹缕阳光
发布2019-11-13 10:20:47
5770
发布2019-11-13 10:20:47
举报
本系列是《玩转机器学习教程》一个整理的视频笔记。在前面两个小节中介绍了使用梯度上升法求解主成分分析相应的原理与公式推导,本小节会具体的编程实现使用梯度上升法求解主成分。

编程实现PCA

首先创建一个虚拟的测试样本,样本具有两个特征,并且两个特征之间具有相应的线性关系。这里之所以让两个特征之间具有一定的线性关系是因为对这样的两个特征进行降维效果会比较明显。

第一小节推导pca效用函数的过程中,对所有样本进行demean操作,也就是在保持所有样本分布的情况下将所有样本均值设置为0。通过demean操作让对效用函数的公式推导变的非常简单。

demean后的样本在两个特征维度上的均值都为0。

在使用梯度上升法之前,可以对梯度进行调试来验证我们上一小节推导的梯度上升法求解pca公式是否正确。

在进行梯度调试的时候将epsilon的值设置的非常小,这是因为我们需要求解的参数w是一个模为1的单位向量,相应的对于w的每一个维度值都会非常的小,因此在取待计算梯度两边的点的时候不能太大。

接下来就是真正的梯度上升法。

这里有两点需要注意:

  1. 在真正的梯度上升法中也有一个epsilon的参数,此时和调试梯度的epsilon是不一样的。
    1. 调试梯度的时候epsilon是在估计待求点梯度时候选取的左右两个点距离估计待求点的距离,由于此时w是单位向量,因此每一个维度都非常的小,因此在调试梯度的时候将epsilon设置的非常小;
    2. 在真正梯度上升法的过程中,不能够通过效用函数值的大小来决定是否达到最优值,因此我们设置了一个迭代次数的参数,当达到迭代次数就停止迭达,同时如果两次梯度更新的对应的效用函数差值比给定的epsilon还要小的话,就认为梯度更新没有什么实质的进展,也停止梯度的更新,因此此时的epsilon是梯度更新停止的一个条件;
  2. 在代码中有一个注意1的注释,通过前一小节的推导,我们需要找到一个样本映射的轴,即我们关注的是轴的方向,因此在公式推导的过程中,通过单位向量来表示轴。而在通常情况下,梯度上升法是没有这个过程的,每一次参数更新"w = w_last + eta * gradient",w的模很有可能不为1,因此在具体实现过程中需要每次让w的模为1,通过direction函数实现;

当然了在求解的过程中其实我们也可以不做direction的工作,其实这样w每次求出来本身也代表一个方向,只不过我们没有将w的模设置为1而已。如果不将w模设置为1,每次更新的时候w的模很大的程度上都要大于1,这样可能会导致搜索参数的过程不顺畅,为了让我们搜索到更加合理的结果,相应的就需要将eta学习率设置的非常小,相应的循环次数就需要设置的大一下,可想而知整个搜索的性能会下降,所以在这里我们遵循推导公式时候用到的假设条件,每一次让w称为一个单位方向向量。因此每次迭代将w模长设置为1是一个更好更合理的解决方案。这是在使用梯度上升法求解pca过程中第一个注意事项。

在执行梯度上升法的过程中我们需要初始化一个初始的w值,之前在使用梯度下降法求解线性回归问题初始化的初始值都是一个0向量。不过在求解pca的过程中,是不能将出参数初始化为一个0向量的,这是因为如果将w = 0代入梯度求导的公式中可以发现结果依然为0,也就是说每一次得到的梯度都是没有任何方向的0向量。其实很好理解,因为此时w = 0本身就是一个极值点,只不过是一个极小值点,但是我们需要求的是效用函数最大值位置的参数,很显然w = 0不是我们的解,而且极值点梯度一定是为0的,因此将初始点的位置当在梯度为0的极值点位置,参数就不会更新了,一直处在梯度为0的位置。在后续的一些算法中可能还会遇到这样的情况,初始的搜索位置不能为0,所以我们在开始的时候,随机初始化一个向量即可。这是在使用梯度上升法求解pca过程中第二个注意事项。

还有一点需要注意的,之前在使用梯度下降法求解线性回归模型的时候对样本数据进行了标准化,对样本进行标准化后的数据进行梯度下降法能够得到更好的效果,当时使用了Standardscaler的方式将样本的均值变成0方差变为为1。但是在使用梯度上升法求解pca的问题中,我们不能够使用Standardscaler进行数据的标准化,这是因为pca本身就是要求一个轴使得我们所有样本映射到那个轴之后的样本方差最大,但是一旦我们将我们的样本数据进行标准化了之后,样本的方差就变为1了,这个方差的最大值也就不存在了。所以在pca的过程中不使用Standardscaler进行样本的标准化。其实demean操作就是Standardscaler的一部分操作,少了将标准差变为1的另一半操作。这是在使用梯度上升法求解pca过程中第三个注意事项。

总的来说,在使用梯度上升求解pca具体实现中有是三个注意事项:

  1. 每次迭代都将参数向量转化为单位向量;
  2. 初始化参数的时候不能使用0向量;
  3. 不能使用Standardscaler进行标准化;

接下来调用两种梯度上升法,结果一致说明我们梯度推导公式是正确的。

在可视化的过程中由于w是一个值非常小的单位向量,为了得到更好的可视化效果整体乘上一个系数30。

这些样本映射到红色轴后得到的样本间的方差是最大的,这个红色的轴就是我们说的第一个主成分,由于这是我们求出的第一个主成分,所以我们也称之为第一主成分。

在创建虚拟数据的时候使用的是0.75这个斜率,这个斜率是特意选取的,最后尝试一下使用极端数据看一看结果,所谓的极端数据就是不添加额外的随机噪声。

这些点完全在一条直线上,但是他们分布在一个二维的平面上,如果此时使用pca将这些点映射的话,最终也会映射到这样一根直线上。这里选择0.75作为直线的斜率是因为此时的0.75是直线与x轴夹角的tan值,此时在构成的右下角直角三角形中,两个直角边分别是3和4,如果我们将其归一化,最终的结果一定是在横轴方向上是0.8,纵轴方向是0.6。所以我们可以通过这样的一个极端的测试用例来验证一下我们的算法是否正确。

首先需要进行demean操作,结果算出了轴的坐标为(0.8, 0.6),这说明我们算法整体是正确的。

最终这个轴和这些点所在的直线是重合的。本小节主要讲解了如何求出样本的第一个主成分,也就是把所有样本点映射到新的轴上保持映射后的样本方差是最大的。

在前面介绍梯度下降法的时候提到了批量梯度下降法、随机梯度下降法以及小批量梯度下降法,同理对于梯度上升法而言,也可以使用批量梯度上升法、随机梯度上升法以及小批量梯度上升法,本小节使用的是批量梯度上升法,即将每次对所有样本计算梯度。

本小节针对二维数据求出相应的一个主成分,对于二维数据来说映射到一维就已经足够了。但是如果此时是1000维的数据显然不能把他只映射到一维上,我们可能将其映射到10维或者100维上,也就是说除了要求出第一个主成分之外,可能还需要求出第二个主成分第三个主成分等其他的主成分,在下一小节会详细介绍如何求出后续其他的主成分。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档