zoukankan      html  css  js  c++  java
  • 《文章翻译》PCA&SVD

    Principle Component Analysis && Singular Value Decomposition

    翻译自:forward data science

    强烈推荐,理解PCA和SVD很有帮助

    一. Intuition of PCA

    1.1 去掉多余的特征

    假设我们有房子的这些信息:价格(千美元)、面积、层数、户型。

    图1-1

    房子包含了四维的信息,我们无法在一幅图像中直观的显示出来。然而,如果你仔细的观察特征之间的联系,你将会注意到不是所有的特征都是同等重要的。

    例如,你可以通过房子的层数去识别房子的价格(或对应哪个房子)吗?房子的层数是否帮助我们区分是哪个房子?房子的层数几乎相同,他们的方差很小,(sigma^2=0.2) 所以房子的层数不是非常有用。那房子的户型呢?他们值变化也不是很大,但是他们的方差却很大,(sigma^2=127),因此房子的户型可以很好的区别是哪个房子。

    因此我们可以做一些事尽量的发掘特征,在不损失精度的情况下。目前,我们学习了各自的特征。那特征之间的相互联系是什么?如果你仔细看了上图1-1的特征,你会发现房子的价格粗略的等于房子面积的两倍。这是非常有用的信息,我们可以使用其中一个特征来取代代替另一个特征。这样两个特征之间的联系称为协方差。协方差越大,表明特征之间的相关性越强,也就是数据的冗余性很大。因此可以进行降维处理。

    从之前的讨论可以明显的看出:

    • 特征高方差是好事,代表更多的信息
    • 特征之间高协方差是坏事,表明特征之间很多冗余

    这就是PCA的目的:使得每个特征的方差都很大,使得特征之间的协方差都很小。当前我们无法用眼睛直观的感受,下文会详细描述。

    1.2 魔幻展示

    我们对PCA女士进行了一个简单采访-:

    记者:请问您认为最完美的数据是什么样的?

    PCA:下图所示

    图1-2

    这意味着-----数据可以降低到一个维度上。观测:(x_1)方向的方差比(x_2)方向的方差大很多,也就等于去除(x_2)方向的数据,不会破坏很多的数据信息。此外,(x_1)方向的数据是递增的,完全没有依靠(x_2)的数据,也就等于(x_1/x_2)的协方差很小。为什么PCA会觉得这样的数据很完美,因为她只需进行这样的操作:

    图1-3

    图1-4

    明白怎么进行的处理很重要,(x_1)的数据比(x_2)的数据更重要,所以我们去除(x_2)的数据。也可以表达为,把数据像(x_1)进行投影。二维数据使用一维数据代替。

    1.3 难例图解

    记者:那您觉得什么的数据不是很完美呢?数据像什么样子?

    PCA:每个东西都是完美的,只要你进行一些变换即可。像下面这幅图一样:

    图1-4

    PCA:上面的图有点困难,你觉得呢?尝试将头转动一下

    图1-5

    将图转动45°之后,现在的图也是将近完美的。这发生了什么事?PCA尝试找到一个轴,这个轴的方差越大越好。我们之前说(x_1)的特征,指的是在(x_1)方向的特征。然后,在旋转之后,(x_1)的特征代表的意义变了,不再是之前(x_1)方向的特征,具体含义不再重要(代表之前(x_1)(x_2)线性联合的特征)。因为旋转了45°,所以新轴和旧轴之间的关系是:(x_2=x_1)(x_1-x_2=0),新的轴设为(z_1/z_2):

    [z_1 = x_1 - x_2 ]

    [z_2 = x_1+x_2 ]

    新的轴(z_1/z_2)代表了数据的主要成分(principle component),转换之后,数据和之前的数据基本一样,方差和协方差也类似。

    很容易知道如何生成多于二维的数据,之前是投影到直线上,现在是投影到一个平面上,下面是以3D为展示投影关系。

    图1-6

    1.4 如何找到主成分线

    具体不再此节中展示,后续SVD会进行详细展示

    二. 概念介绍

    2.1 內积(Dot、点积)

    图2-1

    点积的结果是,虚线上红色的长度。

    这么简单的事情,但是具有非常大的应用范围。我可以告诉你,以后我们做的所有事情,都可以用一系列点积去表示,别感受惊讶。点积可以看做很多方面:

    • 像上面的图所示,可以表示一个向量 (b) 到向量 (a) 的投影长度
    • 向量 (a) 和向量 (b) 的靠近程度 (a cdot b = |a||b|cos heta)
    • 最短距离(上面式子)
    • (a)(b) 其中的一个分量

    以上的点都差不多,都是通过一个公式可以展示出来。

    举个例子,(a=(1,2))(b=(0.8,0.6)) :

    图2-2

    2.2 多维点积

    图2-3

    简要概述:多维矩阵点积,不做过多介绍。

    2.3 反向求解

    矩阵的一些性质,不做过多介绍

    2.4 翻转矩阵

    趣事:当逆陷入困境的时候,请问问你的猫。如果它像上面图像一样面对你,说明它想告诉你-----改变你的视角,你会发现很多有趣的事情。

    我们以实际的数据进行描述,假设存在两个城市,有三天的数据,也就是 (X_{3*2}) 的矩阵,将这矩阵在二维平面进行作图。

    上图并没有什么鼓舞人心的事,让我们换个视觉,像猫一样:

    我们得到了不同于之前的一个矩阵,现在我们在三维空间进行绘图:

    完全理解转换后的矩阵非常重要:

    • 新的矩阵以Day为轴,而之前的数据则相反
    • 新矩阵中每一行的数据是3D空间中的一个点
    • 新矩阵第一行的数据是由每一天形成的。。。
    • 如果我们有大于三天的数据,结果也是两个点。

    到目前为止,我们画出一个唯一的平面,如果我们画出这个平面和原始的散点图,称之为:双重图。

    2.5 新空间

    现在,我们可以在新的双平面中进行探索一些特性。为了更好地理解,我们先看两个空间的联系:

    声明#一: 方差就是红色箭头((x))和蓝色箭头((y))的长度。可以从左图来看,(x,y) 是等比例变换的,不存在协方差,只有方差的存在。

    声明#二:协方差就是红色箭头((x))和蓝色箭头((y))的夹角。可以从左图来看,(y) 轴方差不变,(x) 轴方差变大,协方差改变。

    2.6 具体公式

    方差:

    协方差:

    这部分原作者介绍很多,比较容易理解,这里不进行整篇翻译。。。

    补充:

    • 这里的数据都是经过中心化的,减去均值之后。
    • 方差协方差,可以简单的想成数据矩阵的变换
    • 这部分主要介绍了方差(数据)和协方差(矩阵)的求解方法。但是我们还是无法找到主要的特征方向(PCA),假设(A)(B)(C)三个特征,(sigma_A > sigma_B > sigma_C) ,我们无法直接(C) 特征去除,因为加入(A)(B)的相关性很大,得到的([A,B])矩阵没没有意义的。

    三. PCA操作

    3.1 明确目的

    在没有进行明确定义之前,你无法解决如何找到最大方差的方向。也就说明我们必须明确定义什么是方差?从之前的章节中,我们知道如何求解方差和协方差,但是无法求解主方向,如果得到主方向,那么就知道主方向上的投影,计算投影的协方差即可。

    注释:

    之前说的(X)轴方向的特征,指的是沿着(X)方向的特征。

    下面这幅图在之前出现过,这里再强调一下!之前的轴是(,x_2,x_2),新的轴是(,z_1,z_2) ,注意我们都是在找到主方向之后,才去计算方差和协方差的,然后再去除某个方差小的特征。我们不是在任意数据上都直接计算方差,比如下附图,我们没有直接使用(,x_1,x_2)去计算他们的方差,这没有意义。

    图1-5

    仔细的观察,我们注意到一点:假设我们找到了主方向,是不是数据在主方向上的投影就代表着数据本身?上图新轴中,(z_1) 轴的投影就是数据沿 (z_1) 方向的分布,也就是直接计算这个投影就是代表计算新数据的特征。请仔细体会!

    前面我们知道投影长度的公式,假设有矩阵 (A),他的主方向是 (v),则投影长度为(p)

    [p = Pcdot v ]

    那么我们只需计算(A)矩阵在主方向上的投影(p)的方差即可,目的是寻找最大的方差:

    3.2 探索协方差

    之前我们从猫那里学习到数据可以进行旋转,或许会发现又去的事情。对于矩阵的旋转,我们可以看一下特征值特征向量。其公式来历不过多介绍

    [C cdot u = lambdacdot u ]

    其中特征向量是单位矩阵正交矩阵

    [v_1^Tcdot v_1=1 ]

    [v_1^Tcdot v_2=0 ]

    现在将问题简单化,假设 (C) 为二维的矩阵,利用上面的正交基(,v_1,v_2)

    [u=k_1*v_1+k_2*v_2 ]

    因为 (u) 为正交矩阵,所以(k_1^2+k_2^2=1) ,也就是说(、k_1、k_2)的取值为([-1,1]),如何使得 (sigma^2) 最大化,这就比较容易了,当(sigma _1 > sigma_2) 那就使得(,k_1=1,k_2=0),反之亦然

    其实这个时候结论已经出来了,原作者还是补充了一个例子:

    上面的例子不做说明了,直接看推导公式即可。

    结论:矩阵在特征向量上的最大方差等于他的特征值

    3.3 PCA引出

    还记得第一章介绍的内容吗?想减少一个维度,我们直接对数据进行(x_1)轴上的投影即可。当前我们按照推导的公式进行操作,假设存在矩阵(A),协方差矩阵(C),特征向量(、v_1、v_2),我们可以获得在主方向上的投影为(Acdot v_1)

    维度提升到三维,特征向量为(、、v_1、v_2、v_3)(C) 的特征向量为(E)

    假设我们选择抛弃(v_3)轴的特征,也就等于矩阵(A)(、v_1、v_2)上投影即可:

    我们反过来看一下,当知道协方差矩阵(C)时,可以被分解为特征值和特征向量的点积

    统计一下PCA的操作步骤:

    • 所有数据减去均值(方便计算)
    • 计算协方差:(C=A^Tcdot A)
    • 分解(C)求解特征值和特征向量
    • 选择较大的特征值(90%或95%)
    • 投影到新的特征空间

    四. SVD操作

    4.1 SVD推导

    回顾高中物理力学知识,力是矢量,假设(F)为二维平面的力,可以被分解为(,x,y)方向的分量:

    比较遗憾的事,几乎所有的教程都将SVD复杂化了,而其核心非常简单。因为数学就是将相同的概念赋予不同名字的艺术。我们仅仅是需要一个高大上的名字而已,其实SVD就是分解矩阵成正交空间。我们分解向量(a)得到三块的信息:

    • 投影的方向(、v_2、v_2) 正交
    • 投影长度(S_{a1} > S_{a2}),所以在(v_1)方向的信息更重要(丰富),仔细理解,这是SVD的核心
    • 投影向量(、P_{a1}=acdot v_1、P_{a2}=acdot v_2)

    如何处理多个数据?这就是矩阵的优势了、、、

    先从简单的二维平面说起,扩展到多个多维数据。下图,将向量(a)投影到(、v_1、v_2)平面,注意不是之前的(、x、y)轴!操作和之前一样,只是基改变

    • (A)待求矩阵
    • $ V$:投影方向(基)
    • $S $:投影长度

    扩展到多个点的情况:

    反转一下,变换成矩阵分解的式子:

    我们先看看正常的SVD公式:

    [A = Ucdot Sigma cdot V^T ]

    按照我们上述推导的结论,和SVD公式结合理解:

    [S = Ucdot Sigma ]

    有了上面的推导,这里给出一个具体的例子:

    之前我说过SVD的核心是投影的长度越大,这个轴上的数据越重要,那么我们就按照长度进行划分:

    这里将平局长度进行了提取,更容易进行判断:

    现在可以给出一个通用的公式:

    简单的说明:

    • (、sigma_1、sigma_2)是轴上投影的长度平方和的均方根(平均长度)
    • (if:sigma_1>sigma_2) 说明大多数的点更靠近(v_1),也就等于特征(v_1>v_2),反之亦然。

    4.2 PCA与SVD

    之前我们介绍了PCA的操作,求取主成分方向,最大的方差就是我们求取的主要方向,然后进行投影就可得到目标矩阵。

    SVD和PCA不同,所有的点都进行了投影,而且在不同的特征上,下图中第二主成分也找到了,同理更多的维度也是这样排列。

    如何取重要成分?按照公式即可,直接取出多余的特征,重新投影到新的特征空间,步骤和PCA类似。(里面的例子是只按照第一主成分进行投影,当然你可以按照其他主成分进行投影,或选择多个主成分)

    PCA和SVD的个人理解

    • [x] 原作者使用了两种方法:投影方差投影距离进行讲解,仔细理解两种方式差不多,前提都是将原始数据投影到新的空间,然后最大化目标函数即可
    • [x] PCA需要对(A^Tcdot A)进行求解特征值和特征向量,而SVD是直接对(A)进行求解,相比较后者会保留局部小信息(例如:(epsino)
    • [ ] SVD可以找到很多主成分方向和投影长度,PCA同样可以保留多个特征值,其结果差不多,但是中间变量SVD更丰富
  • 相关阅读:
    python服务注册到nacos
    springboot设置响应状态码
    nio 实现群聊小系统
    记一次maven问题(把maven仓库打包后在离线环境另一个机器导入不成功)
    客户端查看sql的执行时间
    java 运行python脚本
    http访问支持websocket
    ”真实项目“ 与“作业”
    工厂方法模式
    idea 开发 SSM jar包找不到
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/12201207.html
Copyright © 2011-2022 走看看