zoukankan      html  css  js  c++  java
  • 【ML】从特征分解,奇异值分解到主成分分析

    1.理解特征值,特征向量

    一个对角阵(A),用它做变换时,自然坐标系的坐标轴不会发生旋转变化,而只会发生伸缩,且伸缩的比例就是(A)中对角线对应的数值大小。

    对于普通矩阵(A)来说,是不是也可以找到这样的向量,使得经(A)变换后,不改变方向而只伸缩?答案是可以的,这种向量就是(A)的特征向量,而对应的伸缩比例就是对应的特征值。

    特征值会有复数是为什么?

    首先要知道,虚数单位(i)对应的是旋转(90^o),那么,如果特征值是复数,则对应的特征向量经矩阵(A)变换后将会旋转(90^o),且伸缩率是复数的模。

    2.矩阵的分解1:特征值分解

    一个方阵(A),它的线性无关的特征向量个数不会超过其维度,不同特征值对应的特征向量一定是线性无关的。而同一特征值对应的特征向量也不一定相关。

    但是,如果重复特征值重复计数,特征值的个数一定是(n),对应的也有(n)个特征向量。那么矩阵就可以分解:

    (Ax_i=lambda x_i)

    (AX=Lambda X)

    其中,(Lambda)是将(A)的特征值作为对角元素的对角阵,(X)是与特征值位置对应的特征向量(列)排成的矩阵。

    (A=X^{-1}Lambda X)

    从而,可以将(A)分解为上面的形式,这样,在计算,分析性质等会很有帮助。

    一个应用就是PCA时,对协方差矩阵(A^TA)做特征分解,以提取主成分。

    3.矩阵的分解2:奇异值分解SVD

    上面的特征值分解只针对于方阵,而对于一般矩阵,可不可以做类似分解呢?

    这就是奇异值分解。

    什么是奇异值:A的奇异值是(A^TA)的特征值的平方根。因为矩阵是变换,经非方阵(A)变换后也有向量其方向不变,只伸缩,这个伸缩率就是奇异值,对应的向量为(A^TA)的特征向量。

    酉矩阵:(A^T=A^{-1})的矩阵。

    什么是奇异值分解?

    具体来说:对于非方阵(A),它的奇异值分解形式是:

    (A=Usum V^T)

    其中,(A:m*n;U:m*m ; sum : m*n; V:n*n),且(、U、V)都是酉矩阵。

    (sum)矩阵只有对角线元素不为0,称为奇异值。

    并且:

    (V)是矩阵(A^TA) 的标准化特征向量构成的矩阵,称为右奇异向量矩阵。右奇异向量实现列数压缩。

    (U)是矩阵(A^TA)的标准化特征向量构成的矩阵,称为左奇异向量矩阵。左奇异向量实现列数压缩。

    (sum)矩阵对角线的奇异值就是矩阵(A^TA)的特征值的平方根。

    下面推导一下为什么是这样:

    奇异值分解,将(m*n)的矩阵(A),分解为:

    $A=Usum V^T $

    则:(A^T=Vsum^T U^T => A^TA=Vsum^TU^TUsum V^T=Vsum^2V^T)

    上面用到了(U^TU=I)

    即得到了:

    $ ATA=VsumTU^TUsum VT=Vsum2V^T$

    因而很显然,方阵(A^TA)的标准化特征向量排列成的矩阵就是(V),而特征值开根号就是奇异值

    所以,从这里也可知,奇异值的个数就是(A^TA)的特征值个数。

    4. 主成分分析PCA

    为什么做主成分分析?

    做数据分析处理,针对每个样本都收集了大量特征,设样本数为(m),特征数为(n),则我们得到的数据矩阵为:

    (A=[m*n]);每行为一个样本,每列为一个特征。

    大量的数据会导致处理计算复杂,并且多个特征相互之间可能存在多重相关关系,导致把所有数据放在一起处理过分拟合了某些指标;而盲目的删除一些特征又可能导致关键信息的损失。

    如何减少特征数,又保留住绝大部分信息呢?+正则化项可以自动学习这个过程。PCA主成分分析可以实现这个目的,其本质是数据降维。

    怎么做主成分分析?

    1.找主成分方向:正交的

    将列数(n)降维到(n'),怎么做呢?如果有一个维度它的变化不大,那么包含的信息就很少,自然可以删除,但在现有数据下,很难看出哪个维度变化不大,数据是杂乱的。因此将其变换到以特征向量为基的坐标系下,(n)维矩阵自然可以变换到(n)维特征向量坐标系,这样,所有(n)个特征是相互正交的。变换到新的坐标系后,由于特征值的大小表征了离散程度,哪个特征变化小就可以通过特征值大小看出来。

    根据最大方差理论,变化大的维度含有的信息远大于变化小的。

    求PCA方向就是(A^TA)的特征值方向。

    为什么要对(A^TA)求特征向量呢(为什么是这个方向)?

    这是因为,原本我们想将列向量变换到正交的特征向量方向,即寻找新的坐标系,将每条数据在这个新的坐标系下标出。这个方向实际上就是(A^TA)的特征向量的方向。因为,根据第5部分,(A=Usum V^T=>AV=Usum),可以看到,(V)的各个向量的方向就是相互正交方向,这个方向使得数据(A)的列向量变换后依然正交。而如何将列向量变换到正交方向上去呢?投影。这个式子也给了我们答案,即相乘,类似于内积,(一个向量到另一个向量的投影)。因此,这样就将所有列向量(特征)映射到了相互正交的空间,倘若有的变量变化不大,此时可以根据特征值大小看出,即特征值小则方差小,信息量小。

    另外可以发现,中心化后,(A^TA)就是协方差矩阵,这是为什么许多教材上直接说对协方差矩阵求特征向量,特征向量的方向就是主成分方向。

    那么,确定了主成分方向,如何确定使用哪几个主成分呢?

    特征值的意义就是特征向量方向上的伸缩率,因此,特征值的大小衡量了该主成分方向上的离散程度,特征值越大,则越离散,方差越大,信息越多。

    因此可以定义贡献率:该特征值/特征值之和。

    所以,只要选取特征值最大的几个主成分方向以及对应的主成分向量(主成分特征)就可以了。这是为什么教材中按特征值大小排序。

    总结一下主成分步骤:

    要将列特征变换到另一个空间,使得特征之间是相互正交的,即变换后的(n)维特征正好处于新坐标系的轴上。

    1. (A^TA)特征值以及对应的特征向量,按大小排序。
    2. 该特征向量就是新的坐标轴方向,将A的各行向新的特征值方向上做投影,得到主成分。
    3. 根据贡献率,选择需要的主成分数。

    上面的过程很类似于奇异值分解,实际上,学习库中的PCA不会真的对(A^TA)求特征向量,这太费时了,因为求特征向量实际上就要首先求特征多项式,大于三阶不存在通用算法求解。实际上,scikit-learn做奇异值分解的途中,有算法可以直接得到右边的(V),从而确定了方向。

    PCA的缺点是解释性不强,即变换后的特征到底代表了什么是不能够解释的,但这不影响PCA很有效,对我来说更重要的是帮助理解特征值分解和奇异值分解。

  • 相关阅读:
    Win7 vs2017 WDK 1803 1809 驱动开发 出错 KMDF
    http 请求 post get 长度限制
    IO模式和IO多路复用(阻塞IO、非阻塞IO、同步IO、异步IO等概念)
    select/poll 和 epoll 比较
    centos查看端口被哪个应用端口占用命令
    mysql索引知识简单记录
    Spring钩子方法和钩子接口的使用详解
    mysql使用自增Id为什么存储比较快
    分布式Id教程
    如何配置JVM系统属性及获取方式System.getProperty("pname")
  • 原文地址:https://www.cnblogs.com/duye/p/10731816.html
Copyright © 2011-2022 走看看