當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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