首页 > 编程知识 正文

奇异值分解SVD的理解与应用,svd奇异值分解算法

时间:2023-05-03 13:58:18 阅读:190008 作者:833

模态分解(谱分解EVD )和奇异值分解(SVD )即在PCA中的应用1 .概念模态分解和奇异值分解广泛应用于机器学习领域。 两者关系密切,两者的目的相同,就是提取一个矩阵最重要的特征。

1.1如果特征值v是方阵a的本征向量,则一定能够表示如下。

此时,被称为与特征向量v对应的特征量,1个矩阵的特征向量组是一组正交向量(与实对称矩阵的不同特征量对应的特征向量相互正交)。 模态分解是指对矩阵进行如下分解。

这里,q为由该矩阵a的特征向量组成的矩阵,列向量为特征向量,为对角矩阵,各个对角线上的要素为特征值。

首先,要弄清楚矩阵其实是线性变换。 因为矩阵乘以向量的向量,实际上就是对该向量进行了线性变换。 例如,以下矩阵:

实际上,相应的线性变换是以下形式:

因为在这个矩阵m上乘以向量(x,y )的结果如下。

由于上面的矩阵是对称的,所以该变换对x,y轴的方向是一个扩展变换。 各对角线上的要素对1个维度进行扩展变换,值为1时为扩展,值为1时为缩短。 当矩阵不对称时,假设矩阵如下。

该转换应如下所示:

这实际上是在平面上对一个轴进行的拉伸变换。 如蓝色箭头所示,在图中,蓝色箭头是最主要的变化方向。 变化方向可能有多个。 如果想描述一个变换的话,描述这个变换的主要变化方向就可以了。

反过来看迄今为止的特征值分解的公式,分解得到的矩阵是对角矩阵,其中的特征值从大到小排列。 与这些特征值对应特征向量记述了该矩阵(矩阵a )的变化方向(从主要变化到次要变化的排列)

如果矩阵是高维的,则该矩阵是高维空间中的线性变换,这种线性变化可能无法用图像来表示,但可以想象该变换也有很多变换方向。 我们利用特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向我们利用这前n个变化方向,计算了近似这个矩阵(变换)即,如上所述,提取这个矩阵最重要的特征

总而言之,3358www.Sina.com/可获得特征量和特征向量,并且特征值分解特征值表示的是这个特征到底有多重要可获得线性的每个特征向量但模态分解也有很多局限性,比如变换的矩阵必须是方阵。

1.1奇异值特征值分解是提取矩阵特征的好方法,但它是对手阵的产物,现实世界中大多数矩阵不是方阵。 例如,假设有n个学生,每个学生都有m科的成绩。 这样形成的N * M的矩阵不是方阵。 怎样才能解释这类普通矩阵的重要特征呢? 奇异值分解可以用来做这件事。 奇异值分解是一种适用于任意矩阵的分解方法:

假设a为N * M的矩阵,则得到的u为N * N的方阵(其中的向量是正交的,u中的向量称为超帅草莓向量),为N * M的对角矩阵(对角线上的元素称为奇异值),$V^T$为N * N

那么奇异值和特征值是如何对应的呢? 首先,假设$A^T * A$,则得到正方形矩阵。 使用该方阵求出特征量时,可以得到以下内容。

这里得到的v是我们上面的右奇异向量。 此外,您还可以:

其中是上述奇异值,u是上述超帅草莓矢量。 奇异值与特征值相似,在矩阵中按从大到小的顺序排列,的减少速度特别快,为特征向量表示这个特征是什么。 也就是说,它可以是在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。 这里定义了奇异值分解的一部分。

r是远远小于m、n的数。 这样,矩阵乘法看起来像这样:

的三个矩阵相乘的结果是接近a的矩阵。 其中,r越接近n,乘法运算的结果越接近a。 而且,这3个矩阵的面积之和(从存储观点来看,矩阵的面积越小存储量就越小)远远小于原矩阵a。 为了表示原矩阵a想压缩空间时,保存这里的3个矩阵(u,,v )就可以了。

2 .奇异值计算奇异值的计算是一个难题,是o(n^3)的算法。 单机的话当然没有问题。 matlab可以在一秒钟内计算出1000 * 1000矩阵的所有奇异值,但随着矩阵规模的增加,计算复杂度会按3次方增加,需要参与并行计算。 谷歌的mddc老师在数学美系列中谈到SVD时,说到谷歌就实现了SVD的并行计算

法,说这是对人类的一个贡献,但是也没有给出具体的计算规模,也没有给出太多有价值的信息。

其实SVD还是可以用并行的方式去实现的,在解大规模的矩阵的时候,一般使用迭代的方法,当矩阵的规模很大(比如说上亿)的时候,迭代的次数也可能会上亿次,如果使用Map-Reduce框架去解,则每次Map-Reduce完成的时候,都会涉及到写文件、读文件的操作。个人猜测Google云计算体系中除了Map-Reduce以外应该还有类似于MPI的计算模型,也就是节点之间是保持通信,数据是常驻在内存中的,这种计算模型比Map-Reduce在解决迭代次数非常多的时候,要快了很多倍。

Lanczos迭代就是一种解对称方阵部分特征值的方法(之前谈到了,解A’* A得到的对称方阵的特征值就是解A的右奇异向量),是将一个对称的方程化为一个三对角矩阵再进行求解。按网上的一些文献来看,Google应该是用这种方法去做的奇异值分解的。请见Wikipedia上面的一些引用的论文,如果理解了那些论文,也“几乎”可以做出一个SVD了。

由于奇异值的计算是一个很枯燥,纯数学的过程,而且前人的研究成果(论文中)几乎已经把整个程序的流程图给出来了。更多的关于奇异值计算的部分,将在后面的参考文献中给出,这里不再深入,我还是focus在奇异值的应用中去

3. 奇异值分解与PCA

主成分分析在上一节里面也讲了一些,这里主要谈谈如何用SVD去解PCA的问题。PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。但是对于我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。以下面这张图为例子:

这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假如我们想要用一条直线去拟合这些点,那我们会选择什么方向的线呢?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴与y轴上得到的方差是相似的(因为这些点的趋势是在45度左右的方向,所以投影到x轴或者y轴上都是类似的),如果我们使用原来的xy坐标系去看这些点,容易看不出来这些点真正的方向是什么。但是如果我们进行坐标系的变化,横轴变成了signal的方向,纵轴变成了noise的方向,则就很容易发现什么方向的方差大,什么方向的方差小了。

一般来说,方差大的方向是信号的方向,方差小的方向是噪声的方向,我们在数据挖掘中或者数字信号处理中,往往要提高信号与噪声的比例,也就是信噪比。对上图来说,如果我们只保留signal方向的数据,也可以对原数据进行不错的近似了。

PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

而将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r < n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩。用数学语言表示就是:

但是这个怎么和SVD扯上关系呢?之前谈到,SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量…我们回忆一下之前得到的SVD式子:

在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子(原文公式有点问题,在此已修正)

将后面的式子与A * P那个m * n的矩阵变换为m * r的矩阵的式子对照看看,在这里,其实V就是P,也就是一个变化的向量。这里是将一个m * n 的矩阵压缩到一个m * r的矩阵,也就是对列进行压缩,如果我们想对行进行压缩(在PCA的观点下,对行进行压缩可以理解为,将一些相似的sample合并在一起,或者将一些没有太大价值的sample去掉)怎么办呢?同样我们写出一个通用的行压缩例子:

这样就从一个m行的矩阵压缩到一个r行的矩阵了,对SVD来说也是一样的,我们对SVD分解的式子两边乘以U的转置U’

这样我们就得到了对行进行压缩的式子。可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了,而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA,如果我们对A’A进行特征值的分解,只能得到一个方向的PCA。

参考:LeftNotEasy机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。