本文简要介绍 python 语言中 scipy.linalg.clarkson_woodruff_transform
的用法。
用法:
scipy.linalg.clarkson_woodruff_transform(input_matrix, sketch_size, seed=None)#
将Clarkson-Woodruff 变换/草图应用于输入矩阵。
给定一个大小为
(n, d)
的 input_matrixA
,计算一个大小为 (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
相关用法
- Python SciPy linalg.cdf2rdf用法及代码示例
- Python SciPy linalg.cho_factor用法及代码示例
- Python SciPy linalg.cholesky用法及代码示例
- Python SciPy linalg.cho_solve_banded用法及代码示例
- Python SciPy linalg.cosm用法及代码示例
- Python SciPy linalg.cho_solve用法及代码示例
- Python SciPy linalg.convolution_matrix用法及代码示例
- Python SciPy linalg.circulant用法及代码示例
- Python scipy.linalg.cossin用法及代码示例
- Python SciPy linalg.companion用法及代码示例
- Python SciPy linalg.cholesky_banded用法及代码示例
- Python SciPy linalg.cg用法及代码示例
- Python SciPy linalg.coshm用法及代码示例
- Python SciPy linalg.cgs用法及代码示例
- Python SciPy linalg.eigvalsh_tridiagonal用法及代码示例
- Python SciPy linalg.LaplacianNd用法及代码示例
- Python SciPy linalg.solve_circulant用法及代码示例
- Python SciPy linalg.polar用法及代码示例
- Python SciPy linalg.rsf2csf用法及代码示例
- Python SciPy linalg.hessenberg用法及代码示例
- Python SciPy linalg.tril用法及代码示例
- Python SciPy linalg.triu用法及代码示例
- Python SciPy linalg.svd用法及代码示例
- Python SciPy linalg.ishermitian用法及代码示例
- Python SciPy linalg.invhilbert用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.clarkson_woodruff_transform。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。