SVD简介

SVD不仅是一个数学问题,在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic Indexing)或隐性语义分析(Latent Semantic Analysis)。另外在工程应用中的很多地方都有它的身影,例如在推荐系统方面。在2006年末,电影公司Netflix曾经举办一个奖金为100万刀乐的大赛,这笔奖金会颁给比当时最好系统还要好10%的推荐系统参赛者。It is the “SVD” that the winner used。(点击可以下载相关文献)Yehuda Koren, “The BellKor Solution to the Netflix Grand Prize,” August 2009。

奇异值与特征值

关于特征值我们比较熟悉,因为在大学课程《线性代数》中就讲到了特征值与特征向量。而对于奇异值可能会比较陌生,在讲解特征值之后会详细讲解奇异值。

特征值分解和奇异值分解在机器学习领域是非常普遍的,而且两者有着密切的关系。

特征值分解

对于一个方阵A,如果一个向量v和实数λ满足如下关系:

Av = λv

则λ被称为特征向量v对应方阵A的特征值,一个矩阵的一组特征向量是一组正交向量。

令AU = U∧。其中:

U = [v1 v2 ... vm],

这里假设A有m个特征值,特征值分解是将一个矩阵分解成下面的形式:

A = U∧U-1 U∧UT

其中U是这个矩阵A的特征向量组成的矩阵,由于U是正交阵,正交阵的逆矩阵等于其转置;Σ是一个对角阵,每一个对角线上的元素就是一个特征值。

矩阵A分解了,相应的,其对应的映射也分解为三个映射。现在假设有向量x,用A将其变换到A的列空间中,那么首先由UT先对x做变换:

U是正交阵,则UT也是正交阵,所以UTx的变换是正交变换,它将x用新的坐标系来表示,这个坐标系就是A的所有正交的特征向量构成的坐标系。比如将x用A的所有特征向量表示为:

则通过第一个变换就可以把x表示为[a1 a2 ... am]T

然后,在新的坐标系表示下,由中间那个对角矩阵对新的向量坐标换,其结果就是将向量往各个轴方向拉伸或压缩:

从上图可以看到,如果A不是满秩的话,那么就是说对角阵的对角线上元素存在0,这时候就会导致维度退化,这样就会使映射后的向量落入m维空间的子空间中。

最后一个变换就是U对拉伸或压缩后的向量做变换,由于U和U-1是互为逆矩阵,所以U变换是U-1变换的逆变换。

因此,从对称阵的分解对应的映射分解来分析一个矩阵的变换特点是非常直观的。假设对称阵特征值全为1那么显然它就是单位阵,如果对称阵的特征值有个别是0其他全是1,那么它就是一个正交投影矩阵,它将m维向量投影到它的列空间中。

特征值的几何意义

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

它对应的线性变换如图1所示:

图1

相当于在x轴上较原来的向量扩展了3倍。也就是说对每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,拉伸;当值<1时,缩短。当矩阵不是对称阵时,例如下面的矩阵M

它所描述的变换如图2所示:

图2

这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示)。在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)

当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换。这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向。我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是说:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解一个最大的局限就是变换的矩阵必须是方阵。

奇异值分解

特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的。在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有N个学生,每个学生有M科成绩,这样形成的一个NxM的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法

A = UΣVT

假设A是一个N * M的矩阵,那么得到的U是一个NxN的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个NxM的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置)是一个NxN的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),如图3所示:

图3

奇异值与特征值的关系

现在假设存在M*N矩阵A,事实上,A矩阵将n维空间中的向量映射到k(k<=m)维空间中,k=rank(A)。现在的目标就是:在n维空间中找一组正交基,使得经过A变换后还是正交的。假设已经找到这样一组正交基:

则A矩阵将这组基映射为:

并满足如下关系:

所以如果正交基v选择为ATA的特征向量的话,由于ATA是对称阵(N * M),v之间两两正交,那么

将ATA看做一个N*M的矩阵。

因为

所以

所以取单位向量

由此可得

当k < i <= m时,对u1,u2,...,uk进行扩展uk+1,...,um,使得u1,u2,...,um为m维空间中的一组正交基,即将{u1,u2,...,uk}正交基扩展成{u1,u2,...,um},Rm空间的单位正交基。

同样的,对v1,v2,...,vk进行扩展vk+1,...,vn(这n-k个向量存在于A的零空间中,即Ax=0的解空间的基),使得v1,v2,...,vn为n维空间中的一组正交基,即在A的零空间中选取{vk+1,vk+2,...,vn},使得Avi = 0,i > k,并取

则可得到

继而可以得到A矩阵的奇异值分解:

这里的u就是左奇异向量,VT就是右奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解

r是一个远小于m、n的数,这样就可以进行压缩矩阵。例如:m、n取32,r取2,那么相对于A所占空间大小1024,U、Σ、VT总共的空间大小为(64+64+2 = 130),获得了几乎10倍的压缩比。

SVD证明满秩分解

利用矩阵分块乘法展开得:

可以看到第二项为0,有

则A=XY即是A的满秩分解。

如何选取需要保留的奇异值

一个典型的做法就是保留矩阵中90%的能量信息:将所有的奇异值求其平方和,将奇异值的平方和累加到总值的90%为止。后边会给出一个具体的应用例子。另一个启发式策略就是:当矩阵有上万个奇异值时,那么就保留前面的2000或3000个。

例如矩阵M,如下所示:

 M = [[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],
[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],
    [0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],
[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],
[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],
[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],
[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],
[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],
[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],
[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]

我们利用numpy库中的svd方法对M做奇异值分解,过程如下:

1、获得分解后的矩阵U、Sigma、VT,即M = U * Sigma * VT。

2、计算矩阵的总能量

并求出其90%的能量数值,最终可以看出前三个元素所包含的能量就高于总能量的90%。

关于SVD的应用在此不做详细介绍,本篇文章只是对SVD有个大概的认识和理解,具体的算法会在以后的文章中专门给出。

参考资料

Dan Kalman, A Singularly Valuable Decomposition: The SVD of a Matrix, The College Mathematics Journal 27 (1996), 2-23.

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

Peter Harrington,Machine Learning in Action(机器学习实战)

关于SVD(Singular Value Decomposition)的那些事儿的更多相关文章

  1. SVD singular value decomposition

    SVD singular value decomposition https://en.wikipedia.org/wiki/Singular_value_decomposition 奇异值分解在统计 ...

  2. 奇异值分解(We Recommend a Singular Value Decomposition)

    奇异值分解(We Recommend a Singular Value Decomposition) 原文作者:David Austin原文链接: http://www.ams.org/samplin ...

  3. We Recommend a Singular Value Decomposition

    We Recommend a Singular Value Decomposition Introduction The topic of this article, the singular val ...

  4. 【转】奇异值分解(We Recommend a Singular Value Decomposition)

    文章转自:奇异值分解(We Recommend a Singular Value Decomposition) 文章写的浅显易懂,很有意思.但是没找到转载方式,所以复制了过来.一个是备忘,一个是分享给 ...

  5. [转]奇异值分解(We Recommend a Singular Value Decomposition)

    原文作者:David Austin原文链接: http://www.ams.org/samplings/feature-column/fcarc-svd译者:richardsun(孙振龙) 在这篇文章 ...

  6. [转载]We Recommend a Singular Value Decomposition

    原文:http://www.ams.org/samplings/feature-column/fcarc-svd Introduction The topic of this article, the ...

  7. Singular value decomposition

    SVD is a factorization of a real or complex matrix. It has many useful applications in signal proces ...

  8. [Math Review] Linear Algebra for Singular Value Decomposition (SVD)

    Matrix and Determinant Let C be an M × N matrix with real-valued entries, i.e. C={cij}mxn Determinan ...

  9. 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理

    0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...

随机推荐

  1. bcb6 中安装 delphi7 的控件包

    其实只要新建一个包,然后把 d7 中的包包含的 pas 文件也包含进去就行了. 同时它会把对应的 bpi 文件也自动包含. 对于 bcb6 中没有的 PosEx 函数可以这样处理,把 d7 中的实现复 ...

  2. 14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读

    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读意味着 InnoDB 使用多版本来实现一个查询数据库的快照在某个时间点. 查看看到的事务做出的改变被提 ...

  3. HDOJ(HDU) 2143 box(简单的多次判断-用的卫条件)

    Problem Description One day, winnie received a box and a letter. In the letter, there are three inte ...

  4. 使用Sublime Text搭建python调试环境

    原文地址:http://blog.csdn.net/wenxuansoft/article/details/38559731 pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的 ...

  5. 值得关注的 10 个 Python 英文博客

    英文原文:http://pythontips.com/2013/07/31/10-python-blogs-worth-following/ 中文翻译参考: http://python.jobbole ...

  6. android快捷简单的实现音乐播放器

    自己做了一个相对完整的音乐播放器,现在把播放模块提取出来,分享给大家.音乐播放器基本功能都实现了的,可能有些BUG,希望谅解. 播放器功能如下: 1.暂停,播放 2.拖动条实现,快进,快退 3.歌词同 ...

  7. 你真正的了解Ajax?Ajax技术简述

    Ajax技术是目前在浏览器中通过JavaScript脚本可以使用的所有技术的集合.Ajax并没有创造出某种具体的新技术,它所使用的大多数技术都是在很多年以前就已经存在了,然而Ajax以一种崭新的方式来 ...

  8. CentOS虚拟机不能联网状况下yum方式从本地安装软件包(转载的)

    大家都知道yum是linux下一个非常好用的软件安装/卸载软件,它方便操作,而且最厉害的是可以解决令人头疼的包依赖关系.但是若是你的linux不能联网,若想使用yum安装软件,可以依照下面的方法. 1 ...

  9. 通过控件获取cell

    #pragma mark - 通过控件获取cell -(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id ...

  10. 两个有序数组的第n大数

    两个有序数组,各自含有n个元素,求第n大的元素 1.顺序遍历两个数组,计数变量k统计出现的第k小元素,时间复杂度为O(n) 代码例如以下: int getmid(int a[],int b[],int ...