当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy linalg.clarkson_woodruff_transform用法及代码示例


本文简要介绍 python 语言中 scipy.linalg.clarkson_woodruff_transform 的用法。

用法:

scipy.linalg.clarkson_woodruff_transform(input_matrix, sketch_size, seed=None)#

将Clarkson-Woodruff 变换/草图应用于输入矩阵。

给定一个大小为 (n, d) 的 input_matrix A ,计算一个大小为 (sketch_size, d) 的矩阵 A' 使得

通过Clarkson-Woodruff 变换的概率很高,也称为CountSketch 矩阵。

参数

input_matrix array_like

输入矩阵,形状为 (n, d)

sketch_size int

草图的行数。

seed {无,int, numpy.random.Generator numpy.random.RandomState },可选

如果种子是无(或np.random), 这numpy.random.RandomState使用单例。如果种子是一个 int,一个新的RandomState使用实例,播种种子.如果种子已经是一个Generator或者RandomState实例然后使用该实例。

返回

A’ array_like

输入矩阵的草图 A ,大小为 (sketch_size, d)

注意

发表声明

准确地说,观察以下结果,该结果改编自 [2] 的定理 14 通过马尔可夫不等式的证明。如果我们有一个草图大小sketch_size=k,它至少是

然后对于任何固定向量 x

概率至少为 1 减 delta。

此实现利用了稀疏性:计算草图所需的时间与 A.nnz 成正比。 scipy.sparse.csc_matrix 格式的数据A 为稀疏输入提供了最快的计算时间。

>>> import numpy as np
>>> from scipy import linalg
>>> from scipy import sparse
>>> rng = np.random.default_rng()
>>> n_rows, n_columns, density, sketch_n_rows = 15000, 100, 0.01, 200
>>> A = sparse.rand(n_rows, n_columns, density=density, format='csc')
>>> B = sparse.rand(n_rows, n_columns, density=density, format='csr')
>>> C = sparse.rand(n_rows, n_columns, density=density, format='coo')
>>> D = rng.standard_normal((n_rows, n_columns))
>>> SA = linalg.clarkson_woodruff_transform(A, sketch_n_rows) # fastest
>>> SB = linalg.clarkson_woodruff_transform(B, sketch_n_rows) # fast
>>> SC = linalg.clarkson_woodruff_transform(C, sketch_n_rows) # slower
>>> SD = linalg.clarkson_woodruff_transform(D, sketch_n_rows) # slowest

也就是说,这种方法在密集输入上确实表现良好,只是在相对规模上较慢。

参考

[1]

肯尼斯 L.克拉克森和大卫 P.伍德拉夫。输入稀疏时间的低秩逼近和回归。在 STOC,2013 年。

[2]

大卫·P·伍德拉夫。素描作为数值线性代数的工具。在理论计算机科学的基础和趋势中,2014 年。

例子

创建一个大密集矩阵A作为示例:

>>> import numpy as np
>>> from scipy import linalg
>>> n_rows, n_columns  = 15000, 100
>>> rng = np.random.default_rng()
>>> A = rng.standard_normal((n_rows, n_columns))

应用变换创建一个包含 200 行的新矩阵:

>>> sketch_n_rows = 200
>>> sketch = linalg.clarkson_woodruff_transform(A, sketch_n_rows, seed=rng)
>>> sketch.shape
(200, 100)

现在,真实范数的绝对值很可能接近草绘范数。

>>> linalg.norm(A)
1224.2812927123198
>>> linalg.norm(sketch)
1226.518328407333

同样,应用我们的草图保留了 的线性回归的解决方案。

>>> b = rng.standard_normal(n_rows)
>>> x = linalg.lstsq(A, b)[0]
>>> Ab = np.hstack((A, b.reshape(-1, 1)))
>>> SAb = linalg.clarkson_woodruff_transform(Ab, sketch_n_rows, seed=rng)
>>> SA, Sb = SAb[:, :-1], SAb[:, -1]
>>> x_sketched = linalg.lstsq(SA, Sb)[0]

与矩阵范数示例一样,linalg.norm(A @ x - b) 以高概率接近 linalg.norm(A @ x_sketched - b)

>>> linalg.norm(A @ x - b)
122.83242365433877
>>> linalg.norm(A @ x_sketched - b)
166.58473879945151

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.clarkson_woodruff_transform。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。