1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 机器学习笔记(十四):主成分分析法(PCA)(2)

机器学习笔记(十四):主成分分析法(PCA)(2)

时间:2023-02-25 22:36:59

相关推荐

机器学习笔记(十四):主成分分析法(PCA)(2)

凌云时刻 · 技术

导读:这篇笔记将继续讲解机器学习中经常用到的降维算法PCA及PCA降噪的作用。

作者 | 计缘

来源 |凌云时刻(微信号:linuxpk)

高维数据向低维数据映射

我们再来回顾一下PCA降维的基本原理,首先要做的事情就是对样本数据寻找另外一个坐标系,这个坐标系中的每一个轴依次可以表达样本数据的重要程度,既主成分。我们取出前k个主成分,然后就可以将所有的样本数据映射到这k个轴上,既获得了一个低维的数据信息。

上面‍‍的是样‍‍本数据,该样本数据有m行,n个特征,既是一个n维的样本数据。

‍‍假设上面的是样本‍‍数据的‍‍‍‍主成分向量矩阵,每一行代表一个主成分向量,一共有k个主成分向量,每个主成分向量上有n个值。

我们已经推导出了求映射后的向量的大小,也就是每一行样本数据映射到该主成分上的大小为:

‍‍‍‍那如果将一行有n个特征的样本数据分别映射到k个主成分上,既得到有k个值的新向量,既降维后的,有k个特征的新样本数据。所以我们需要的就是矩阵的第一行‍‍和矩‍‍阵的每一行对应元素相乘然后再相加‍‍,矩阵的第二‍‍行和‍‍矩‍‍阵‍‍的每一行对应元素相乘然后再相加,以此类推就可以求出降维后的,m行k列的新矩阵数据:

就是降‍‍维后的数据,既然可以降维,那么我们也可从数学的角度将降维后的数据还原回去‍‍。是m‍‍行k列的矩阵‍‍,是k行‍‍n列的矩阵,所‍‍以就是‍‍还原后的m行n列的原矩阵。那为什么说是从数学角度来说呢,因为毕竟已经从高维降到了低维,那势必会有丢失的数据信息,所以还原回去的数据也不可能和原始数据一样的。

在PyCharm中封装PCA

我们在myML中新建一个类PCA

在Jupyter Notebook中使用封装的PCA

首先构建样本数据:

然后导入我们封装好的PCA类,训练主成分并根据主成分对样本数维:

看到我们非常简单地就把一个二维特征的样本数据根据主成分映射为了一维特征的样本数据。同时我们还可以将其恢复二维特征数据:

在前面提到过,从高维降到低维就已经有部分信息丢失了,所以再恢复回去后势必不会和原始数据一样。从上图中可以看到,恢复后的二维特征数据其实是在一条直线上,而这条直线其实就是原始样本数据的主成分。

Scikit Learn中的PCA

这一节我们来看看Scikit Learn中封装的PCA如何使用:

可以看到,我们封装PCA类时,使用标准的机器学习算法的模式,所以在使用Scikit Learn提供的PCA时,几乎是一样的。

使用真实的数据

这一节我们使用真实的数据来体会一下PCA的威力。我们使用Scikit Learn中提供的手写数字数据:

可以看到,Scikit Learn提供的手写数据是一个64维特征的样本数据,一共有1797行,也就是一个1797行,64列的矩阵。

我们先用KNN分类算法来计算这个样本数据:

从上面的代码可以看出,使用KNN算法对样本数据进行训练时通过网格搜索的邻近点为5个,使用了明可夫斯基距离,但是p是2,所以其实还是欧拉距离,并且没有使用距离权重。训练后的分类准确率为98.7%,在我的电脑上耗时38.1毫秒。

下面我们先简单粗暴的将这个64维特征的样本数据降至2维特征数据,然后再用KNN算法训练一下看看情况:

从上面的代码和结果可以看到,首先使用KNN算法训练的耗时从64维时的38.1毫秒降至了1.77毫秒,所以这验证了PCA降维的其中的减少计算时间的作用。但是当我们查看分类准确率的时候发现非常低,所以说明我们降维度的降的太低,丢失了太多的数据信息。那么PCA中的超参数n_components应该如何取呢?其实Scikit Learn的PCA提供了一个方法就是可以计算出每个主成分代表的方差比率:

比如通过explained_variance_ratio_我们可以知道通过PCA分析出的手写数据的前两个主成分的方差比率为14.6%和13.7%,加起来既标识降维后的数据只能保留了原始样本数据38.3%的数据信息,所以自然分类准确率很差了。那么如果我们使用PCA将64维数据计算出64个主成分,然后看看每个主成分的方差比率是如何变化的:

可以看到上面64个方差比率是从大到小排序的,而且后面的方差率越来越小,所以从这个数据我们其实已经可以计算出一个合适的主成分个数,使其方差比率之和达到一个极大值。我们将维数和方差率绘制出来看看:

从图中可以看到,当维度数在30左右的时候,方差率上升已经很平缓了,所以从这个图中都可以目测出,我们将64维特征的样本数据降维至30维左右是比较合适的。

其实Scikit Learn的PCA提供了一个参数,就是我们期望达到的总方差率为多少,然后会帮我们自动计算出主成分个数:

可以看到,我们期望的总方差率为95%时的主成分数为28。然后我们再使用KNN来训练一下降为28维特征的样本数据,看看准确率和时间为多少:

从上面代码的结果可以看到,在使用KNN训练28维特征的数据时耗时也只有2.44毫秒,但是分类准确率达到了98%。比64维特征的数据耗时减少了15倍,但是准确率只减少了0.6%。这个性价比是非常之高的,这就是PCA的威力所在。

Scikit Learn中的PCA‍

这张图是之前小节中生成的,其中蓝色的点是我们构建的原始样本数据,红色的点是经过PCA降维后,又通过PCA还原维度的样本数据。对这个图我们可以这样理解,原始样本数据的分布都在这条红色点组成的直线上下,而导致这些蓝色点没有落在红色直线上的原因就是因为数据有噪音,所以通过PCA降维其实是去除了数据的噪音。但这些噪音也是也是数据信息,所以通常我们说使用PCA对数据进行降维后会丢失一些数据信息。

下面我们通过一个实际的例子来看一下PCA的降噪过程。我们依然使用手写识别的例子,我们手写识别的样本数据中加一些噪音,然后看PCA如何去除这些噪音:

从图中可以看出,手写数字的识别度非常差。下面我们使用PCA对example_digits进行降噪处理:

当我们只保留50%主成分的时候,特征维度从64维降到了12维。然后我们再将其还原为64维,既过滤掉了噪音:

可以看到,此时图片中的手写数字的识别度有明显的提升。这就是PCA降噪的作用。

END

往期精彩文章回顾

机器学习笔记(十三):主成分分析法(PCA)

机器学习笔记(十二):随机梯度下降

机器学习笔记(十一):优化梯度公式

机器学习笔记(十):梯度下降

机器学习笔记(九):多元线性回归

机器学习笔记(八):线性回归算法的评测标准

机器学习笔记(七):线性回归

机器学习笔记(六):数据归一化

机器学习笔记(五):超参数

机器学习笔记(四):kNN算法

长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。