04 sklearn中的降维算法PCA和SVD
1概述
-
- 从什么叫“维度”说开来
- sklearn中的降维算法
2 PCA与SVD
2.1降维究竟是怎样实现?
2.2 重要参数n_components
2.1.1 迷你案例:高维数据的可视化
2.1.2 最大似然估计自选超参数
2.1.3 按信息量占比选超参数
2.3 PCA中的SVD
2.3.1 PCA中的SVD哪里来?
2.3.2 重要参数svd_solver 与 random_state
2.3.3 重要属性components_
2.4 重要接口inverse_transform
2.4.1 迷你案例:用人脸识别看PCA降维后的信息保存量
2.4.2 迷你案例:用PCA做噪音过滤
2.5 重要接口,参数和属性总结
3 案例:PCA对手写数字数据集的降维
4 附
4.1PCA参数列表
4.2PCA属性列表
4.3PCA接口列表
1 概述
1.1 从什么叫“维度”说开来
我们已经带大家认识了两个算法和数据预处理过程。期间,我们不断提到一些语言,比如说:随机森林是通过随机抽取特征来建树,以避免高维计算;再比如说,sklearn中导入特征矩阵,必须是至少二维;我们讲解特征工程,还特地提到了,特征选择的目的是通过降维来降低算法的计算成本……这些语言都很正常地被我用来使用,直到有一天,一个小伙伴问了我,”维度“到底是什么?
对于数组array和Series来说,维度就是功能shape返回的结果,shape中返回了几个数字,就是几维。索引以外的数 据,不分行列的叫一维(此时shape返回唯一的维度上的数据个数),有行列之分叫二维(shape返回行x列),也称为表。一张表最多二维,复数的表构成了更高的维度。当一个数组中存在2张3行4列的表时,shape返回的是(更高维,行,列)。当数组中存在2组2张3行4列的表时,数据就是4维,shape返回(2,2,3,4)。
数组中的每一张表,都可以是一个特征矩阵或一个DataFrame,这些结构永远只有一张表(二维),所以一定有行列,其中行是样本,列是特征。针对每一张表,维度指的是样本的数量或特征的数量,一般无特别说明,指的都是特征的数量。除了索引之外,一个特征是一维,两个特征是二维,n个特征是n维。
对图像来说,维度就是图像中特征向量的数量。特征向量可以理解为是坐标轴,一个特征向量定义一条直线,是一 维,两个相互垂直的特征向量定义一个平面,即一个直角坐标系,就是二维,三个相互垂直的特征向量定义一个空 间,即一个立体直角坐标系,就是三维。三个以上的特征向量相互垂直,定义人眼无法看见,也无法想象的高维空间。
降维算法中的”降维“,指的是降低特征矩阵中特征的数量。上周的课中我们说过, 是为了让算法运算更快,效果更好,但其实还有另一种需求:数据可视化。从上面的图我们其实可以看得出,图像和特征矩阵的维度是可以相互对应的,即一个特征对应一个特征向量,对应一条坐标轴。所以,三维及以下的特征矩阵,是可以被可视化的,这可以帮助我们很快地理解数据的分布,而三维以上特征矩阵的则不能被可视化,数据的性质也就比较难理解。
1.2 sklearn中的降维算法
sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块。在过去的十年中,如果要讨论算法进步的先锋,矩阵分解可以说是独树一帜。矩阵分解可以用在降维,深度学习,聚类分析,数据预处 理,低纬度特征学习,推荐系统,大数据分析等领域。在2006年,Netflix曾经举办了一个奖金为100万美元的推荐系统算法比赛,最后的获奖者就使用了矩阵分解中的明星:奇异值分解SVD。
SVD和主成分分析PCA都属于矩阵分解算法中的入门算法,都是通过分解特征矩阵来进行降维,它们也是我们今天要讲解的重点。虽然是入门算法,却不代表PCA和SVD简单:下面两张图是我在一篇SVD的论文中随意截取的两
页,可以看到满满的数学公式(基本是线性代数)。要想在短短的一个小时内,给大家讲明白这些公式,我讲完不 吐血大家听完也吐血了。所以今天,我会用最简单的方式为大家呈现降维算法的原理,但这注定意味着大家无法看 到这个算法的全貌,在机器学习中逃避数学是邪道,所以更多原理大家自己去阅读。
2 PCA与SVD
在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型 的表现可能会因此受影响。同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或者有一 些特征带有的信息和其他一些特征是重复的(比如一些特征可能会线性相关)。我们希望能够找出一种办法来帮助 我们衡量特征上所带的信息量,让我们在降维的过程中,能够即减少特征的数量,又保留大部分有效信息——将那 些带有重复信息的特征合并,并删除那些带无效信息的特征等等——逐渐创造出能够代表原特征矩阵大部分信息 的,特征更少的,新特征矩阵。
上周的特征工程课中,我们提到过一种重要的特征选择方法:方差过滤。如果一个特征的方差很小,则意味着这个 特征上很可能有大量取值都相同(比如90%都是1,只有10%是0,甚至100%是1),那这一个特征的取值对样本而 言就没有区分度,这种特征就不带有有效信息。从方差的这种应用就可以推断出,如果一个特征的方差很大,则说 明这个特征上带有大量的信息。因此,在降维中,PCA使用的信息量衡量指标,就是样本方差,又称可解释性方 差,方差越大,特征所带的信息量越多。
Var代表一个特征的方差,n代表样本量,xi代表一个特征中的每个样本取值,xhat代表这一列样本的均值。
面试高危问题 |
方差计算公式中为什么除数是n-1? 这是为了得到样本方差的无偏估计,更多大家可以自己去探索~ 无偏估计:是用样本统计量来估计总体参数时的一种无偏推断。估计量的数学期望等于被估计参数的真实值,则称此估计量为被估计参数的无偏估计,即具有无偏性 无偏估计的意义是:在多次重复下,它们的平均数接近所估计的参数真值。 |
2.1 降维究竟是怎样实现?
class sklearn.decomposition.PCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0,
iterated_power=’auto’, random_state=None)
PCA作为矩阵分解算法的核心算法,其实没有太多参数,但不幸的是每个参数的意义和运用都很难,因为几乎每个 参数都涉及到高深的数学原理。为了参数的运用和意义变得明朗,我们来看一组简单的二维数据的降维。
我们现在有一组简单的数据,有特征x1和x2,三个样本数据的坐标点分别为(1,1),(2,2),(3,3)。我们可以让x1和 x2分别作为两个特征向量,很轻松地用一个二维平面来描述这组数据。这组数据现在每个特征的均值都为2((1+2+3)/3=2),方差 则等于:
每个特征的数据一模一样,因此方差也都为1,数据的方差总和是2。
现在我们的目标是:只用一个特征向量来描述这组数据,即将二维数据降为一维数据,并且尽可能地保留信息量, 即让数据的总方差尽量靠近2。于是,我们将原本的直角坐标系逆时针旋转45°,形成了新的特征向量x1*和x2*组 成的新平面,在这个新平面中,三个样本数据的坐标点可以表示(√2,0),(2√2,0),(3√2,0)
可以注意到, x2*上的数值此时都变成了0,因此x2*明显不带有任何有效信息了(此时x2*的方差也为0了)。此时,x1*特征上的数据均值是 2√2,而方差则可表示成:
x1*上的数据均值为0(都在X轴上,所以为0),方差也为0。
此时,我们根据信息含量的排序,取信息含量最大的一个特征,因为我们想要的是一维数据。所以我们可以将x2* 删除,同时也删除图中的x2*特征向量,剩下的x1*就代表了曾经需要两个特征来代表的三个样本点。通过旋转原有特征向量组成的坐标轴来找到新特征向量和新坐标平面,我们将三个样本点的信息压缩到了一条直线上,实现了二维变一维,并且尽量保留原始数据的信息。一个成功的降维,就实现了。
不难注意到,在这个降维过程中,有几个重要的步骤:
过程 |
二维特征矩阵 |
n维特征矩阵 |
1 |
输入原数据,结构为 (3,2) 找出原本的2个特征对应的直角坐标系,本质是找出这2个特征构成的2维平面 |
输入原数据,结构为 (m,n) 找出原本的n个特征向量构成的n维空间V |
2 |
决定降维后的特征数量:1 |
决定降维后的特征(维度)数量:k |
3 |
旋转,找出一个新坐标系 本质是找出2个新的特征向量,以及它们构成的新2维平面 新特征向量让数据能够被压缩到少数特征上, 并且总信息量不损失太多 |
通过某种变化,找出n |