最广泛的降维算法:主成分分析(PCA)【原理讲解+代码】

本文已收录于 机器学习笔记 系列,共计 20 篇,本篇是第 15 篇

现在我们已经学会了变换,剩下的问题是需要找到一组合适的基。

目标优化思路:找到一组最合适的基

去除平均值:减少计算量

PCA的最终目的是降维,得到前N个特征。所以数据本身的值并不是“很重要”。

我们为了减少计算量,将所有特征(每列)的均值变为0,达到减轻计算的目的。

举个例子,就好像我们要计算5个人成绩的离散程度,也就是方差,他们成绩分别是 100、98、102、99、101、100。他们的平均值是100分,我们直接去均值化,每个人都减去100分,处理后的分数是 0、-2、2、-1、1、0,现在计算方差是不是就方便许多。虽然分数变成个位数了对学生来说天壤差别,但是对我们来说并不关心平均值,而是关心数据的离散程度,并不影响。

计算协方差矩阵

补充知识:方差与协方差在PCA中的用途

问:提取最有价值的信息?

答:

那么分散如何用数学来表示?——方差

关于方差、协方差、协方差矩阵忘记的同学可以简单回顾下:数理统计:方差、协方差、协方差矩阵与相关系数

目标:要找一个轴,使得数据在这个轴上方差是最大的。

假设均值为0时,协方差如下:

问:为什么要假设均值为0?

答:其实这是一种数据的预处理,叫做去中心化,是一种减轻计算量的方法,可看文章最开始的部分。

推广开:如果我们要提取两个特征,那么就是让方差最大的轴作为主轴,方差次大的轴就是次轴。一次类推,需要提取多少特征就是按照方差降序排序。

但多个特征之间希望是不相关的,而协方差就可以用来衡量两个或两个以上数据间的独立性、相关性。

问:为什么要保证是不相关,完全独立的?

答:其实我们不单单是这里希望特征之间不相关,在数据预处理中我们也希望特征之间不相关。

举个例子,一张销售表,一列统计的是每天卖了多少元的东西,另一列是每天卖出多少角的东西,这两列存在着强相关关系,显然保留一列就可以了。

所以说,我们一直是希望特征之间不相关的,这是数据分析的人之常情。强相关数据是多余的。

总结下我们的目标问题:第一个轴:方差最大的方向。第二个轴:前提是必须是与第一个基正交的方向上,选择一个方差最大的。第三个轴也要与第一个基、第二个基都正交的前提下选择方差最大的。后面以此类推… …

将目标问题通过数学来解决:

如何得到这些包含最大差异性的主成分方向呢?答:协方差矩阵的特征值和特征向量

答:通过计算数据矩阵的协方差矩阵

接下来:

  • 计算数据矩阵的协方差矩阵
  • 得到协方差矩阵的特征值及特征向量,选择特征值最大(也即包含方差最大)的N个特征所对应的特征向量组成的矩阵
  • 将数据矩阵转换到新的空间当中

协方差矩阵的正对角线表示方差,负对角线表示两特征之间的关系。

eg:

然后对协方差矩阵进行矩阵分解,得到特征值和特征向量。

eg:

将协方差矩阵对角化:用数学特征处理我们的目标问题

为什么要对角化?——对角化后两两元素之间的协方差为0,通过这一数学特征将我们的目标问题转化为数学目标问题。

补充知识:如何对角化

实对称矩阵可以帮助我们对角化。

特征向量可以使得协方差矩阵变成对角阵。

eg:

$P=\begin{pmatrix}
1& -1\\
1& 1
\end{pmatrix}$

将特征值从大到小排列并保留N个特征值

将数据转换到N个特征向量组成的新空间中

基乘以原始数据得到当前降维后的结果。

 

Python实现

总结降维流程,为后续编码实现理清思路:

方差的分母为什么是n-1?

为了得到样本方差的无偏估计。(详细去看数学书)

代码下载

Python代码演示:PCA

代码源文件&数据源:降维算法

 

PCA使用方差作为信息量的衡量指标;SVD使用奇异值分解来找出空间V。

需要注意的是,主成分分析得出来的主成分很难通过一些现实的意义来解答,可依据主成分进行分类。如果在意因果关系与可解释性可用因子分析。

 

参考文献:

https://www.bilibili.com/video/BV1Zt41187bN(没讲原理,只有python实现)

https://www.bilibili.com/video/BV1PJ411G74g(讲了原理,没有代码)

作者: 高志远

高志远,23岁,男生,毕业于上海杉达学院电子商务系。

发表评论

邮箱地址不会被公开。