隨機化 SVD#

sklearn.utils.extmath.randomized_svd(M, n_components, *, n_oversamples=10, n_iter='auto', power_iteration_normalizer='auto', transpose='auto', flip_sign=True, random_state=None, svd_lapack_driver='gesdd')[原始碼]#

計算截斷隨機化 SVD。

此方法解決了 [1] (第 5 頁,問題 (1.5)) 中描述的固定秩近似問題。

請參閱維基百科主特徵向量,其中提供了一個使用冪迭代演算法進行網頁排名的典型範例。此演算法也廣為人知是 Google PageRank 演算法的基礎模組。

參數:
M{ndarray, 稀疏矩陣}

要分解的矩陣。

n_componentsint

要提取的奇異值和向量的數量。

n_oversamplesint, 預設值=10

為了確保適當的條件,額外取樣的隨機向量數量,以取樣 M 的範圍。用來尋找 M 範圍的隨機向量總數為 n_components + n_oversamples。較小的數字可以提高速度,但可能會對奇異向量和奇異值的近似品質產生負面影響。使用者可能會希望將此參數增加到 2*k - n_components,其中 k 是有效秩。這適用於大型矩陣、雜訊問題、具有緩慢衰減譜的矩陣,或為了提高精確度。請參閱[1] (第 5、23 和 26 頁)。

n_iterint 或 'auto', 預設值='auto'

冪迭代的次數。它可以用於處理雜訊非常多的問題。當設定為 'auto' 時,除非 n_components 很小 ( < .1 * min(X.shape) ),否則會設定為 4;在這種情況下,n_iter 會設定為 7。這有助於提高少量組件的精度。請注意,一般來說,使用者應優先增加 n_oversamples,而不是增加 n_iter,因為隨機方法的原則是避免使用這些成本較高的冪迭代步驟。當 n_components 等於或大於有效矩陣秩,且頻譜沒有呈現緩慢衰減時,理論上 n_iter=01 甚至應該可以正常運作 (請參閱[1] 第 9 頁)。

版本 0.18 中變更。

power_iteration_normalizer{‘auto’, ‘QR’, ‘LU’, ‘none’}, 預設值='auto'

冪迭代是否使用逐步 QR 分解(最慢但最準確)、'none'(最快但在 n_iter 很大時數值不穩定,例如通常為 5 或更大)或 LU 分解(數值穩定但準確度略有損失)進行正規化。如果 n_iter <= 2,'auto' 模式不應用任何正規化,否則會切換為 LU。

版本 0.18 中新增。

transposebool 或 ‘auto’, 預設值='auto'

是否應將演算法應用於 M.T 而非 M。結果應該大致相同。如果 M.shape[1] > M.shape[0],則 'auto' 模式會觸發轉置,因為此隨機 SVD 實作在這種情況下往往會稍微快一些。

版本 0.18 中變更。

flip_signbool, 預設值=True

奇異值分解的輸出僅在奇異向量的符號排列上是唯一的。如果將 flip_sign 設定為 True,則會透過使左奇異向量中每個組件的最大負載為正數來解決符號歧義。

random_stateint、RandomState 實例或 None, 預設值='warn'

當打亂資料時(即取得隨機向量來初始化演算法)要使用的偽隨機數產生器的種子。傳遞一個 int 以便在多次函數呼叫中獲得可重現的結果。請參閱詞彙表

版本 1.2 中變更:預設值從 0 變更為 None。

svd_lapack_driver{“gesdd”, “gesvd”}, 預設值=”gesdd”

是否要使用更有效率的分而治之方法 ("gesdd") 或更通用的矩形方法 ("gesvd") 來計算矩陣 B 的 SVD,矩陣 B 是 M 投影到低維子空間,如 [1] 中所述。

版本 1.2 中新增。

返回:
u形狀為 (n_samples, n_components) 的 ndarray

具有符號翻轉的左奇異向量作為列的么正矩陣。

s形狀為 (n_components,) 的 ndarray

奇異值,以非遞增順序排序。

vh形狀為 (n_components, n_features) 的 ndarray

具有符號翻轉的右奇異向量作為列的么正矩陣。

注意事項

此演算法使用隨機化來加速計算,找到一個(通常非常好的)近似截斷奇異值分解。對於您只想提取少量組件的大型矩陣,它特別快。為了進一步加速,可以將 n_iter 設定為 <=2 (以犧牲精確度為代價)。為了提高精確度,建議將 n_oversamples 增加到 2*k-n_components,其中 k 是有效秩。通常,選擇 n_components 大於 k,因此將 n_oversamples 增加到 n_components 應該就足夠了。

參考資料

[2]

用於矩陣分解的隨機演算法 Per-Gunnar Martinsson、Vladimir Rokhlin 和 Mark Tygert

[3]

主成分分析隨機演算法的實作 A. Szlam 等人 2014

範例

>>> import numpy as np
>>> from sklearn.utils.extmath import randomized_svd
>>> a = np.array([[1, 2, 3, 5],
...               [3, 4, 5, 6],
...               [7, 8, 9, 10]])
>>> U, s, Vh = randomized_svd(a, n_components=2, random_state=0)
>>> U.shape, s.shape, Vh.shape
((3, 2), (2,), (2, 4))