svd奇异值分解_强大的矩阵奇异值分解(SVD)

以下所有内容转载于https://mp.weixin.qq.com/s/Dv51K8JETakIKe5dPBAPVg

特征值分解和奇异值分解在机器学习中都是很常见的矩阵分解算法。两者有着很紧密的关系,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。

1)特征值、特征向量

如果一个向量v矩阵A的特征向量,将一定可以表示成下面的形式:

其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

为什么一个向量和一个数相乘的效果与一个矩阵和一个向量相乘的效果是一样的呢?

答案:矩阵A与向量v相乘,本质上是对向量v进行了一次线性变换(旋转或拉伸),而该变换的效果为常数λ乘以向量v。当我们求特征值与特征向量的时候,就是为了求矩阵A能使哪些向量(特征向量)只发生伸缩变换,而变换的程度可以用特征值λ表示。

2)特征值与特征向量的几何意义

一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的这个矩阵:

ae7eabfaecf8918f25c1dfa6aeb722e6.png

它其实对应的线性变换是图2的形式:

b5c4b3c919cdaae7c2ceb5b67b2fc530.png
图2:矩阵M的线性变换

因为这个矩阵M乘以一个向量(x,y)的结果是:

d106de98039202302c719ddeb11746fa.png

上面的矩阵是对称的,所以这个变换是一个对x、y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值大于1时是拉伸,当值小于1时是缩短),如图2所示。当矩阵不是对称的时候,假如说矩阵是下面的样子:

58ee2fe4b8a28bf41ed9c0e00ada21ee.png

它所描述的变换是下面的样子:

7fbc3c842aae02e0b48a1e9443fb0552.png
图3:M是非对称矩阵变换

这其实是在平面上对一个轴进行的拉伸变换,如图3蓝色的箭头所示,蓝色的箭头是一个最主要的变换方向(变换的方向可能不止一个)。如果想要描述好一个变换,那我们就需要描述好这个变换主要的变化方向。

3)特征值分解

对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:

1970bca5f6bc0f88728a1c75b4399f97.png

其中,Q是矩阵A的特征向量组成的矩阵

则是一个对角阵
,对角线上的元素就是特征值。我们来分析一下特征值分解的式子,分解得到的
矩阵是一个对角矩阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变换方向(从主要的变化到次要的变化排列)。

当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变换可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变化方向,我们通过特征值分解得到的前N个特征向量,就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵变换。也就是之前说的:提取这个矩阵最重要的特征。

总结:特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多么重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。

4)特征值分解的例子

这里我们用一个简单的方阵来说明特征值分解的步骤。我们的方阵A定义为:

b4f95462a17232db55b1f7eef84ef4a1.png

首先,由方阵A的特征方程,求出特征值。

6bcfa9ebd9cdf225ba2dcc1ff3283233.png

特征值为

(重数是2)。

然后,把每个特征值λ带入线性方程组

,求出特征向量。

当λ=2时,解线性方程组

03c70a020e79273a2d796cffa5ac0247.png

解得

。特征向量为:

当λ=1时,解线性方程组

0fe9dbb491dca2d1b983837d35456b8b.png

。特征向量为:

最后,方阵A的特征值分解为:

0895ff2a92fa89d45866e095796346ca.png

2 .SVD分解

我们前面讲了很多特征值、特征向量和特征值分解,而且基于我们以前学习的线性代数知识,利用特征值分解提取特征矩阵是一个容易理解且便于实现的方法。但是为什么还存在奇异值分解呢?特征值分解最大的问题是只能针对方阵,即n*n的矩阵。而在实际的应用中,我们分解的大部分都不是方阵。关系型数据库中的某一张表的数据存储结构就类似于一个二维矩阵,假设这个表有m行,有n个字段,那么这个表数据矩阵规模就是m*n。很明显,在绝大部分情况下,m与n是不相等的。如果这个时候要对这个矩阵进行特征提取,特征值分解的方法明显就不行了。此时,就可以用SVD对非方阵矩阵进行分解。

奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

eaa2f9162468946ac5eee4e7c183ed76.png

假设A是一个m*n的矩阵,那么得到的U是一个m*m的方阵,U里面的正交向量被称为左奇异向量。Σ是一个m*n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值

是V的转置矩阵,是一个n*n的矩阵,它里面的正交向量被称为
右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。上面矩阵的维度变化可以参照图4所示。

3a93e6a72d6fa92919af460c8b11031d.png
图4:奇异值分解中各个矩阵维度变化

虽说上面奇异值分解等式成立,但是如何求得左奇异向量、右奇异向量和奇异值呢?

答案:由上面的奇异值分解等式,我们是不知道如何拆分矩阵A的。我们可以把奇异值和特征值联系起来。

首先,我们用矩阵A的转置乘以A,得到一个方阵,用这样的方阵进行特征分解,得到的特征值和特征向量满足下面的等式:

e7fd5490bfbb2c157d5de3727f6be2f7.png

这里的

就是我们要求的右奇异向量。

其次,我们将A和A的转置做矩阵的乘法,得到一个方阵,用这样的方阵进行特征分解,得到的特征和特征向量满足下面的等式:

875c8664d0de88b539e2c52e72957274.png

这里的

就是左奇异向量。

思考:上面我们说

的特征向量组成的矩阵就是我们SVD中的V矩阵,而
的特征向量组成的就是我们SVD中的U矩阵,这有什么根据么?我们来证明一下,以V矩阵的证明为例。

d757c75d50428d186a545ba17a433612.png

上式证明中使用了

,
。可以看出,
的特征向量组成的矩阵就是我们SVD中的V矩阵,而
的特征向量组成的就是我们SVD中的U矩阵。

补充定义:

357da34766577db7b933f1d37cbbfa4c.png

此外,我们还可以得到奇异值,奇异值求法有两种:

第一种:

d49e6b89160d9b87fabc9cc3279bb03e.png

第二种:

通过上面*式的证明,我们还可以看出,特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:

b6b938a642f311a67983b682a72d09e5.png

这里的

就是奇异值,奇异值
跟特征值类似,在矩阵Σ中也是从大到小排列。

思考:我们已经知道如何用奇异值分解任何矩阵了,那么问题又来了,一个m*n的矩阵A,你把它分解成m*m的矩阵U、m*n的矩阵Σ和n*n的矩阵

。这三个矩阵中任何一个的维度似乎一点也不比A的维度小,而且还要做两次矩阵的乘法,这不是没事找事干嘛!把简单的事情搞复杂了么!并且我们知道矩阵乘法的时间复杂度为
。那奇异值分解到底要怎么做呢?补充:两个矩阵A:m*n,B:n*p相乘,时间复杂度(O(nmp))。

答案:在奇异值分解矩阵中Σ里面的奇异值按从大到小的顺序排列,奇异值

从大到小的顺序减小的特别快。
在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上。也就是说,剩下的90%甚至99%的奇异值几乎没有什么作用。因此,我们可以用前面r个大的奇异值来近似描述矩阵,于是奇异值分解公式可以写成如下:

506533030bf2aad399043ae8cbde646d.png

其中r是一个远远小于m和n的数,右边的三个矩阵相乘的结果将会使一个接近A的矩阵。如果r越接近于n,则相乘的结果越接近于A。如果r的取值远远小于n,从计算机内存的角度来说,右边三个矩阵的存储内存要远远小于矩阵A的。所以在奇异值分解中r的取值很重要,就是在计算精度和时间空间之间做选择。

3.SVD计算举例

这里我们用一个简单的矩阵来说明奇异值分解的步骤。我们的矩阵A定义为:

6a14465af20f0f258c3e87369ade0bde.png

b8044923ec0ed35bf2222e80e2d34309.png

a6db9ac898e3d0b789add0943581be33.png

SVD分解的应用

奇异值分解的应用有很多,比如:用SVD解PCA、潜在语言索引也依赖于SVD算法。可以说,SVD是矩阵分解、降维、压缩、特征学习的一个基础的工具,所以SVD在机器学习领域相当的重要。

1)降维。

通过奇异值分解的公式,我们可以很容易看出来,原来矩阵A的特征有n维。经过SVD分解后,可以用前r个非零奇异值对应的奇异向量表示矩阵A的主要特征,这样就把矩阵A进行了降维。

2)压缩。

通过奇异值分解的公式,我们可以看出来,矩阵A经过SVD分解后,要表示原来的大矩阵A,我们只需要存储U、Σ、V三个较小的矩阵即可。而这三个较小规模的矩阵占用内存上也是远远小于原有矩阵A的,这样SVD分解就起到了压缩的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值