Fast Randomized SVD
发布日期:2021-06-30 15:15:55
浏览次数:3
分类:技术文章
本文共 2787 字,大约阅读时间需要 9 分钟。
一、简介
标题可译为快速随机奇异值分解,单纯觉得念得拗口,故标题未做翻译。之前看过一点相关内容,当时对这个方法还谈不上理解,随着相关文献看的越来越多,理解也就逐渐加深了。当然,涉及到Terry Tao的地方我没有花大量的时间去研读,所以假设我就知道了。今天下午先不谈奇异值分解与其他方法的联系,只是总结一下我对这个方法的理解。事实上,有很多方法可以计算矩阵的奇异值分解,下述内容利用主流的 随机思想来计算矩阵的奇异值分解。
二、符号标定及基本概念
文中各矩阵维度: 输入A(m*n), 随机矩阵Ω(n*l),前面两者的乘积矩阵Y(m*l),QR分解得到的矩阵Q(m*l),R(l*l)
The range of A:英文中这么一个概念,实际上就是列空间的意思,即由矩阵A的列向量张成的空间,参照wiki: 这个概念没什么好吓人的
正交矩阵:A的转置乘以A等于A乘以A的转置等于单位阵,则A称为正交矩阵。正交矩阵的逆矩阵等于正交矩阵的转置。
QR分解:矩阵分解成两个矩阵的乘积QR,其中Q是一个正交矩阵,R是一个非奇异的上三角矩阵。
线性代数的一点小trick:A的转置的逆矩阵等于A的逆矩阵的转置,这一个很容易证明不再啰嗦了。AB乘积的转置等于B的转置乘以A的转置。
交代了这几点,下面叙述应该不会存在什么问题了。
三、算法理解
算法主要分为两个步骤:1.利用随机技术计算A的列空间的一个近似Q,使得Q满足有r个正交列(r较小)且A近似等于Q*Qt*A(Qt表示Q的转置) 2.得到Q利用Q计算A的奇异值分解
在给定Q的情况下,构建矩阵B=QtA,由于Q只含有少量的列,因此Q的“体积”相对较小,其奇异值分解相对容易计算,不妨记作B=S∑Vt,由前面简介A=Q*Qt*A=Q(Qt*A)=Q*B=Q(S∑Vt)=QS∑Vt=(QS)∑Vt,容易证明QS为正交阵,不妨迹QS=U,从而得到了A的奇异值分解A=U∑Vt
这个算法的小trick来自于近似矩阵Q是可以高效计算得到的!(说的容易,理解起来要慢慢来)
直觉上,要去估计矩阵A的列空间,我们可以随机取一系列的向量Ω1,Ω2,Ω3...然后检查由A与这些向量作用的结果张成的空间(翻译的比较拗口,后面会说到如何理解),不妨将随机选取的向量组成的矩阵记作Ω,然后计算一个矩阵Y=AΩ,然后对Y进行QR分解得到Y=QR,然后Y就可以看成由Q的列向量张成的,即Q可以看成Y的列空间的正交基。
翻译到了这里到底怎么理解呢?为什么QR分解得到的这个Q就可以看成我们最初希望寻求的那个Q呢?注意到,前面文中有两个关于Y的公式,把这两个式子放到一起比较一下就相对容易理解了
Y=AΩ
Y=QR
第一个式子中,Y可以看作由A的列向量张成的,那在第二个式子中,Y又可以看成由Q的列向量张成的,这是不是可以说Q是A的列空间的一个近似了呢?而且看维度都是m维的,为了方便理解,下面给出一个简陋的例子,比如说
Y=[3 0 0;0 3 0;0 0 3](3*3),那么Y可以分解成两个矩阵的乘积,分别为A=[1 0 0 0;0 1 0 0;0 0 1 0](3*4),Ω=[3 0 0;0 3 0;0 0 3;0 0 0](4*3)(这里我故意分别多写了一行和一列),对Y进行QR分解得到Q=I3(3阶单位阵)*Y(这个例子比较特别,但是可以看成一个QR分解),可以发现A与I3是相似的,仅仅一列不一样而且是一个零列,因此我可以说Q是A的列空间的一个近似,且Q含有少量的正交列,是不是就满足了一开始说的Q需要满足的第一个条件了呢?(btw,这个例子不太好,应该找一个列很多的矩阵来做分解但是手工不容易构造)
捋一下算法流程吧
1.生成一个高斯随机矩阵Ω(n*l)
2.构建一个m*l维的样本矩阵Y=AΩ
3.对Y进行QR分解得到m*l维的正交矩阵Q
4.构建一个l*n维的矩阵B=Qt*A
5.计算小矩阵B的奇异值分解B=S∑Vt
6.令QS=U得到A的奇异值分解A=U∑Vt
我自己也尝试着实现了一下该算法,不贴我自己实现的了,贴一下从网上找来的代码,方便群众,代码所有权归原作者所有,链接在这里: 。无意侵权,如有侵权,可联系jzwang@bjtu.edu.cn,马上删掉!代码如下
function [U,S,V] = rsvd(A,K)%-------------------------------------------------------------------------------------% random SVD% Extremely fast computation of the truncated Singular Value Decomposition, using% randomized algorithms as described in Halko et al. 'finding structure with randomness%% usage : %% input:% * A : matrix whose SVD we want% * K : number of components to keep%% output:% * U,S,V : classical output as the builtin svd matlab function%-------------------------------------------------------------------------------------% Antoine Liutkus (c) Inria 2014[M,N] = size(A);P = min(2*K,N);X = randn(N,P);Y = A*X;W1 = orth(Y);B = W1'*A;[W2,S,V] = svd(B,'econ');U = W1*W2;K=min(K,size(U,2));U = U(:,1:K);S = S(1:K,1:K);V=V(:,1:K);下面第二个问题是这样求得的Q满足A近似等于Q*Qt*A吗?答案是满足的!因为B=QtA,所以A=QB=QQtA,也就是说这样所构建的Q是符合我们开始时候所期待的!
参考:
1.https://en.wikipedia.org/wiki/QR_decomposition
2.http://arxiv.org/abs/0909.4061
3.https://en.wikipedia.org/wiki/Row_and_column_spaces
4.https://research.facebook.com/blog/fast-randomized-svd/
转载地址:https://jianzhuwang.blog.csdn.net/article/details/51791695 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年05月03日 12时29分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Dubbo服务治理向SpringCloud服务治理兼容,过渡
2019-05-01
JAVA使用HBase的Rowkey精确批量处理
2019-05-01
Collections排序sort排序list,单个及多条件排序
2019-05-01
Mysql中where 条件中加 if 判断-纯jdbc
2019-05-01
分布式数据中间件TDDL、Amoeba、Cobar、MyCAT架构比较
2019-05-01
Sharding-JDBC的SQL引擎(Druid)处理的支持情况总结
2019-05-01
大数据开发者应该知道的分布式系统 CAP 理论
2019-05-01
HBase在人工智能场景的使用
2019-05-01
Apache Spark 2.4 中解决复杂数据类型的内置函数和高阶函数介绍
2019-05-01
数据结构与算法?看这篇就够了!
2019-05-01
Apache Kafka:优化部署的 10 种最佳实践
2019-05-01
HBase 中加盐之后的表如何读取:Spark 篇
2019-05-01
一篇文章了解 Spark Shuffle 内存使用
2019-05-01
【免费下载】某平台3980元Hadoop大数据/机器学习全套视频,仅此1次
2019-05-01
Apache Hive 联邦查询(Query Federation)
2019-05-01
为什么说流处理即未来?
2019-05-01
Leetcode 剑指 Offer 39. 数组中出现次数超过一半的数字 c#
2019-05-01
Leetcode 35. 搜索插入位置 c#
2019-05-01
LeetCode64:最小路径和
2019-05-01