FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)
Drineas P, Kannan R, Mahoney M W, et al. Fast Monte Carlo Algorithms for Matrices II: Computing a Low-Rank Approximation to a Matrix[J]. SIAM Journal on Computing, 2006, 36(1): 158-183.
问题
我们有一个矩阵\(A \in \mathbb{R}^{m \times n}\),我们需要对其进行矩阵的分解,很完美很经典的一种方法就是SVD,但是这种方法 的缺憾在于,需要的计算量比较大。不妨设\(A\)的奇异值分解为:
\]
其中:\(U = [u^1, u^2, \ldots, u^m] \in \mathbb{R}^{m \times m}\),\(V = [v^1, v^2, \ldots, v^n] \in \mathbb{R}^{n \times n}\), \(\Sigma = diag(\sigma_1, \sigma_2, \ldots, \sigma_{\rho} \in \mathbb{R}^{m \times n}), \rho=\min{m, n}\)。
假设\(\sigma_1 \ge \sigma_2 \ge \sigma_3 \ldots \ge \sigma_r > \sigma_{r+1}=\ldots=\sigma_{\rho}=0\),那么\(rank(A) = r\),矩阵\(A\)的零空间\(\mathrm{null}(A)=span(v^{r+1}, \ldots, v^{\rho})\),矩阵\(A\)的值域为\(\mathrm{range}(A) = span(u^1, \ldots, u^r)\)
那么\(A\)可以有下面的方法表示:
\]
到这里,我们简单介绍了SVD。回到正题,为了避免计算量大的问题,这篇文章提出了一种基于蒙特卡洛采样的矩阵分解的算法。
算法
为什么可以这么采样,以及概率的选择,在FAST MONTE CARLO ALGORITHMS FOR MATRICES I中有介绍。算法的思想很朴素,但是通篇的证明让人抓耳挠腮。
LINEARTIMESVD 算法

CONSTANTTIMESVD 算法

理论
俩个算法,作者都给除了形如下的界(大概率):

\(\xi=2,F\),\(D*\)是\(A\)的一个低秩的逼近。
算法1的理论
作者先给出的是下面的证明,

我们先来分析上面的不等式,比较可以发现\(D^* = H_kH_K^TA\),注意,\(C = H\Sigma_CY\),\(A_k = U_kU_k^TA\)
我们先来看第一部分的证明,这部分只是简单地利用了\(Tr\)的性质。

第二部分的证明,是为了导出定理2的后面部分,第一个不等式,利用了Cauchy-Schwarz不等式,把\(|\|A^TH_k\|_F^2- \sum_{t=1}^k \sigma_t^2 (C)|\)看成\(|\sum \limits_{t=1}^k (|A^Th^t|^2-\sigma_t^2(C))\times 1|\)这就成了俩个向量的内积了。第二个等式易证,第三个等式同样。最后一个不等式,是因为,如果我们将\(h^t, t=1,\ldots,k\)扩充为一组标准正交基\(h^t,t=1,\ldots,m\),那么\(\sum \limits_{t=1}^{m}({h^t}^T(AA^T-CC^T)h^t)=\sum \limits_{t=1}^{m} \lambda_t\),其中\(\lambda_t\)是\(AA^T-CC^T\)的特征值(降序排列)。我们知道\(a+b=c, a,b>0\),\(max(a^2+b^2)=c^2\),通过数学归纳法,容易得到最后一个不等式。

第三部分的证明,第一个不等式,同样利用了Cauchy-Schwarz不等式,接下来的等式和不等式易证。最后一个不等式,利用了Hoffman-Wielandt不等式:

这个不等式的证明比较麻烦,在《代数特征值问题》一书中有提(虽然书中矩阵是方阵,可以类似地推导)。

最后一部分通过加一项减一项就可以得到了。

到此关于\(F\)范数的一个理论就得到了,接下来作者给出了关于\(2\)范数的性质。

通过与定理2的比较可以发现,缺了\(\sqrt{k}\)这一部分。
令\(\mathcal{H}_k=range(H_k) = span(h^1,\ldots,h^k)\),\(\mathcal{H}_{m-k}\)为其正交补。那么,对于任意向量\(x \ in \mathbb{R}^m\),可以分解为\(x = \alpha y + \beta z,y\in \mathcal{H}_k, z \in \mathcal{H}_{m-k}\),而且\(\alpha^2 + \beta^2 = 1\)
第一部分的证明,不等式部分利用了三角不等式,及\(\alpha, \beta \le 1\)的性质。最后一个等式成立的原因是\(H_kH_k^T y = y, y \in \mathcal{H}_k\)

第二部分的证明,第一个不等式部分的后半部分是显然的,前半部分是因为\(z \in \mathcal{H}_{m-k}\),第二个不等式,我们需要利用下面的一个性质:


到此,这部分的定理也证毕了。
接下来,还有定理4:


这部分的证明,需要利用FAST MONTE CARLO ALGORITHMS FOR MATRICES I 中的性质,这里便不讲了。
算法2 的理论
我们只给出了结果,证明实在有些长。

代码
import numpy as np
class FastSVD:
def __init__(self, A):
self.m, self.n = A.shape
self.A = np.array(A, dtype=float)
self.norm_F = FastSVD.forbenius(self.A)
@classmethod
def forbenius(cls, A):
"""矩阵A的F范数"""
return np.sum(A ** 2)
@classmethod
def approx_h(cls, A):
"""A=UDV^T, 我们要U"""
value, vector = np.linalg.eig(A.T @ A)
U = []
for i in range(len(value)):
if value[i] < 1e-15:
break
else:
U.append(A @ vector[:, i] / np.sqrt(value[i]))
return np.array(U).T
def fastSVD(self, c):
"""返回的H的每一列是我们所需要的"""
assert isinstance(c, int), "{0} is not an integer"
p = np.array([self.A[:, i] @ self.A[:, i] / self.norm_F for i in range(self.n)])
lucky_dog = np.random.choice(np.arange(self.n), size=c, replace=True, p=p)
C = np.zeros((self.m, c))
for t, dog in enumerate(lucky_dog):
C[:, t] = self.A[:, dog] / np.sqrt(c * p[dog])
H = FastSVD.approx_h(C)
return H
FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)的更多相关文章
- (转)Markov Chain Monte Carlo
Nice R Code Punning code better since 2013 RSS Blog Archives Guides Modules About Markov Chain Monte ...
- Monte Carlo Policy Evaluation
Model-Based and Model-Free In the previous several posts, we mainly talked about Model-Based Reinfor ...
- Monte Carlo方法简介(转载)
Monte Carlo方法简介(转载) 今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...
- [其他] 蒙特卡洛(Monte Carlo)模拟手把手教基于EXCEL与Crystal Ball的蒙特卡洛成本模拟过程实例:
http://www.cqt8.com/soft/html/723.html下载,官网下载 (转帖)1.定义: 蒙特卡洛(Monte Carlo)模拟是一种通过设定随机过程,反复生成时间序列,计算参数 ...
- Monte Carlo Method(蒙特·卡罗方法)
0-故事: 蒙特卡罗方法是计算模拟的基础,其名字来源于世界著名的赌城——摩纳哥的蒙特卡罗. 蒙特卡罗一词来源于意大利语,是为了纪念王子摩纳哥查理三世.蒙特卡罗(MonteCarlo)虽然是个赌城,但很 ...
- 马尔科夫链蒙特卡洛(Markov chain Monte Carlo)
(学习这部分内容大约需要1.3小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC) 是一类近似采样算法. 它通过一条拥有稳态分布 \(p\) 的马尔科夫链对 ...
- 蒙特卡罗(Monte Carlo)方法简介
蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法. 二 解决问题的基本思路 Monte Carlo方法的基本思想很早以前就被人们所发 ...
- Monte carlo
转载 http://blog.sciencenet.cn/blog-324394-292355.html 蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数 ...
- 蒙特卡罗方法、蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)初探
1. 蒙特卡罗方法(Monte Carlo method) 0x1:从布丰投针实验说起 - 只要实验次数够多,我就能直到上帝的意图 18世纪,布丰提出以下问题:设我们有一个以平行且等距木纹铺成的地板( ...
随机推荐
- Php中的goto用法
我们先举个简单示例: <?php goto LABEL; //这个标签自定义 echo '乔峰'; LABEL: echo '鸠摩智'; 以上例程会输出:鸠摩智 解释:goto 操作符可以用来跳 ...
- 1.docker常用命令
1.启动交互式容器 $ docker run -i -t IMAGE /bin/bash -i --interactive=true|false 默认是false -t --tty=true|fals ...
- 【Mybatis】使用Mybatis-Generator自动生成entity、dao、mapping
使用过mybatis的应该都有用过Mybatis-Generator,本文主要介绍使用Mybatis-Generator来自动生成entity.dao.mapping文件. Mybatis-Gener ...
- 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句
参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...
- 命令行BASH的基本操作
前面说了,我们要尽量少用GNOME图形界面,而应该以使用BASH命令行为主. SHELL Shell是操作系统内核的壳,因为我们不能直接操作系统的内核Kernel,只能通过Shell去操作,Shell ...
- Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用
学习Solr前需要有Lucene的基础 Lucene的一些简单用法:https://www.cnblogs.com/dddyyy/p/9842760.html 1.部署Solr到Tomcat(Wind ...
- 预防sql注入
前言: 这两天做项目的时候发现很多小地方没有注意js或者sql注入,平时登录都是md5加密,今天突然发现记录一下. 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字 ...
- 前端入门11-JavaScript语法之数组
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...
- SpringBoot实现全文搜索
• 全文搜索 • solr安装 • solr中文分词 • solr数据库导入 • solr数据查询 • solrj接口调用 1:
- PJSUA2开发文档--第五章 帐户(号)Accounts
第五章 帐户(号) 帐户提供正在使用该应用程序的用户的身份(或身份).一个帐户有一个与之相关的SIP统一资源标识符(URI).在SIP术语中,该URI用作该人的记录地址( Address of Rec ...