首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》5.1.1 总体方差与贡献方差

关灯直达底部

在本小节中,我们将学习主成分分析算法的前四个步骤:数据标准化、构造协方差矩阵、获得协方差矩阵的特征值和特征向量,以及按降序排列特征值所对应的特征向量:

首先,我们加载第4章已经使用过的葡萄酒数据集:

接下来,我们将葡萄酒数据集划分为训练集和测试集——分别占数据集的70%和30%,并使用单位方差将其标准化。

通过上述代码完成数据的预处理后,我们进入第二步:构造协方差矩阵。此d×d维协方差矩阵是沿主对角线对称的,其中d为数据集的维度,此矩阵成对地存储了不同特征之间的协方差。例如,对群体进行描述的两个特征xj和xk可通过如下公式计算它们之间的协方差:

在此,μj和μk分别为特征j和k的均值。请注意,如果我们对数据集做了标准化处理,样本的均值将为零。两个特征之间的协方差如果为正,说明它们会同时增减,而一个负的协方差值则表示两个特征会朝相反的方向变动。例如,一个包含三个特征的协方差矩阵可记为(注意:此处Σ代表希腊字母sigma,在此请勿与求和符号混为一谈):

协方差矩阵的特征向量代表主成分(最大方差方向),而对应的特征值大小就决定了特征向量的重要性。就葡萄酒数据集来说,我们可以得到13×13维协方差矩阵的13个特征向量及其对应的特征值。

现在,我们来计算协方差矩阵的特征对。通过线性代数或微积分的相关知识我们知道,特征值V需满足如下条件:

Σv=λv

此处的特征值是λ一个标量。由于手工计算特征向量和特征值从某种程度上来说是一项烦琐且复杂的工作,我们将使用NumPy中的linalg.eig函数来计算葡萄酒数据集协方差矩阵的特征对:

应用numpy.cov函数,我们计算得到了经标准化处理的训练数据集的协方差矩阵。使用linalg.eig函数,通过特征分解,得到一个包含13个特征值的向量(eigen_vals)及其对应的特征值,特征向量以列的方式存储于一个13×13维的矩阵中(eigen_vecs)。

因为要将数据集压缩到一个新的特征子空间上来实现数据降维,所以我们只选择那些包含最多信息(方差最大)的特征向量(主成分)组成子集。由于特征值的大小决定了特征向量的重要性,因此需要将特征值按降序排列,我们感兴趣的是排序在前k个的特征值所对应的特征向量。在整理包含信息量最大的前k个特征向量前,我们先绘制特征值的方差贡献率(variance explained ratios)图像。

特征值λj的方差贡献率是指,特征值λj与所有特征值和的比值:

使用NumPy的cumsum函数,我们可以计算出累计方差,其图像可通过matplotlib的step函数绘制:

由下图可以看到,第一主成分占方差总和的40%左右;此外,还可以看出前两个主成分占总体方差的近60%:

虽然方差贡献率图像可以让我们联想到第4章中通过随机森林计算出的关于特征的重要程度,但我们应注意:PCA是一种无监督方法,这意味着我们可以忽略类标信息。相对而言,随机森林通过类标信息来计算节点的不纯度,而方差度量的是特征值在轴线上的分布。