2022.02.23开始第十四章的学习
2022.02.24抽空学一会
2022.02.25继续学习
2022.02.26今天周六,可以多学一会;文中有些地方添加了英文原句,是因为我觉得中文翻译的不大到位或者不好理解,感觉差了那么一点意思
2022.02.27周天,继续学习,估计以后每章的学习天数都不会太少
2022.02.28本月最后一天,学习
2022.03.01赶快学完这一章吧
2022.03.02继续学习
2022.03.03继续学习
2022.03.04继续学习
2022.03.05又到周六了,估计一周之内能把本章弄完
2022.03.06继续学习
2022.03.07周一继续
2022.03.08周二继续,妇女节快乐
2022.03.09继续学习,尽量这两天就把剩下的一点给学完
2022.03.10结束吧
假设这两个特征分别是某物体的厘米长度 x1,和代表同一物体的英寸长度 x2。这实际上是一种高度冗余的表示(highly redundant representation),对于这两个单独的特征 x1 和 x2,它们表示的都是基本长度,也许我们想要做的是想要把数据减少到一维,只用一个数字来测量某物体的长度。
这个例子可能有点牵强,但是如果有成百上千个特征我们就很容易迷失自己到底有哪些特征,可能我们有不同的工程小组,第一个小组给出了 200 个特征,第二个和第三个小组分别给出 300 和 500 个特征,最后加起来就有 1000 个特征,这时就很难去了解某个特征是从哪个小组得到的,这时就比较容易产生高度冗余的特征。
如果这里厘米长度被四舍五入到它最接近的厘米,然后英寸长度也被四舍五入到最接近的英寸,这就是为什么这些例子并不是完美地落在一条直线上。因为在进行四舍五入时,最近的英寸和厘米之间有误差。如果我们能把数据从二维减少到一维就能减少这种冗余。
假如想做一个调查,或者对一些飞行员们做一个测试,可能会有一个特征 x1 ,代表的是这些飞行员的技能(pilot skill);另一个特征 x2 可能是飞行员的快乐程度(pilot enjoyment),也就是他们享受飞行的程度。那么这两个特征可能是高度相关的,不过真正关心的可能是这个方向上的,一个不同的,用来真正测量飞行员能力的特征,给它取名叫做能力(aptitude)。
还是那句话,如果特征高度相关,那么可能真的需要降低维数。如果将数据从二维降低到一维究竟意味着什么?现在把不同的样本用不同的颜色标出来:
在这时,通过降维想找出上图中这条绿色的线(看起来大多数样本所在的线),所有的数据都投影到了刚刚这条线上。通过这种做法能够测量出每个样本在线上的位置,现在能做的就是建立新特征 z1,只需要一个数就能确定 z1 所在的位置( z1 是一个新的特征,它能够指定绿线上每一个点的位置)。
也就是说,之前在上图标注位置的样本是 x(1),假设它是第一个样本 x(1),我们需要一个二维的数字(一个二维的向量)来表示这个原始 x(1),现在我们可以用 z(1) 来表示它,并且 z(1) 是一个实数。
同样地,如果 x(2) 是第二个样本,在此之前需要两个数来表示,但如果计算上这个黑色的叉的投影的话,只需要一个实数就可以了,也就是用 z(2) 来表示 x(2) 在线上的位置,以此类推,一直到第 m 个样本。
总结一下,如果允许通过投影到这条绿线上所有的原始样,本来近似原始的数据集,那么只需要一个数(实数)就能指定点在直线上的位置。
所以通过把这些样本都投影到绿色直线上,只用一个数字就能表示每个训练样本的位置。这是对原始数据集的一种近似,因为将这些样本都投影到了同一条线上,但现在需要使每个样本都保持为一个数字,这样就能把内存的需求减半(即数据空间需求,也就是存放数据的地方)。
另外,更有趣也重要的是,在之后的内容中我们将会了解到,这将让学习算法运行得更快,同时,比起减少内存使用以及磁盘空间需求来说,这也是数据压缩中更有趣的一种应用。
在典型的降维例子中,可能会有多达 1000D 的数据,然后需要把数据降到 100 维,但是由于绘图的局限性,无法将其可视化,所以这里只能用从 3D 降到 2D,从 2D 降到 1D 的例子。
假设有下图所示的数据集,其中有一系列的样本,它们是 3D 空间中的点,所以现在的样本是三维的,这可能不是很容易看出来所展示的图片有点像点云,但是这些数据其实大概都分布在一个平面上。所以这时降维的方法就是把所有数据都投影到一个二维平面上:
最后,需要 2 个数字来指定这些点在平面中的位置(要沿着平面的两条轴来指定),将这两个数分别记为 z1 和 z2。意思就是,现在可以把每个样本用两个数字表示出来,即下图坐标轴上的 z1 和 z2 。
因此数据可以用二维向量 z 来表示。下标 1 和 2 指代的是向量 z 是二维的向量(z1 和 z2),所以如果有某个具体的样本 z(i),那么它也是一个二维向量:
z = [ z 1 z 2 ] 即 z ( i ) = [ z 1 ( i ) z 2 ( i ) ] \begin{aligned} z=\left[\begin{matrix} z_1\\ z_2 \end{matrix}\right] \qquad 即\ \ z^{(i)}=\left[\begin{matrix} z_1^{(i)}\\ z_2^{(i)} \end{matrix}\right] \end{aligned} z=[z1z2]即 z(i)=[z1(i)z2(i)]
下面介绍降维的第二个应用:可视化数据(Data Visualization),在许多机器学习的应用中,它能够很好地帮助我们对学习算法进行优化,让我们能更好地了解数据,可以帮助我们更好地对数据进行可视化,这也是降维提供的另一个有用的工具。
假如收集了许多统计数据的大数据集,这是全世界各个国家的情况,所以,也许第一个特征 x1 是该国的GDP(Gross Domestic Product 国内生产总值), x2 是人均GDP, x3 是人类发展指数, x4 是平均寿命,x5 是贫穷指数,x6 是平均家庭收入等等。
假如有一个这样的巨大数据集,每一个国家有 50 个特征,而且有很多国家。同时对于 50 个特征很难绘制一个 50 维的数据,怎样才能很好地去理解、可视化以及检查这些数据呢?
如果使用降维方法,我们能做的就是:相比每个国家都使用 50 维的特征向量 xi 来表示,不如用一个不同的特征(比如向量 z)来表示它,这里的 z 向量是一个二维向量。
如果只能用一对数字 z1 和 z2 来概述这 50 个数字,能做的就是把这些国家在 2 维平面上表示出来。用这种方法来理解这些不同国家特征将会更好,所以我们需要做的是将这些数据从 50 维降低至 2 维,这样就可以画一个 2 维图来表示它。
这么做之后会发现,当观察降维算法的输出时,z 通常不会是我们所期望的具有物理意义的特征,通常需要弄清楚这些特征大致意味着什么,如果把那些特征画出来,就可以在图中找到答案:
在图中,每一个国家用一个二维点 z(i) 来表示.
可能会发现这条横轴(z1 轴),大致相当于国家总体规模(the overall country size),或者国家的总体经济活跃程度(the overall economic activity of a country),所以横轴代表的是 GDP(overall GDP),一个国家的经济规模(overall economic size of a country);
而这条纵轴(z2 轴)大概对应于人均 GDP(per person GDP),或者是每个人的幸福程度(per person well-being),或者说个人经济活跃程度(per person economic activity)。
可能会发现,这 50 个特征实际上只偏离为两个主要维度(2 main dimensions of the deviation),因此这里可能有一个像美国这样有较高 GDP 的国家(上图右上侧高亮数据点),而且它的人均 GDP 也很高;也有可能有一个像新加坡这样的国家(上图右上偏左高亮数据点),有很高的人均GDP,但是由于新加坡是一个较小的国家,所以新加坡的总体经济规模相较于美国就小得多。
我们不难发现,通过 z1 轴和 z2 轴,就能帮助我们最便捷地捕捉到在不同国家之中两个维度间的变化,例如,国家的整体经济活动,可以由国家的整体经济规模以及国民的幸福指数以及人均GDP,人均医疗保障等等数据来进行投影。
假如有这样的一个 R2 空间内的样本 x 数据集(上图左)。假设我们想对数据进行降维,从 2 维降到 1 维,即找到一条能够将数据投影到上面的直线。那什么是一条好的投影这些数据的直线呢?看起来像这样的一条直线(上图右)是个不错的选择。如果看一下这些点投影到直线上的过程可以发现,每个点到它们对应的直线上的投影点之间的距离是非常小的,也就是说,这些蓝色的线段非常短(下图左),因此我们认为它是个好的选择。
所以正式地说 PCA 做的就是找一个低维平面,在这个例子中是条直线,然后将数据投影在上面,使这些蓝色小线段长度平方最小。这些蓝色线段的长度,有时也称投影误差(the projection error)。所以 PCA 所做的就是试图寻找一个投影平面,对数据进行投影,使得能最小化这个距离。
另外,在应用PCA之前常规的做法是先进行均值归一化(mean normalization)和特征规范化(feature scaling),使得特征量 x1 和 x2 均值为 0,并且二者数值在可比较的范围内。为了对比刚画好的红线,这是另一条能够进行数据投影的直线,就是这条品红色的(magenta)线(上图右),如果用来投影数据的话,它的方向相当糟糕(this magenta line is a worse direction onto which to project data),所以如果像刚才做的那样将数据投影到这条品红色的直线上,得到的投影误差(也就是这些蓝色的线段)将会很大,因此这些点不得不移动很长一段距离才能投影到这条品红色直线上,这就是为什么主成成分分析方法(PCA)会选择像是红色这样的直线,而不是品红色直线。
下面更为正式地写一下 PCA 问题。PCA 做的就是,如果想将数据从2维降到1维,要试着找一个向量,假设是向量 u(i),它是属于 Rn 空间中的向量,在下面这个例子中就是 R2 空间。我们要找一个数据投影后,能够最小化投影误差的方向,在这个例子中,我们希望 PCA 能找到这个向量,将其标记成 u(1) :
所以当把数据投影到这条直线上时(向量 u(1) 进行延展的直线),最后会得到非常小的重构误差,参考数据(投影后得到的绿色样本标记)如上图所示。
此外,无论 PCA 给出的是 u(1) 还是 - u(1) 都没关系,因为两个方向都定义了相同的我们将投影数据的红色直线。
R e d u c e f r o m 2 – d i m e n s i o n t o 1 – d i m e n s i o n : F i n d a d i r e c 1 o n ( a v e c t o r u ( 1 ) ∈ R n ) o n t o w h i c h t o p r o j e c t t h e d a t a , s o a s t o m i n i m i z e t h e p r o j e c t i o n e r r o r . R e d u c e f r o m n – d i m e n s i o n t o k – d i m e n s i o n : F i n d k v e c t o r s u ( 1 ) , u ( 2 ) , . . . , u ( k ) o n t o w h i c h t o p r o j e c t t h e d a t a , s o a s t o m i n i m i z e t h e p r o j e c t i o n e r r o r . \begin{aligned} &Reduce\ \ from\ \ 2\text{\textendash}dimension\ \ to\ \ 1\text{\textendash}dimension:\\ &\qquad Find\ \ a\ \ direc1on\ \ (a\ \ vector\ \ u^{(1)}\in\R^n)\\ &\qquad onto\ \ which\ \ to\ \ project\ \ the\ \ data,\\ &\qquad so\ \ as\ \ to\ \ minimize\ \ the\ \ projection\ \ error.\\\ \\ &Reduce\ \ from\ \ n\text{\textendash}dimension\ \ to\ \ k\text{\textendash}dimension:\\ &\qquad Find\ \ k\ \ vectors\ \ u^{(1)},u^{(2)},...\ ,u^{(k)} \\ &\qquad onto\ \ which\ \ to\ \ project\ \ the\ \ data,\\ &\qquad so\ \ as\ \ to\ \ minimize\ \ the\ \ projection\ \ error.\ \ \end{aligned} Reduce from 2–dimension to 1–dimension:Find a direc1on (a vector u(1)∈Rn)onto which to project the data,so as to minimize the projection error.Reduce from n–dimension to k–dimension:Find k vectors u(1),u(2),... ,u(k)onto which to project the data,so as to minimize the projection error.
以上就是将数据从 2 维降到 1 维的例子。更通常的情况是,我们会有 N 维的数据,并且想要将其降到 K 维。这种情况下,我们不只是想找单个向量来对数据进行投影,而是想寻找 K 个方向来对数据进行投影,从而最小化投影误差。举个例子,如果有像这样的 3 维点云(下图左),那么也许要找出一些向量(本例中是一对向量),将这些向量用红线标记出来。
我们要找出一对向量,从原点延伸出来的 u(1) 和第二个向量 u(2)(上图右),二者一起定义了一个二维平面;在线性代数中,这个的正式定义是要找出一组向量 u(1)、u(2),也许一直到 u(k),随后将这些数据投影到这 k 个向量展开的线性子空间上(可以想成是找出 k 个方向而不是只寻找一个方向来对数据进行投影),因此我们可以用 k 个方向来定义平面中这些点的位置,这就是为什么对于 PCA 要找出 k 个向量来对数据进行投影。
因此,更正式地,在处理 PCA 时,我们想要找出能够最小化投影距离(数据点和投影后的点之间的距离)的方式来对数据进行投影。在这个 3 维例子中,给定一个点,将这个点投影到 2 维平面上,当完成之后,投影误差就是该点与 2 维平面上对应的投影点之间的距离(上图绿色标注部分),因此 PCA 做的是试图找出一条直线,或一个平面,或其它维的空间,然后对数据进行投影,以最小化平方投影(squared projection)(90度投影或者正交投影的误差(orthogonal projection error))。
一个值得注意的问题是,PCA和线性回归之间的关系如何?因为在介绍 PCA 的时候,有时会画这样的图表(下图),它看起来有点像线性回归,但是事实是 PCA 不是线性回归,尽管看上去有一些相似,但是它们确实是两种不同的算法。
当处理线性回归时(上图左),当给定某个输入特征量 x 时,来预测出某变量 y 的值,因此在线性回归中要做的是拟合一条直线来最小化点和直线之间的平方误差,所以要最小化的是这些蓝线之和的平方(上图左),注意是这些蓝线的垂直距离(vertical distance)(某个点与假设的得到预测之间的距离)。
与此同时,在处理 PCA 中,它要做的是试图最小化这些倾斜的蓝色直线的长度。实际上,它们是最短的正交距离(orthogonal distance),也就是点x与红色直线之间的最短距离,同时数据集不同,就会产生迥然不同的效果。
更一般的是,当处理线性回归时,我们要试图预测一个特别的变量 y,线性回归所要做的是,用所有的 x 值来预测 y;然而在 PCA 中,没有区别对待,没有什么特殊的变量 y 是要预测的,相反,我们的一系列特征 x1、x2 一直到 xn 都是同等对待,因此它们没有一个是特殊的。
如果有 3 维数据,并且想将这些数据从 3 维降到 2 维,因此,也许我们就要找出 2 个方向 u(1) 和 u(2),将数据投影到它们的平面,然后我们会得到 3 个特征量 x1、x2和 x3,所有这些都是同等对待的,没有特殊的变量 y 需要进行预测,因此 PCA 不是线性回归,尽管这之间有一定的相关性,使得它们看上去有点相似,但它们实际上是截然不同的算法。
总结: PCA 所做的就是试图找到一个低维的平面来对数据进行投影,以便最小化投影误差的平方,以及最小化每个点与投影后的对应点之间距离的平方值。
下一部分将会讨论如何才能真正找到对数据进行投影的低维平面。
从之前介绍的内容我们可以知道 PCA 所做的是尝试着找到一个低维子空间,对数据进行投影。
为了最小化平方投影(平方投影误差之和,即下图左蓝线所表示的距离的平方),我们想做的是找到一个向量 u(1) 指定这个方向(下图左),或者在 2 维空间想找到 2 个向量 u(1) 和 u(2) 来定义图示的平面(下图右)用于投射数据。
稍微提示一下,是什么减少了数据均值的维度,对左边的例子,给定在 R2 中的样本 x(i),那么我们要做的就是在 R 中找到一个数据集合 z(i)(代表我们的数据),使我们的均值从 2 维降到 1 维。在这个例子中(上图左),就是把数据投射到红线上,仅需一个数字来定义在线上的点的位置,叫这个数字为 z 或者 z(1) 。z 是一个实数,就像一个 1 维向量,所以 z(1) 仅涉及第一个主成分,即 1×1 矩阵,或者一个 1 维向量,仅需要一个数字来表明一个点的位置。
那么 PCA 要做的是,我们需要想出一个方法计算两个东西:一个是计算这些向量(例如左图的 u(1) 和右图中的的 u(1) 和 u(2));另一个是如何来计算这些数字 z 。
像上图左那样,将数据从2维降到了1维;像上图右那样,将数据从3维降到了2维,所以这些z向量现在是 2 维的,即:
z = [ z 1 z 2 ] \begin{aligned} z=\left[\begin{matrix} z_1\\ z_2 \end{matrix}\right] \qquad \end{aligned} z=[z1z2]
我们要有方法计算这些新的表示(即 z(1) 和 z(2) ),那么我们如何计算这些量呢?这里有一个数学上的证明,证明 u(1)、u(2)、z(1)、z(2) 的正确值是什么,但是这个数学证明非常复杂,所以这里就不做过多的介绍了。
压缩重现(Reconstruction from compressed representation)
在前面的内容中,我们一直把 PCA 作为压缩算法来讨论,它可以把一个 1000 维的数据压缩成 100 维的特征向量,或者把一个三维的数据压缩成二维表示。如果这是一个压缩算法,就应该有办法从这个压缩表示回到原来高维数据的一种近似表示,所以假设给定 100 维的 z(i),怎么回到原来的表示 x(i)(x(i) 可能是1000维的),这一节将讨论如何去做。
对于图中的样本 x(1) 、x(2) (上图左),把它们投影到这个一维面上(上图左绿线),现在我们只需要一个实数,比如 z1 来表示这些点被投影到这个一维面后的位置。
所以给定一个点 z(1),我们怎么回到原来的二维空间?具体而言,给定一个点 z∈R,我们能否把它映射回一个近似的表示 x∈R2(即原来的数据)。z 等于 UreduceT 乘以 x,如果要反过来求x 的话,这个方程就是 xapprox 等于 Ureduce 乘以 z。
x a p p r o x ⏟ R 2 = u r e d u c e ⏟ n × k ⋅ z ⏟ k × 1 ⏟ n × 1 ≈ x \begin{aligned} \large \underbrace {{\Large x}_{approx}}_{\R^2}&= \underbrace{ \underbrace{ {\Large u}_{reduce} }_{n\times k} · \underbrace{ {\Large z} }_{k\times 1} }_{n\times 1}\\ &\approx x \end{aligned} R2 xapprox=n×1 n×k ureduce⋅k×1 z≈x
再次检查一下维度,这里 Ureduce 是一个 n×k 维的向量,z 是一个 k×1 维的向量,把它们乘起来就得到了 n×1 维,所以 xapprox 是一个 n 维向量。并且PCA的意图就是,如果平方投影误差不太大,这样 xapprox 就会很接近原先用来求 z 的 x 值了。
用图片来表示的话,就是这个样子(上图右),返回去的这个过程得到的就是这些投影到绿线上的点,用原来的例子,从样本 x(1) 开始,然后得到这个 z(1),如果把 z(1)代入到上面的式子里得到 x(1)approx,那么这里的这个点(上图右绿线上的绿色样本)就是x(1)approx,它在 R2 空间里。如果做同样的步骤,这里就是x(2)approx(上图右绿线上的绿点橙色样本),这是一个对原始数据不错的近似。
以上就是如何从低维表示 z 回到未压缩的数据表示得到一个原来数据 x 的近似,我们把这个过程叫做原始数据的重构(Reconstruction of the original data),这一过程就是通过压缩表示重建原来的数据 x。所以给定一个未标注的数据集,现在我们已经知道如何应用 PCA,把高维的数据特征 x 映射到低维的表示 z,并且从这节已经学会如何把这些低维表示 z 映射回原来高维数据的一个近似表示。
接下来会讨论一些技巧,使得实际中更好地应用 PCA,特别是下一部分中,我们将会讨论如何选择 k ,也就是如何选择低维表示 z 的维度。
Choosing k: [ U , S , V ] = s v d ( S i g m a ) P i c k s m a l l e s t v a l u e o f k f o r w h i c h ∑ i = 1 k S i i ∑ i = 1 n S i i ≥ 0.99 ( 99 % o f v a r i a n c e i s r e t a i n e d ) \begin{aligned} &\textbf{Choosing\ \ k:}\\ &\blue{[\ U,S,V\ ] = svd\ ( \ Sigma\ )}\\ &Pick\ \ smallest\ \ value\ \ of\ \ k\ \ for\ \ which\\ &\qquad {\large \frac{\sum_{i=1}^kS_{ii}}{\sum_{i=1}^nS_{ii}}\ge0.99}\\ &(\ 99\%\ \ of\ \ variance\ \ is\ \ retained\ ) \end{aligned} Choosing k:[ U,S,V ]=svd ( Sigma )Pick smallest value of k for which∑i=1nSii∑i=1kSii≥0.99( 99% of variance is retained )