防止断更 请务必加首发微信:1716143665
关闭
讲堂
客户端下载
兑换中心
企业版
渠道合作
推荐作者

43 | PCA主成分分析(下):为什么要计算协方差矩阵的特征值和特征向量?

2019-03-25 黄申(加微信:642945106 发送“赠送”领取赠送精品课程 发数字“2”获取众筹列表。)
程序员的数学基础课
进入课程

讲述:黄申(加微信:642945106 发送“赠送”领取赠送精品课程 发数字“2”获取众筹列表。)

时长12:26大小11.39M

你好,我是黄申,今天我们继续来聊 PCA 主成分分析的下半部分。

上一节,我们讲解了一种特征降维的方法:PCA 主成分分析。这个方法主要是利用不同维度特征之间的协方差,构造一个协方差矩阵,然后获取这个矩阵的特征值和特征向量。根据特征值的大小,我们可以选取那些更为重要的特征向量,或者说主成分。最终,根据这些主成分,我们就可以对原始的数据矩阵进行降维。

PCA 方法的操作步骤有些繁琐,并且背后的理论支持也不是很直观,因此对于初学者来说并不好理解。考虑到这些,我今天会使用一个具体的矩阵示例,详细讲解每一步操作的过程和结果,并辅以基于 Python 的核心代码进行分析验证。除此之外,我还会从多个角度出发,分析 PCA 方法背后的理论,帮助你进一步的理解和记忆。

基于 Python 的案例分析

这么说可能有一些抽象,让我使用一个具体的案例来帮你理解。假设我们有一个样本集合,包含了 3 个样本,每个样本有 3 维特征 x1x2x3

在标准化的时候,需要注意的是,我们的分母都使用 m 而不是 m-1,这是为了和之后 Python 中 sklearn 库的默认实现保持一致。

首先需要获取标准化之后的数据。

第一维特征的数据是 1,2,-3。平均值是 0,方差是

1+4+932.16

标准化之后第一维特征的数据是 1/2.16=0.463,2/2.16=0.926,-3/2.16=-1.389。以此类推,我们可以获得第二个维度和第三个维度标准化之后的数据。

当然,全部手动计算工作量不小,这时可以让计算机做它擅长的事情:重复性计算。下面的 Python 代码展示了如何对样本矩阵的数据进行标准化。

from numpy import *
from numpy import linalg as LA
from sklearn.preprocessing import scale
# 原始数据,包含了 3 个样本和 3 个特征,每一行表示一个样本,每一列表示一维特征
x = mat([[1,3,-7],[2,5,-14],[-3,-7,2]])
# 矩阵按列进行标准化
x_s = scale(x, with_mean=True, with_std=True, axis=0)
print(" 标准化后的矩阵:", x_s)
复制代码

其中,scale 函数使用了 axis=0,表示对列进行标准化,因为目前的矩阵排列中,每一列代表一个特征维度,这点需要注意。如果矩阵排列中每一行代表一个特征维度,那么可以使用 axis=1 对行进行标准化。

最终标准化之后的矩阵是这样的:

接下来是协方差的计算。对于第 1 维向量的方差,有

0.4632+0.9262+(1.3892)21.5

第 1 维和第 2 维向量之间的协方差是

0.463×0.508+0.926×0.889+(1.389)×(1.397)21.5

以此类推,我们就可以获得完整的协方差矩阵。同样的,为了减少推算的工作量,我们可以使用 Python 代码获得协方差矩阵。

# 计算协方差矩阵,注意这里需要先进行转置,因为这里的函数是看行与行之间的协方差
x_cov = cov(x_s.transpose())
# 输出协方差矩阵
print(" 协方差矩阵:\n", x_cov, "\n")
复制代码

和 sklearn 中的标准化函数 scale 有所不同,numpy 中的协方差函数 cov 除以的是 (m-1),而不是 m。最终完整的协方差矩阵是:

然后,我们要求解协方差矩阵的特征值和特征向量。