插值矩阵分解 (scipy.linalg.interpolative )

0.13 新版功能.

矩阵的插值分解(ID) \(A \in \mathbb{{C}}^{{m \times n}}\) 级别的 \(k \leq \min \{{ m, n \}}\) 是因式分解

\[A\PI= \BEGIN{bMatrix} A\PI_{1}&A\PI_{2} \end{bMatrix}= A\PI_{1} \BEGIN{bMatrix} I&T \end{bMatrix},\]

哪里 \(\Pi = [\Pi_{{1}}, \Pi_{{2}}]\) 是一个置换矩阵,它具有 \(\Pi_{{1}} \in \{{ 0, 1 \}}^{{n \times k}}\) ,即, \(A \Pi_{{2}} = A \Pi_{{1}} T\) 。这可以等效地写成 \(A = BP\) ,在哪里 \(B = A \Pi_{{1}}\)\(P = [I, T] \Pi^{{\mathsf{{T}}}}\) 是不是 骨架插值矩阵 ,分别为。

如果 \(A\) 没有确切的等级 \(k\) ,则存在ID形式的近似,使得 \(A = BP + E\) ,在哪里 \(\| E \| \sim \sigma_{{k + 1}}\) 都是关于 \((k + 1)\) -第3个最大奇异值 \(A\) 。请注意, \(\sigma_{{k + 1}}\) 是排名的最佳可能误差 -\(k\) 近似,实际上是通过奇异值分解(SVD)实现的。 \(A \approx U S V^{{*}}\) ,在哪里 \(U \in \mathbb{{C}}^{{m \times k}}\)\(V \in \mathbb{{C}}^{{n \times k}}\) 具有正交柱和 \(S = \mathop{{\mathrm{{diag}}}} (\sigma_{{i}}) \in \mathbb{{C}}^{{k \times k}}\) 是具有非负条目的对角线。与SVD相比,使用ID的主要优势是:

  • 它的建造成本更低;

  • 它保留了 \(A\) ;及

  • 根据的单位子矩阵计算效率更高 \(P\)

例行公事

主要功能:

interp_decomp \(a、EPS_或_k[, rand] )

矩阵的计算ID。

reconstruct_matrix_from_id \(B,IDX,项目)

根据矩阵ID重建矩阵。

reconstruct_interp_matrix \(IDX,项目)

根据ID重建插值矩阵。

reconstruct_skel_matrix \(a,k,idx)

根据ID重建骨架矩阵。

id_to_svd \(B,IDX,项目)

将ID转换为SVD。

svd \(a、EPS_或_k[, rand] )

通过ID计算矩阵的奇异值分解。

estimate_spectral_norm \(a[, its] )

用随机化幂法估计矩阵的谱范数。

estimate_spectral_norm_diff \(A,B[, its] )

用随机化幂法估计两个矩阵之差的谱范数。

estimate_rank \(a,EPS)

使用随机化方法将矩阵秩估计到指定的相对精度。

支持功能:

seed \([seed] )

为此ID包中使用的内部随机数生成器设定种子。

rand \(*形状)

通过一种非常有效的滞后Fibonacci方法产生标准的均匀伪随机数。

参考文献

本模块使用ID软件包 [R5a82238cdab4-1] 由Martinsson、Rokhlin、Shkolnisky和Tygert编写,Tygert是一个Fortran库,用于使用各种算法计算ID,包括 [R5a82238cdab4-2] 中描述的较新的随机化方法 [R5a82238cdab4-3], [R5a82238cdab4-4], 和 [R5a82238cdab4-5]. 此模块以便于Python用户使用的方式公开其功能。请注意,除了组织更简单、更一致的界面之外,此模块不会添加任何功能。

我们建议用户同时查阅 documentation for the ID package

R5a82238cdab4-1

首页--期刊主要分类--期刊细介绍--期刊题录与文摘--期刊详细文摘内容ID:用于通过插值分解进行矩阵低阶近似的软件包,版本0.2。http://tygert.com/id_doc.4.pdf.

R5a82238cdab4-2

首页--期刊主要分类--期刊细介绍--期刊题录与文摘--期刊详细文摘内容“关于低秩矩阵的压缩。” 暹罗·J·科学。电脑。 26(4):1389--1404,2005。 DOI:10.1137/030602678

R5a82238cdab4-3

首页--期刊主要分类--期刊细介绍--期刊题录与文摘--期刊详细文摘内容“矩阵低阶近似的随机化算法。” 程序纳特尔。阿卡德。SCI。美国。 第104(51):20167--20172,2007年。 DOI:10.1073/pnas.0709640104

R5a82238cdab4-4

首页--期刊主要分类--期刊细介绍--期刊题录与文摘--期刊详细文摘内容“矩阵分解的随机化算法。” 应用程序。电脑。哈蒙。肛门。 30(1):47--68,2011。 DOI:10.1016/j.acha.2010.02.003

R5a82238cdab4-5

题名/责任者:Required/J.“一种矩阵近似的快速随机化算法。” 应用程序。电脑。哈蒙。肛门。 25(3):335-366,2008。 DOI:10.1016/j.acha.2007.12.002

教程

正在初始化

第一步是导入 scipy.linalg.interpolative 通过发出命令:

>>> import scipy.linalg.interpolative as sli

现在让我们建立一个矩阵。为此,我们考虑一个众所周知具有低秩的希尔伯特矩阵:

>>> from scipy.linalg import hilbert
>>> n = 1000
>>> A = hilbert(n)

我们还可以通过以下方式明确执行此操作:

>>> import numpy as np
>>> n = 1000
>>> A = np.empty((n, n), order='F')
>>> for j in range(n):
>>>     for i in range(m):
>>>         A[i,j] = 1. / (i + j + 1)

注意标志的用法 order='F' 在……里面 numpy.empty 。这以Fortran连续的顺序实例化矩阵,对于避免在传递到后端时复制数据非常重要。

然后,我们定义矩阵的乘法例程,将其视为 scipy.sparse.linalg.LinearOperator

>>> from scipy.sparse.linalg import aslinearoperator
>>> L = aslinearoperator(A)

这会自动设置描述矩阵及其伴随项对向量的操作的方法。

计算ID

我们有几种算法可供选择来计算ID。这些算法很大程度上取决于两种二分法:

  1. 矩阵如何表示,即通过其条目或通过其对向量的作用来表示;以及

  2. 是否将其近似为固定的相对精度或固定的秩。

下面我们将依次介绍每个选项。

在所有情况下,ID都由三个参数表示:

  1. 军衔 k

  2. 索引数组 idx ;及

  3. 插值系数 proj

ID由关系指定 np.dot(A[:,idx[:k]], proj) == A[:,idx[k:]]

从矩阵条目

我们首先考虑一个矩阵,它的条目是给定的。

要将ID计算为固定精度,请键入以下内容:

>>> k, idx, proj = sli.interp_decomp(A, eps)

哪里 eps < 1 是所需的精度。

要计算固定等级的ID,请使用:

>>> idx, proj = sli.interp_decomp(A, k)

哪里 k >= 1 是想要的级别。

这两种算法都使用随机采样,通常比相应的较旧的确定性算法更快,这些算法可以通过以下命令访问:

>>> k, idx, proj = sli.interp_decomp(A, eps, rand=False)

以及:

>>> idx, proj = sli.interp_decomp(A, k, rand=False)

分别为。

从矩阵操作

现在考虑一个矩阵,该矩阵是根据它在向量上的作用给出的,它是一个 scipy.sparse.linalg.LinearOperator

要将ID计算为固定精度,请键入以下内容:

>>> k, idx, proj = sli.interp_decomp(L, eps)

要计算固定等级的ID,请使用:

>>> idx, proj = sli.interp_decomp(L, k)

这些算法是随机的。

重建ID

上面的ID例程不显式输出骨架和插值矩阵,而是以更紧凑(有时更有用)的形式返回相关信息。要构建这些矩阵,请编写:

>>> B = sli.reconstruct_skel_matrix(A, k, idx)

对于骨架矩阵和:

>>> P = sli.reconstruct_interp_matrix(idx, proj)

用于插值矩阵。然后,ID近似值可以计算为:

>>> C = np.dot(B, P)

这也可以使用以下命令直接构建:

>>> C = sli.reconstruct_matrix_from_id(B, idx, proj)

而不必先计算 P

或者,也可以使用以下命令显式执行此操作:

>>> B = A[:,idx[:k]]
>>> P = np.hstack([np.eye(k), proj])[:,np.argsort(idx)]
>>> C = np.dot(B, P)

计算奇异值分解

ID可以通过以下命令转换为SVD:

>>> U, S, V = sli.id_to_svd(B, idx, proj)

因此,SVD近似值为:

>>> C = np.dot(U, np.dot(np.diag(S), np.dot(V.conj().T)))

还可以通过将ID和转换步骤组合到一个命令中来计算SVD。在上述各种ID算法之后,可以使用相应的各种SVD算法。

从矩阵条目

我们首先考虑根据矩阵的项给出的矩阵的奇异值分解(SVD)算法。

要将SVD计算为固定精度,请键入以下内容:

>>> U, S, V = sli.svd(A, eps)

要将SVD计算到固定秩,请使用:

>>> U, S, V = sli.svd(A, k)

这两种算法都使用随机抽样;对于确定性版本,发出关键字 rand=False 如上段所述。

从矩阵操作

现在考虑一个矩阵,该矩阵是根据它对向量的作用而给出的。

要将SVD计算为固定精度,请键入以下内容:

>>> U, S, V = sli.svd(L, eps)

要将SVD计算到固定秩,请使用:

>>> U, S, V = sli.svd(L, k)

实用程序例程

还提供了几个实用程序例程。

要估计矩阵的谱范数,请使用:

>>> snorm = sli.estimate_spectral_norm(A)

该算法基于随机幂方法,因此只需要矩阵向量乘积。可以使用关键字设置要进行的迭代次数 its (默认值: its=20 )。该矩阵被解释为 scipy.sparse.linalg.LinearOperator ,但也可以将其作为 numpy.ndarray ,在这种情况下,可以使用 scipy.sparse.linalg.aslinearoperator

同样的算法也可以估计两个矩阵之差的谱范数 A1A2 具体如下:

>>> diff = sli.estimate_spectral_norm_diff(A1, A2)

这对于检查矩阵近似的准确性通常很有用。

中的一些例程 scipy.linalg.interpolative 也需要估计矩阵的秩。这可以通过以下任一方式完成:

>>> k = sli.estimate_rank(A, eps)

或者:

>>> k = sli.estimate_rank(L, eps)

这取决于表现形式。该参数 eps 控制数字等级的定义。

最后,可以通过以下方式控制所有随机化例程所需的随机数生成 scipy.linalg.interpolative.seed 。要将种子值重置为其原始值,请使用:

>>> sli.seed('default')

要指定种子值,请使用:

>>> sli.seed(s)

哪里 s 必须是整数或55个浮点数的数组。如果是整数,则通过使用 numpy.random.rand 使用给定的整数种子。

要简单地生成一些随机数,请键入以下内容:

>>> sli.rand(n)

哪里 n 要生成的随机数的数量。

备注

上述函数都会自动检测适当的接口,并处理实数和复数数据类型,将输入参数传递给适当的后端例程。