本文簡要介紹 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。