FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

时间:2023-02-18 19:56:42

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\)的奇异值分解为:

\[A = U\Sigma V^{T}
\]

其中:\(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\)可以有下面的方法表示:

\[A = U_r \Sigma_r V_r^T = \sum \limits_{t=1}^{r} \sigma_t u^t {v^t}^T
\]

到这里,我们简单介绍了SVD。回到正题,为了避免计算量大的问题,这篇文章提出了一种基于蒙特卡洛采样的矩阵分解的算法。

算法

为什么可以这么采样,以及概率的选择,在FAST MONTE CARLO ALGORITHMS FOR MATRICES I中有介绍。算法的思想很朴素,但是通篇的证明让人抓耳挠腮。

LINEARTIMESVD 算法

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

CONSTANTTIMESVD 算法

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

理论

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

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

\(\xi=2,F\),\(D*\)是\(A\)的一个低秩的逼近。

算法1的理论

作者先给出的是下面的证明,

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

我们先来分析上面的不等式,比较可以发现\(D^* = H_kH_K^TA\),注意,\(C = H\Sigma_CY\),\(A_k = U_kU_k^TA\)

我们先来看第一部分的证明,这部分只是简单地利用了\(Tr\)的性质。

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

第二部分的证明,是为了导出定理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\),通过数学归纳法,容易得到最后一个不等式。

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

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

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

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

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

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

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

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

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

通过与定理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\)

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

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

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

到此,这部分的定理也证毕了。

接下来,还有定理4:

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

这部分的证明,需要利用FAST MONTE CARLO ALGORITHMS FOR MATRICES I 中的性质,这里便不讲了。

算法2 的理论

我们只给出了结果,证明实在有些长。

FAST MONTE CARLO ALGORITHMS FOR MATRICES II (快速的矩阵分解策略)

代码

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 (快速的矩阵分解策略)的更多相关文章

  1. (转)Markov Chain Monte Carlo

    Nice R Code Punning code better since 2013 RSS Blog Archives Guides Modules About Markov Chain Monte ...

  2. Monte Carlo Policy Evaluation

    Model-Based and Model-Free In the previous several posts, we mainly talked about Model-Based Reinfor ...

  3. Monte Carlo方法简介&lpar;转载&rpar;

    Monte Carlo方法简介(转载)       今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...

  4. &lbrack;其他&rsqb; 蒙特卡洛&lpar;Monte Carlo&rpar;模拟手把手教基于EXCEL与Crystal Ball的蒙特卡洛成本模拟过程实例:

    http://www.cqt8.com/soft/html/723.html下载,官网下载 (转帖)1.定义: 蒙特卡洛(Monte Carlo)模拟是一种通过设定随机过程,反复生成时间序列,计算参数 ...

  5. Monte Carlo Method&lpar;蒙特&&num;183&semi;卡罗方法&rpar;

    0-故事: 蒙特卡罗方法是计算模拟的基础,其名字来源于世界著名的赌城——摩纳哥的蒙特卡罗. 蒙特卡罗一词来源于意大利语,是为了纪念王子摩纳哥查理三世.蒙特卡罗(MonteCarlo)虽然是个赌城,但很 ...

  6. 马尔科夫链蒙特卡洛&lpar;Markov chain Monte Carlo&rpar;

    (学习这部分内容大约需要1.3小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC) 是一类近似采样算法. 它通过一条拥有稳态分布 \(p\) 的马尔科夫链对 ...

  7. 蒙特卡罗&lpar;Monte Carlo&rpar;方法简介

    蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法. 二 解决问题的基本思路 Monte Carlo方法的基本思想很早以前就被人们所发 ...

  8. Monte carlo

    转载 http://blog.sciencenet.cn/blog-324394-292355.html 蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数 ...

  9. 蒙特卡罗方法、蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)初探

    1. 蒙特卡罗方法(Monte Carlo method) 0x1:从布丰投针实验说起 - 只要实验次数够多,我就能直到上帝的意图 18世纪,布丰提出以下问题:设我们有一个以平行且等距木纹铺成的地板( ...

随机推荐

  1. HDU1086You can Solve a Geometry Problem too&lpar;判断线段相交&rpar;

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  2. 十大纺织品、布料、面料品牌排名 - 十大品牌 - 中国品牌网 Chinapp&period;com

    十大纺织品.布料.面料品牌排名 - 十大品牌 - 中国品牌网 Chinapp.com 十大纺织品.布料.面料品牌排名

  3. MFC中全局变量的定义及使用

    用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行.实际上有多种方法可以实现,这里只介绍两种 ...

  4. 二叉排序树BST代码(JAVA)

        publicclassTest{     publicstaticvoid main(String[] args){         int[] r =newint[]{5,1,3,4,6,7 ...

  5. 找呀志&lowbar;java网络编程(5)TCP和udp差额

    1.TCP定向链接,尽管该网络的不稳定性质,所述不安全确定多少次握手不能保证连接的可靠性.但TCP的三次握手至少(事实上确保了相当大的程度)以确保连接的可靠性; 和UDP不面向连接的,UDP前传送的数 ...

  6. Ringo替换Paul

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 样条之Akima光滑插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // Akima光滑插值 // t - 存放指 ...

  8. android cannot locate symbol &&num;39&semi;sigemptyset&&num;39&semi;问题解决

    设备是android 4.1的平板电脑,支持armeabi-v7a和mips,为了能用上poco c++ lib,用cmake编译了poco mips架构的lib,但在android studio里引 ...

  9. hdu1690Bus System--解题报告

    题意:有一个公交系统的收费标准例如以下表: 然后问:给出 这些L1~4 & C1~4的值,然后 N个站.列出每一个站的X坐标.然后询问M次,问两个站台的最小花费 题解:那么这里非常明显是最短路 ...

  10. 最新sublime Text3 注册激活码

    sublime build 3103注册码 Enter License -- BEGIN LICENSE --Ryan ClarkSingle User LicenseEA7E-8124792158A ...