机器学习(十四)无监督学习:降维


Log

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结束吧


  • 本篇文章将介绍第二种类型的无监督学习问题——降维(Dimensionality Reduction)

一、目标一:数据压缩(Motivation Ⅰ: Data Compression)

  • 需要使用降维的原因:
    • 数据压缩(Data Compression),数据压缩不仅可以对数据进行压缩,使得数据占用较少的内存或硬盘空间,还能对学习算法进行加速。
  • 下面先谈谈降维是什么:

1. 降维(Dimensionality Reduction)

①二维降到一维

  • 以下图为例,假设收集了一个数据集,它有很多很多的特征,图中只画出其中两个特征。
    在这里插入图片描述

  • 假设这两个特征分别是某物体的厘米长度 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)]

二、目标二:可视化(Motivation Ⅱ: Data Visualization)

  • 下面介绍降维的第二个应用:可视化数据(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,人均医疗保障等等数据来进行投影。

三、主成分分析问题(Principal Component Analysis problem)

  • 对于降维问题来说,目前最流行最常用的算法是一个叫做主成分分析法(PCA - Principal Components Analysis) 的算法,它可以用来做降维操作,也可以用来实现数据压缩。

1. 公式描述(formulation)

  • 主要内容: PCA 问题的公式描述(试着用公式准确地表述 PCA 的用途)。

①直观理解

在这里插入图片描述

  • 假如有这样的一个 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  2dimension  to  1dimension:Find  a  direc1on  (a  vector  u(1)Rn)onto  which  to  project  the  data,so  as  to  minimize  the  projection  error.Reduce  from  ndimension  to  kdimension: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))。

2. PCA 与线性回归的比较

  • 一个值得注意的问题是,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 所做的就是试图找到一个低维的平面来对数据进行投影,以便最小化投影误差的平方,以及最小化每个点与投影后的对应点之间距离的平方值。

  • 下一部分将会讨论如何才能真正找到对数据进行投影的低维平面。

3. 数据预处理(Data preprocessing)

  • 在使用PCA之前,首先要做的是进行数据预处理。
    Data    preprocessing T r a i n i n g    s e t : x ( 1 ) , x ( 2 ) , . . .   , x ( m ) P r e p r o c e s s i n g   (   f e a t u r e    s c a l i n g / m e a n    n o r m a l i z a t i o n ) μ j = 1 m ∑ i = 1 m x j ( i ) R e p l a c e    e a c h    x j ( i )    w i t h    x j − μ j . I f    d i f f e r e n t    f e a t u r e s    o n    d i f f e r e n t    s c a l e s    ( e . g .    x 1 =   s i z e    o f    h o u s e ,    x 2 = n u m b e r    o f    b e d r o o m s ) , s c a l e    f e a t u r e s    t o    h a v e    c o m p a r a b l e    r a n g e    o f    v a l u e s . x j ( i ) ← x j ( i ) − μ j s j \begin{aligned} &\large{\textbf{Data\ \ preprocessing}}\\ &Training\ \ set:x^{(1)},x^{(2)},...\ ,x^{(m)}\\ &Preprocessing\ (\ feature\ \ scaling/mean\ \ normalization)\\ &\qquad \large{\mu_j=\frac{1}{m}\sum^m_{i=1}x_j^{(i)}}\\ &\qquad Replace\ \ each\ \ x_j^{(i)}\ \ with\ \ x_j-\mu_j.\\ &\qquad If\ \ different\ \ features\ \ on\ \ different\ \ scales\ \ (e.g.\ \ \\ &\qquad x_1=\ size\ \ of\ \ house,\ \ x_2=number\ \ of\ \ bedrooms),\\ &\qquad scale\ \ features\ \ to\ \ have\ \ comparable\ \ range\ \ of\ \ values.\\ &\qquad \large{x_j^{(i)}\leftarrow \frac{x_j^{(i)}-\mu_j}{s_j}} \end{aligned} Data  preprocessingTraining  set:x(1),x(2),... ,x(m)Preprocessing ( feature  scaling/mean  normalization)μj=m1i=1mxj(i)Replace  each  xj(i)  with  xjμj.If  different  features  on  different  scales  (e.g.  x1= size  of  house,  x2=number  of  bedrooms),scale  features  to  have  comparable  range  of  values.xj(i)sjxj(i)μj
  • 给定一个交易例子的集合,一定要做的一个重要的事是执行均值标准化(mean normalization),依据于数据,可能也要进行特征缩放(feature scaling)。这两个过程与有监督学习中的均值标准化过程与特征缩放的过程是很相似的,除了我们现在是对未标记数据(unlabeled data) 做的(x(1) 到 x(m))这一点以外,现在的两个过程和之前的相比实际上确实是相同的过程。
  • 对于均值标准化,首先计算每个特征的均值,我们用 x 减去它的均值取代每个特征 x,这将使每个特征的均值正好为 0。
  • 接下来,如果不同的特征有非常不相同的取值范围,例如对于先前的例子, x1 是房子的尺寸,x2 是卧室的数量,我们也可以缩放每个特征使它们具有一个相当的取值范围。与之前的有监督学习相似,我们选择 xj(i) 也就是第 j 个特征,这样我们能够减去均值,然后在上面除以 sj(特征 j 的一些测量值),于是它是最大值减去最小值(上面表达式中的最后一行),或更普遍地, sj 是一个特征 j 的标准偏差(standard deviation)
  • 做完这一系列的数据预处理之后,就可以开始执行 PCA 算法了。

4. 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) 的正确值是什么,但是这个数学证明非常复杂,所以这里就不做过多的介绍了。

②具体的应用过程

  • 下面描述一下具体的应用过程,为了计算向量 u(1)、u(2) 和 z ,下面讲的是这个求解过程。
    R e d u c e    d a t a    f r o m    n – d i m e n s i o n s    t o    k – d i m e n s i o n s C o m p u t e    “   covariance    matrix   ” : Σ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T C o m p u t e    “   eigenvectors   ”    o f    m a t r i x    Σ : [   U ,   S ,   V   ] = s v d   (   S i g m a   ) ; \begin{aligned} &Reduce\ \ data\ \ from\ \ n\text{\textendash}dimensions \ \ to\ \ k\text{\textendash}dimensions\\ &Compute\ \ “\ \textbf{covariance\ \ matrix\ }”:\\ &\qquad \large{\Sigma=\frac{1}{m}\sum^n_{i=1}(x^{(i)})(x^{(i)})^T}\\ &Compute\ \ “\ \textbf{eigenvectors\ }”\ \ of\ \ matrix\ \ \Sigma:\\ &\qquad \blue{[\ U,\ S,\ V\ ] = svd\ (\ Sigma\ );} \end{aligned} Reduce  data  from  ndimensions  to  kdimensionsCompute   covariance  matrix :Σ=m1i=1n(x(i))(x(i))TCompute   eigenvectors   of  matrix  Σ:[ U, S, V ]=svd ( Sigma );
  • 想把 n 维的数据降到 k 维度,首先要做的是计算协方差(the covariance matrix) ,这个协方差通常用希腊字母中大写的 Sigma 表示( Σ 表示一个矩阵,看起来和求和符号一样,但实际上不是一个东西)。
  • 下面主要说明如何计算这个矩阵。比如说想存储它到一个 Octave 变量中,这个变量叫做 Sigma。在 Octave 中,使用的上面的命令(蓝色标注)计算矩阵 Σ 的特征向量,其中 svd 代表奇异值分解(singular value decomposition),这是一个更加高级的分解算法,也是一个很高级的线性代数的应用(多于我们需要了解的部分)。当 Σ 等同于这里的矩阵时,有几个可以计算高维向量的方法。
  • 在线性代数中,存在特征向量(eigenvectors) 这一概念,同时在 Octave 中还存在一个叫 eig 的函数用于计算相同的事,事实上 svd 函数和这个 eig 函数会给出相同的向量,但是 svd 在数值上更稳定,所以我们更倾向于使用 svd 。其实使用 eig 函数也可以,但是当我们使用 eig 函数求一个协方差矩阵时,sigma 会给我们一个相同的结果,这是因为协方差矩阵总是满足一个数学上的性质,叫做正定矩阵(symmetric positive definite)
  • 目前并不需要了解正定矩阵的具体含义,但是 svd 函数和 eig 函数是不同的,当它们被运用到协方差矩阵时,它们被证明总是满足这个数学性质,这两个函数给予相同的结果;我们只需要知道上面的蓝色命令应该应用在 Octave 中,如果想要应用在其它语言中,我们应该找到数值线性代数库来计算 SVD(奇异值分解)。
  • 再补充一些细节,协方差矩阵 sigma 将会是一个 n×n 的矩阵。一个理解的方法是,x(i) 是一个 n×1 的向量,它的转置是 1×n 的向量,所以二者相乘的结果是一个 n×n 的矩阵。svd 输出的是三个矩阵 U、S、V,我们真正需要的是这个输出 U,U 矩阵也将是一个 n×n 的矩阵,当观察 U 矩阵的列,可以发现这个矩阵的列将是这些向量 u(1)、u(2) 等等等。
    u = [ ∣ ∣ ∣ ∣ u ( 1 ) u ( 3 ) u ( 3 ) . . . u ( n ) ∣ ∣ ∣ ∣ ] u ∈ R n × n \begin{aligned} {\Large u}=\left[\begin{matrix} |&|&|&&|\\ u^{(1)}&u^{(3)}&u^{(3)}&...&u^{(n)}\\ |&|&|&&|\\ \end{matrix}\right]\qquad u\in\R^{n\times n} \end{aligned} u=u(1)u(3)u(3)...u(n)uRn×n
  • 如果想从 n 维到 k 维减少数据的维数,需要做的是提取前 k 个向量( u(1) … u(k) ),这给了我们 k 个方向,即我们想投影数据的方向。svd 的数值线性过程的剩下的过程就是获得矩阵 U (列 u(1) 到 u(k) )。
  • 现在集中描述剩下的过程:从 svd 线性代数的数值过程中,得到矩阵 U、S 和 D ,我们将用这个矩阵的前 k 个列获取向量 u(1) 到 u(k) 。现在我们要做的其它事情是获取我们的原始实数域数据集 x,找到一个低维度表示的 z (数据是 k 维的):
    x ∈ R n    →    z ∈ R k \begin{aligned} \Large x\in\R^n\ \ \rightarrow \ \ z\in\R^k \end{aligned} xRn    zRk
  • 对于这些数据,我们要做的是获取 U 矩阵的前 k 列来构建一个 n×k 的矩阵,命名为 Ureduce ,可以把它看做是 U 矩阵的降维版本。
    U r e d u c e = [ ∣ ∣ ∣ ∣ u ( 1 ) u ( 3 ) u ( 3 ) . . . u ( k ) ∣ ∣ ∣ ∣ ] ⏟ n × k \begin{aligned} {\Large U_{reduce}}=\underbrace{\left[\begin{matrix} |&|&|&&|\\ u^{(1)}&u^{(3)}&u^{(3)}&...&u^{(k)}\\ |&|&|&&|\\ \end{matrix}\right]}_{n\times k} \end{aligned} Ureduce=n×k u(1)u(3)u(3)...u(k)
  • 我们将用它来对数据进行降维,通过 U 的降维矩阵转置乘以 X 来计算 z,也就是说这个 U 矩阵的转置最终写成行向量(从 u(1) 的转置到 u(k) 的转置),然后乘以 X,最终得到向量 z 。为了确保这些维数有意义,矩阵 U 的转置是 k×n 维的,x 是 n×1 维的,最后的结果是 k×1 维的,也就是说,z 是一个 k 维向量。
    z = U r e d u c e T   x   = [ ∣ ∣ ∣ ∣ u ( 1 ) u ( 3 ) u ( 3 ) . . . u ( k ) ∣ ∣ ∣ ∣ ] T   x   = [ — — u ( 1 ) — — — — u ( 2 ) — — . . . — — u ( k ) — — ] ⏟ k × n x ⏟ n × 1 ⏟ k × 1 \begin{aligned} {\Large z}&=U_{reduce}^T\ {\Large x}\\\ \\ &=\left[\begin{matrix} |&|&|&&|\\ u^{(1)}&u^{(3)}&u^{(3)}&...&u^{(k)}\\ |&|&|&&|\\ \end{matrix}\right]^T\ {\Large x}\\\ \\ &= \underbrace{ \underbrace{ \left[\begin{matrix} ——u^{(1)}——\\ ——u^{(2)}——\\ ...\\ ——u^{(k)}——\\ \end{matrix}\right] }_{k\times n} \underbrace{ {\Large x} }_{n\times 1} }_{k\times 1} \end{aligned} z  =UreduceT x=u(1)u(3)u(3)...u(k)T x=k×1 k×n u(1)u(2)...u(k)n×1 x
  • 进行均值归一化(确保每一个特征均值都为 0)和可选的特征缩放(如果数据呈现不同范围的值,就应该去做特征缩放)后(预处理完成之后),我们计算这个载体矩阵 Sigma 。
    A f t e r    m e a n    n o r m a l i z a t i o n    ( e n s u r e    e v e r y    f e a t u r e    h a s z e r o    m e a n )    a n d    o p t i o n a l l y    f e a t u r e    s c a l i n g : S i g m a   =   1 m ∑ i = 1 m ( x ( i ) ) ( x ( i ) ) T [   U ,   S ,   V   ] = s v d   (   S i g m a   ) ; U r e d u c e = U ( : , 1 : k ) ; z = U r e d u c e ’ ∗ x ; \begin{aligned} &After\ \ mean\ \ normalization\ \ (ensure\ \ every\ \ feature\ \ has\\ &zero\ \ mean)\ \ and\ \ optionally\ \ feature\ \ scaling:\\ &\qquad {\large \blue{Sigma\ =\ }\frac{1}{m}\sum^m_{i=1}(x^{(i)})(x^{(i)})^T}\\ &\qquad \blue{[\ U,\ S,\ V\ ] = svd\ (\ Sigma\ );}\\ &\qquad \blue{Ureduce = U(:,1:k); }\\ &\qquad \blue{z = Ureduce’*x;} \end{aligned} After  mean  normalization  (ensure  every  feature  haszero  mean)  and  optionally  feature  scaling:Sigma = m1i=1m(x(i))(x(i))T[ U, S, V ]=svd ( Sigma );Ureduce=U(:,1:k);z=Ureducex;
  • 如果矩阵 x (训练集)被写成 x 的转置的形式,那么这个协方差矩阵 Sigma 实际上有一个非常好的向量化实现,在 Octave 中甚至可以让 Sigma 等于 1 除以 m 乘以 x 的转置再乘以 x:
    x = [ — — x ( 1 ) T — — — — x ( 2 ) T — — . . . — — x ( m ) T — — ]   S i g m a = ( 1 / m ) ∗ x ′ ∗ x ; \begin{aligned} x=\left[\begin{matrix} ——x^{(1)^T}——\\ ——x^{(2)^T}——\\ ...\\ ——x^{(m)^T}——\\ \end{matrix}\right]\\\ \\ \blue{Sigma = (1/m)*x'*x;} \end{aligned} x=x(1)Tx(2)T...x(m)T Sigma=(1/m)xx;
  • 上面这个简单的表达式就是计算矩阵 Sigma 的向量化实现(是正确的向量化,可以通过数值测试或者尝试用 Octave 或者用数学证明来检验其正确性)。
  • 我们能够应用 svd 程序得到 U、S、V,然后先得到要降维度矩阵 U 的前 k 列,最终这个定义了我们如何从一个特征向量 x 到降维的表示 z 。类似于 k 均值,如果我们准备应用 PCA 使用的向量 x 应当属于 Rn,所以这里 x0 不能为1,这就是PCA算法。
  • 小结: PCA 所做的是尝试找到一个面或线,把数据投影到这个面或线上,以便于最小化平方投影误差。因为其难度超出课程范围,所以我们不去进行数学证明,但是幸运的是,这个 PCA 算法能够被应用在 Octave 上,而不使用太多行代码,如果执行它,它就是能工作,而且工作得很好。如果执行这个算法,我们能得到一个非常有效的降维算法,它做的事情就是最小化平方投影误差。

四、原始数据重构(Reconstruction of the original data)

  • 压缩重现(Reconstruction from compressed representation)

  • 在前面的内容中,我们一直把 PCA 作为压缩算法来讨论,它可以把一个 1000 维的数据压缩成 100 维的特征向量,或者把一个三维的数据压缩成二维表示。如果这是一个压缩算法,就应该有办法从这个压缩表示回到原来高维数据的一种近似表示,所以假设给定 100 维的 z(i),怎么回到原来的表示 x(i)(x(i) 可能是1000维的),这一节将讨论如何去做。

  • 在PCA算法,我们可能有一个这样的样本:
    在这里插入图片描述

  • 对于图中的样本 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 ureducek×1 zx

  • 再次检查一下维度,这里 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 the number of principal components)

  • 在 PCA 算法中,我们将 n 维特征减少到 k 维,这个数字 k 是 PCA 算法的一个参数,它被称为主成分的数字(the number of principal components) 或者也被称为我们保留的主成分数字。本小节将会给出一些指导,介绍一般情况下人们如何考虑选择这个参数 k。

1. 两个概念

  • 为了选取这个主成分的数字 k,这里先给出几个有用的概念:
    A v e r a g e    s q u a r e d    p r o j e c t i o n    e r r o r : 1 m ∑ i = 1 m ∣ ∣ x ( i ) − x a p p r o x ( i ) ∣ ∣ 2   T o t a l    v a r i a t i o n    i n    t h e    d a t a : 1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 \begin{aligned} &Average\ \ squared\ \ projection\ \ error:\\ &\qquad {\Large \frac{1}{m}\sum^m_{i=1}||x^{(i)}-x^{(i)}_{approx}||^2}\\\ \\ &Total\ \ variation\ \ in\ \ the\ \ data:\\ &\qquad {\Large \frac{1}{m}\sum^m_{i=1}||x^{(i)}||^2} \end{aligned}  Average  squared  projection  error:m1i=1mx(i)xapprox(i)2Total  variation  in  the  data:m1i=1mx(i)2
  • PCA 试图去减少投影误差平方的平均值(the average squared projection error),因此它会试图减少这个数量(上面第一个表达式),它是原始数据 x 和投影 x(i)approx,也就是说他会试图减少 x 和 x 在低维平面的投影距离的差的平方(投影误差的平均值)。
  • 同时我们还定义了数据的总方差(the total variation in the data) 为样本 x 的平方和的平均值,所以数据的总方差就是我们的训练集中每个训练样本的平均长度。这个说明了,平均来说我们的训练样本距离全零向量的有多远,或者说我们的训练样本距离原点有多远。
    T y p i c a l l y   ,   c h o o s e    k    t o    b e    s m a l l e s t    v a l u e    s o    t h a t 1 m ∑ i = 1 m ∣ ∣ x ( i ) − x a p p r o x ( i ) ∣ ∣ 2 1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 ≤ 0.01 ( 1 % )   “   99 %    o f    v a r i a n c e    i s    r e t a i n e d   ” \begin{aligned} &Typically\ ,\ choose\ \ k \ \ to\ \ be\ \ smallest\ \ value\ \ so\ \ that\\ &\qquad {\Large\frac{\frac{1}{m}\sum^m_{i=1}||x^{(i)}-x^{(i)}_{approx}||^2}{\frac{1}{m}\sum^m_{i=1}||x^{(i)}||^2}\le0.01\quad (1\%)} \\\ \\ &“\ 99\%\ \ of\ \ variance\ \ is\ \ retained\ ” \end{aligned}  Typically , choose  k  to  be  smallest  value  so  thatm1i=1mx(i)2m1i=1mx(i)xapprox(i)20.01(1%) 99%  of  variance  is  retained 
  • 当我们试图选择 k ,一个常见的经验方法是选择较小的值,使得这两者之间的比值小于 0.01,换句话说,一个很常见的方式来选择 k 是我们想让平方投影误差平方,即 x 和其投影的平均距离除以数据的总方差(数据的波动程度),我们希望这个比例小于 0.01 (或者说 1%),而且大多数人认为选择 k 并不是像多数人谈论的那样直接进行选择,而是选这个数,不管它是 0.01 还是其他的数。如果是 0.01 ,另一种方式,用 PCA 语言来表述就是 99% 的方差性会被保留,这意味着平均投影误差平方除以数据总方差结果不会超过 1% 。

2. 选择 k 的算法

  • 如果要选择 k 的值,我们开始可以给 k 赋值 1,然后运行 PCA 算法,计算 Ureduce、z(1) 到 z(m)、x(1)approx 到 x(m)approx,然后我们检查是否保留了 99% 的方差,如果保留了我们就让 k 等于 1,否则就逐渐增加 k 的值从头运算(k=2,、k=3…)。
    Try    PCA    with    k = 1 Compute    U r e d u c e ,   z ( 1 ) ,   z ( 2 ) , . . .   , z ( m ) ,   x a p p r o x ( 1 ) , . . .   , x a p p r o x ( m ) Check    if 1 m ∑ i = 1 m ∣ ∣ x ( i ) − x a p p r o x ( i ) ∣ ∣ 2 1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 ≤ 0.01 ? \begin{aligned} &\textbf{Try\ \ PCA\ \ with}\ \ k=1\\ &\textbf{Compute}\ \ U_{reduce},\ z^{(1)},\ z^{(2)},...\ ,z^{(m)},\ x^{(1)}_{approx},...\ ,x^{(m)}_{approx}\\ &\textbf{Check\ \ if}\\ &\qquad\large \frac{\frac{1}{m}\sum^m_{i=1}||x^{(i)}-x^{(i)}_{approx}||^2}{\frac{1}{m}\sum^m_{i=1}||x^{(i)}||^2}\le0.01? \end{aligned} Try  PCA  with  k=1Compute  Ureduce, z(1), z(2),... ,z(m), xapprox(1),... ,xapprox(m)Check  ifm1i=1mx(i)2m1i=1mx(i)xapprox(i)20.01?
  • 假设当 k 等于 17 时,有 99% 的数据被保留,我们最终就将 k 的值设为 17。但是如我们所见,这种方法非常低效,幸运的是,当我们在实现 PCA 时,在上面这一步,它实际上给了我们一个量使得我们可以更容易的计算这些东西,特别是当我们调用 SVD 时得到矩阵 U、S、V,其中的 S 是一个 n×n 的方阵,也就是说,除了对角线上的元素外其余元素均为 0:
    S = [ S 11 0 S 22 S 33 . . . 0 S n n ] \begin{aligned} S=\left[\begin{matrix} S_{11}&&&&0\\ &S_{22}&&&\\ &&S_{33}&&\\ &&&...&\\ 0&&&&S_{nn}\\ \end{matrix}\right] \end{aligned} S=S110S22S33...0Snn
  • 事实证明,对于一个给定的 k ,上面用于检查是否小于 0.01 的量的计算将会比较简单,同时也可以像下面这样计算:
    1 − ∑ i = 1 k S i i ∑ i = 1 n S i i ≤ 0.01 1-\frac{\sum_{i=1}^kS_{ii}}{\sum_{i=1}^nS_{ii}}\le0.01\\ 1i=1nSiii=1kSii0.01
  • 1 减去从 1 到 k 的 Sii 的和除以从 1 到 n 的 Sii 的和,从另一个角度来解释,如果 k 取值为 3,我们将要做的是计算分子的值,也就是计算上面矩阵中对角线上前三个元素的和,分母则是计算对角线上所有元素的值,然后用 1 减去这个值,随后检查该值是否小于等于 0.01 ,也可以等价于下面的这个式子:
    ∑ i = 1 k S i i ∑ i = 1 n S i i ≥ 0.99 \begin{aligned} \frac{\sum_{i=1}^kS_{ii}}{\sum_{i=1}^nS_{ii}}\ge0.99\\ \end{aligned} i=1nSiii=1kSii0.99
  • 接下来可以逐渐地增大 k ,选出使得结果大于 99% 的最小值,这样的话只需要调用一次 SVD ,因为它可以给我们矩阵 S ,这时我们就只需要在分子上不断添加元素(增大 k 的值),就不用从头运行 PCA 反复地调用 SVD 来测试出不同的 k 值了,因此该过程更加高效。

3. 小结

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  whichi=1nSiii=1kSii0.99( 99%  of  variance  is  retained )

  • 选择 k 的方法:当使用 PCA 进行压缩时,我们会在协方差矩阵上进行一次 SVD ,然后用上面的公式挑选 k 的最小值,假如我们有 1000 维的数据,但是我们只选择 k 等于 100,一个向他人解释我们的 PCA 算法性能的好方法是,可以让他人通过方差被保留的百分比来更好地理解我们 100 维的表示是如何逼近原始数据的(这是对我们构造误差的一个很好的度量,比值为 0.01 会给人们一种很直观的感受,即我们的 PCA 找到了一个对原始数据集的良好的近似)。
  • 如果我们将 PCA 应用到高维数据集(比如比较常见的 1000 维,因为数据集往往高度相关,所以维数往往比较高),那么会经常发现 PCA 能够保留 99% 的方差(或者像 95%、85% 这样高比例的方差),即使是在将数据压缩到一个非常大的因数时。

六、应用 PCA 的建议(Advice for applying PCA)

  • 本小节将会讲解如何让 PCA 加快学习算法的执行效率,并给出一些如何去应用 PCA 算法的相关建议。

1. 使用 PCA 算法加速学习算法

  • 我们通常采用 PCA 算法对监督学习算法进行加速。假设有一个监督学习问题,这个监督学习有输入 x 和标签 y,假设在例子中,x(i) 有非常高的维度的特征向量(例如计算机视觉中,一个 100×100 的图片就有 10,000 个像素强度值),对于像这种的高维特征向量,如果需要使用 10,000 维的特征向量进行逻辑回归,或者输入神经网络或支持向量机,或者其它想要的操作,那么运行学习算法时将变得非常慢(因为数据量太大,包含 10,000 个数字,将会使得学习算法运行得非常慢)。幸运的是,用 PCA 算法可以减少数据的维度,从而使得算法运行更加高效,我们可以这样做:
    Supervised    learning    speedup: ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . .   , ( x ( m ) , y ( m ) ) E x t r a c t    i n p u t s : U n l a b e l e d    d a t a s e t :   x ( 1 ) , x ( 2 ) , . . .   , x ( m ) ∈ R 10000 ↓ P C A   z ( 1 ) , z ( 2 ) , . . .   , z ( m ) ∈ R 1000   N e w    t r a i n i n g    s e t : ( z ( 1 ) , y ( 1 ) ) , ( z ( 2 ) , y ( 2 ) ) , . . .   , ( z ( m ) , y ( m ) ) \begin{aligned} &\textbf{Supervised\ \ learning\ \ speedup:}\\ &(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...\ ,(x^{(m)},y^{(m)})\\ &Extract\ \ inputs:\\ &\qquad Unlabeled\ \ dataset:\ x^{(1)},x^{(2)},...\ ,x^{(m)}\in\R^{10000}\\ &\qquad\qquad\qquad\qquad\qquad\qquad\qquad \downarrow PCA\\ &\ \quad\qquad\qquad\qquad\qquad\qquad z^{(1)},z^{(2)},...\ ,z^{(m)}\in\R^{1000}\\\ \\ &New\ \ training\ \ set:\\ &(z^{(1)},y^{(1)}),(z^{(2)},y^{(2)}),...\ ,(z^{(m)},y^{(m)})\\ \end{aligned}  Supervised  learning  speedup:(x(1),y(1)),(x(2),y(2)),... ,(x(m),y(m))Extract  inputs:Unlabeled  dataset: x(1),x(2),... ,x(m)R10000PCA z(1),z(2),... ,z(m)R1000New  training  set:(z(1),y(1)),(z(2),y(2)),... ,(z(m),y(m))
  • 首先检查已经被标记的训练集,并抽取出样本中的这些 x,把 y 先临时放一边,我们就得到了一个无标签的训练集,从 x(1) 到 x(m),可能是 10,000 维的数据(10,000 维的样本)。简而言之就是仅仅抽取出了输入的向量 x(1) 到 x(m)
  • 接着我们使用 PCA 得到原始数据的低维表示,它们不再是 10,000 维的特征向量,而是变成了 1000 维的特征向量,这样就实现了 10 倍的节省。
  • 这就给我们了一个新的训练集。之前可能有一个样本( x(1), y(1) ),现在训练集的第一个输入变成了 z(1) ,因此有了一组新的训练样本(用低维的方式表示的从 z(1)、z(2) 到 z(m)),z(1) 与y(1) 对应,相似的 ( z(2), y(2) ) 等等直到 ( z(m), y(m) ) 。
  • 最终,我们可以把这个低维的训练集输入一个学习算法,可能是神经网络或者逻辑回归算法。可以学习假设函数H,使用这些低维的输入z尝试去进行预测。如果使用逻辑回归,我们会训练一个假设函数,如果输入一个 z 向量,就可以尝试去进行预测:
    h θ ( z ) = 1 1 − e − θ T z \begin{aligned} \Large h_θ(z)=\frac{1}{1-e^{-θ^Tz}} \end{aligned} hθ(z)=1eθTz1
  • 如果有一个新的样本,可能是一个新的测试样本 x,我们需要做的是将测试样本 x 通过 PCA 的映射关系进行映射获得对应的 z,再把 z 代入到假设函数中,这个假设函数就会对输入 x 进行预测。
  • 最后要注意的一点是,PCA 所做的是定义一个从 x 到 z 的映射,这个从 x 到 z 的映射只能通过在训练集上运行 PCA 来定义,具体而言,PCA 学习的这个映射所做的就是计算一系列参数进行特征缩放和均值归一化,它还计算矩阵 Ureduced,但所有这些东西,比如 Ureduced 就只是通过学习PCA得到的参数,所以我们应该只在训练集上拟合这些参数,而不是交叉验证集或者在测试集上
    因此, Ureduced 等等这些值应该是只在训练集上运行 PCA 得到的,然后找到 Ureduced 或者找到其他参数来进行特征缩放或均值归一化,以及划分特征的合适的缩放规模。在训练集上找到所有这些参数后,可以把这个映射用在交叉验证集或者测试集的其它样本中。
  • 总结一下,当在运行PCA时,仅仅在训练集中的数据上运行,不能用在交叉验证集和测试集数据,定义了 x 到 z 的映射后,可以应用这个映射到交叉验证集和测试集
  • 顺便说一下,在这个例子中,我们讨论了如何将数据从 10,000 维减少到 1000 维。实际上,这并不是不切实际的,在许多问题上,的确能减少数据的维度,大概可以减少到 1/5 或者 1/10,而且仍然保留大部分的方差几乎不影响性能(比如说分类精度(classification accuracy)),几乎不影响学习算法的分类准确度,而且使用较低的维度数据,我们的学习算法通常可以运行得更快。

2. PCA 算法的应用

  • 到目前为止,我们讨论了 PCA 的以下应用:
    C o m p r e s s i o n − R e d u c e    m e m o r y / d i s k    n e e d e d    t o    s t o r e    d a t a − S p e e d    u p    l e a r n i n g    a l g o r i t h m V i s u a l i z a t i o n \begin{aligned} &Compression\\ &\qquad -Reduce\ \ memory/disk\ \ needed\ \ to \ \ store\ \ data\\ &\qquad -Speed\ \ up\ \ learning\ \ algorithm\\ &Visualization\\ \end{aligned} CompressionReduce  memory/disk  needed  to  store  dataSpeed  up  learning  algorithmVisualization
  • 首先它能进行压缩,可能需要用它来减少存储数据所需的存储器或硬盘空间。
  • 上一部分我们讨论了如何使用 PCA 去加速学习算法
  • 在这些应用中,为了选择k,我们经常会计算出方差保留的百分比。通常,这种学习算法加速应用需要保留 99% 的方差,这是一种非常典型的选择 k 的方式。以上两点就是如何为压缩应用选择 k。
  • 而对于可视化应用,虽然我们通常知道如何去可视化二维数据或三维数据,但对于可视化应用来说,我们通常选择 k等于 2 或者 3,因为我们能可视化 2D 和 3D 数据集。
  • 以上总结了 PCA 的主要应用,以及对于不同的应用如何去选择k值。

3. PCA 算法的误用

①尝试使用 PCA 去防止过拟合

  • 必须提出,有一种常见的对PCA算法的误用,有时候可能会听到别人这样做,这里只是简单提一下,希望让大家知道不要这样做,这种对 PCA 的错误使用就是尝试使用 PCA 去防止过拟合,下面说明一下为什么:
    U s e    z ( i )    i n s t e a d    o f    x ( i )    t o    r e d u c e    t h e    n u m b e r    o f f e a t u r e s    t o    k < n . T h u s   ,   f e w e r    f e a t u r e s   ,   l e s s    l i k e l y    t o    o v e r f i t .   \begin{aligned} &Use\ \ z^{(i)}\ \ instead\ \ of\ \ x^{(i)}\ \ to\ \ reduce\ \ the\ \ number\ \ of\\ &features\ \ to\ \ k<n.\\ &Thus\ ,\ fewer\ \ features\ , \ less\ \ likely\ \ to\ \ overfit.\\\ \\ \end{aligned}  Use  z(i)  instead  of  x(i)  to  reduce  the  number  offeatures  to  k<n.Thus , fewer  features , less  likely  to  overfit.
  • 如果我们有 x(i),或许有n个特征,但是如果压缩这些数据使用 z(i) 替代,这会减少特征数量到k,这个维度比原先低得多。因此,如果有一个小得多的特征数量,比如 k 是 1000,n 是 10000,如果我们只有 1000 维的数据,就比使用有大约 1000 个特征的 10000 维的数据时过拟合的可能性更小,一些人就会认为,PCA 是一种防止过拟合的方法。但是强调一下,这是 PCA 非常糟糕的应用,我们不建议这样去做,这并不是说这个方法不好,如果真的用这种方法去减少数据维度,防止过拟合,它可能效果也会很好,但是这并不是一种解决过拟合的好的方式;相反,如果担心过拟合,有一种非常好的方法来解决,就是正则化,而不是使用 PCA 来减少数据维度。
    T h i s    m i g h t    w o r k    O K   ,   b u t    i s n ’ t    a    g o o d    w a y    t o    a d d r e s s o v e r f i t t i n g .    U s e    r e g u l a r i z a t i o n    i n s t e a d . 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ 2 m ∑ j = 1 n θ j 2 \begin{aligned} &This\ \ might\ \ work\ \ OK\ , \ but\ \ isn’t\ \ a\ \ good\ \ way\ \ to\ \ address\\ &overfitting.\ \ Use\ \ regularization\ \ instead.\\ &\qquad \large \frac{1}{2m}\sum_{i=1}^m(h_θ(x^{(i)})-y^{(i)})^2+\frac{λ}{2m}\sum_{j=1}^nθ_j^2 \end{aligned} This  might  work  OK , but  isnt  a  good  way  to  addressoverfitting.  Use  regularization  instead.2m1i=1m(hθ(x(i))y(i))2+2mλj=1nθj2
  • 回顾一下 PCA 是如何工作的,来更好地说明这样做的理由。PCA 不需要使用标签 y,仅仅是使用输入的 x(i) 去寻找低维数据来近似我们的数据,所以 PCA 会舍掉一些信息,它扔掉或减少数据的维度不关心 y 值是什么。所以如果 99% 的方差信息被保留,如果保留了大部分方差,那么这样使用 PCA 是可以的,但是它也可能会丢掉一些有价值的信息。如果保留了 99% 的方差或者 95% 的方差诸如此类,事实证明,只使用正则化常常会带来至少一样好的效果来防止过拟合,正则化的效果通常会更好。
  • 因此,当应用线性回归或逻辑回归或者其它的一些方法进行正则化时,这个最小化问题实际上是知道 y 的值的,所以不太可能损失掉一些有价值的信息,而 PCA 不使用标签,更有可能丢失一些有价值的信息。
  • 总结一下,使用 PCA 比较好的方式是用它来提高学习算法的速度,但是使用PCA去防止过拟合,这不是 PCA 的一个好运用,要使用正则化来防止过拟合。

②PCA 的滥用

  • 最后,就是PCA算法的另一个误用。应该说 PCA 是一种非常有用的算法,可以用来压缩文件或者可视化,但是有时我们会发现一些人在使用 PCA 的时候滥用,他们在设计机器学习系统时,可能写下这样一个计划:
    D e s i g n    o f    M L    s y s t e m : G e t    t r a i n i n g    s e t    { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . .   , ( x ( m ) , y ( m ) ) } R u n    P C A    t o    r e d u c e    x ( i )    i n    d i m e n s i o n    t o    g e t    z ( i ) T r a i n    l o g i s t i c    r e g r e s s i o n    o n    { ( z ( 1 ) , y ( 1 ) ) , . . .   , ( z ( m ) , y ( m ) ) } T e s t    o n    t e s t    s e t :    M a p    x t e s t ( i )    t o    z t e s t ( i ) . R u n    h θ ( z )    o n    { ( z t e s t ( 1 ) , y t e s t ( 1 ) ) , . . .   , ( z t e s t ( m ) , y t e s t ( m ) ) } \begin{aligned} &Design\ \ of\ \ ML\ \ system:\\ &\qquad Get\ \ training\ \ set\ \ \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...\ ,(x^{(m)},y^{(m)})\}\\ &\qquad Run\ \ PCA\ \ to\ \ reduce\ \ x^{(i)}\ \ in\ \ dimension\ \ to\ \ get\ \ z^{(i)}\\ &\qquad Train\ \ logistic\ \ regression\ \ on\ \ \{(z^{(1)},y^{(1)}),...\ ,(z^{(m)},y^{(m)})\}\\ &\qquad Test\ \ on\ \ test\ \ set:\ \ Map\ \ x^{(i)}_{test}\ \ to\ \ z^{(i)}_{test}.\\ &\qquad Run\ \ h_θ(z)\ \ on\ \ \{(z^{(1)}_{test},y^{(1)}_{test}),...\ ,(z^{(m)}_{test},y^{(m)}_{test})\}\\ \end{aligned} Design  of  ML  system:Get  training  set  {(x(1),y(1)),(x(2),y(2)),... ,(x(m),y(m))}Run  PCA  to  reduce  x(i)  in  dimension  to  get  z(i)Train  logistic  regression  on  {(z(1),y(1)),... ,(z(m),y(m))}Test  on  test  set:  Map  xtest(i)  to  ztest(i).Run  hθ(z)  on  {(ztest(1),ytest(1)),... ,(ztest(m),ytest(m))}
  • 首先获得训练集,然后运行 PCA,再训练逻辑回归,接着在测试数据上进行测试。所以,经常在一个项目开始时,一些人会写下这样一个项目计划,其中包括 PCA 在内的四步。
  • 我们在写下这样一个包含PCA的项目计划之前,应该考虑一个问题,如果我们直接去做而不使用 PCA 会怎样?通常人们在提出一个复杂的项目计划和实现 PCA 之前,都不会考虑这一步。
  • 具体地说,在实现 PCA 之前有以下建议:
    • 首先建议直接做想做的事,首先考虑使用最原始的数据 x(i),只有这么做不能达到目的的情况下,才考虑使用 PCA 和 z(i) 。因此,使用PCA之前,与其考虑减少数据维度,不如考虑抛弃 PCA 这一步。我们可以考虑仅仅在原始数据上训练学习算法,仅仅使用原始的输入数据 x(i),建议在使用 PCA 算法之前,首先去尝试使用 x(i),除非有理由相信这样做无效,只有在学习算法运行太慢或者需要的内存或硬盘空间太大,因此需要去压缩数据表示,只有在使用 x(i) 无效的情况下,仅在如果有证据或强有力的原因认为使用 x(i) 不能工作才使用 PCA,才考虑使用压缩表示。

总结

  • 本篇文章主要介绍了降维的相关内容,它有两个应用,分别是数据压缩可视化
  • 数据压缩中主要介绍了它的实现过程以及作用(可以使得某些算法运行得更快)。
  • 可视化部分则是通过降维的方法来使得数据从50 维甚至更高下降至 2 维或者是 3 维,这样就能将数据画出来并更好的理解他们。
  • 主成成分分析算法(PCA)可以用来做降维操作,也可以用来实现数据压缩。在使用 PCA 之前,首先要进行数据预处理。PCA 所做的是尝试找到一个面或线,把数据投影到这个面或线上,以便于最小化平方投影误差。PCA 算法能够被应用在 Octave 上,不需要使用太多行代码并且能得到一个非常有效的降维算法。
  • 应用 PCA 可以把高维的数据特征 x 映射到低维的表示 z,相应的文中也介绍了如何把这些低维表示z映射回原来高维数据的一个近似表示
  • 主成分数字选择中介绍了一种高效的方法来选择 k ,它与投影误差平方的平均值数据的总方差有关。
  • 在应用 PCA 的建议中总结了 PCA 的主要应用,以及对于不同的应用如何去选择 k 值,同时也指出了两个误区并给出了相应的建议:使用 PCA 来防止过拟合可能会导致重要数据的丢失,因为 PCA 不使用标签;在设计一个机器学习系统时,能不用 PCA 就不要用它对数据进行处理,因为它会花费很多时间(有时不用它也会产生实现相同的效果),只有在原始数据训练学习算法不能达到目的时才考虑使用压缩表示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹清兰香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值