小批量非負矩陣分解 # (MiniBatchNMF)

class sklearn.decomposition.MiniBatchNMF(n_components='auto', *, init=None, batch_size=1024, beta_loss='frobenius', tol=0.0001, max_no_improvement=10, max_iter=200, alpha_W=0.0, alpha_H='same', l1_ratio=0.0, forget_factor=0.7, fresh_restarts=False, fresh_restarts_max_iter=30, transform_max_iter=None, random_state=None, verbose=0)[原始碼]#

Mini-Batch 非負矩陣分解 (NMF)。

於版本 1.1 加入。

尋找兩個非負矩陣,即所有元素皆為非負的矩陣,(W, H),其乘積近似於非負矩陣 X。此分解可用於例如降維、源分離或主題提取。

目標函數為

\[ \begin{align}\begin{aligned}L(W, H) &= 0.5 * ||X - WH||_{loss}^2\\ &+ alpha\_W * l1\_ratio * n\_features * ||vec(W)||_1\\ &+ alpha\_H * l1\_ratio * n\_samples * ||vec(H)||_1\\ &+ 0.5 * alpha\_W * (1 - l1\_ratio) * n\_features * ||W||_{Fro}^2\\ &+ 0.5 * alpha\_H * (1 - l1\_ratio) * n\_samples * ||H||_{Fro}^2,\end{aligned}\end{align} \]

其中 \(||A||_{Fro}^2 = \sum_{i,j} A_{ij}^2\) (Frobenius 範數) 且 \(||vec(A)||_1 = \sum_{i,j} abs(A_{ij})\) (逐元素 L1 範數)。

通用範數 \(||X - WH||_{loss}^2\) 可能表示 Frobenius 範數或其他支援的 beta 散度損失。選項之間的選擇由 beta_loss 參數控制。

目標函數通過交替最小化 WH 來最小化。

請注意,轉換後的數據命名為 W,而成分矩陣則命名為 H。在 NMF 文獻中,命名慣例通常相反,因為數據矩陣 X 是轉置的。

請參閱 使用者指南 以了解更多資訊。

參數:
n_componentsint 或 {‘auto’} 或 None,預設值 = ‘auto’

成分的數量。如果為 None,則保留所有特徵。如果為 n_components='auto',則成分的數量會從 W 或 H 的形狀自動推斷。

在 1.4 版本中變更:新增 'auto' 值。

在 1.6 版本中變更:預設值從 None 變更為 'auto'

init{‘random’, ‘nndsvd’, ‘nndsvda’, ‘nndsvdar’, ‘custom’},預設值 = None

用於初始化程序的初始化方法。有效的選項

  • None:如果 n_components <= min(n_samples, n_features),則為 ‘nndsvda’,否則為隨機。

  • 'random':非負隨機矩陣,以以下方式縮放:sqrt(X.mean() / n_components)

  • 'nndsvd':非負雙奇異值分解 (NNDSVD) 初始化 (更適合稀疏性)。

  • 'nndsvda':NNDSVD,零值以 X 的平均值填充(在不需要稀疏性時更佳)。

  • 'nndsvdar':NNDSVD,零值以小的隨機值填充(當不需要稀疏性時,通常比 NNDSVDa 更快、準確性較低的替代方案)。

  • 'custom':使用必須同時提供的自訂矩陣 WH

batch_sizeint,預設值 = 1024

每個小批次的樣本數。大的批次大小可以帶來更好的長期收斂,但代價是啟動較慢。

beta_lossfloat 或 {‘frobenius’, ‘kullback-leibler’, ‘itakura-saito’},預設值 = ‘frobenius’

要最小化的 beta 散度,用於衡量 X 與點積 WH 之間的距離。請注意,與 ‘frobenius’ (或 2) 和 ‘kullback-leibler’ (或 1) 不同的值會導致擬合速度明顯變慢。請注意,對於 beta_loss <= 0(或 ‘itakura-saito’),輸入矩陣 X 不能包含零。

tolfloat,預設值 = 1e-4

根據 H 在 2 個步驟之間差異的範數來控制提前停止。若要停用根據 H 中的變更進行的提前停止,請將 tol 設定為 0.0。

max_no_improvementint,預設值 = 10

根據連續數個無法在平滑成本函數上產生改善的小批次來控制提前停止。若要停用根據成本函數的收斂偵測,請將 max_no_improvement 設定為 None。

max_iterint,預設值 = 200

在逾時之前,針對完整資料集的最大迭代次數。

alpha_Wfloat,預設值 = 0.0

此常數會乘上 W 的正規化項。設定為零(預設值)表示不對 W 進行正規化。

alpha_Hfloat 或 “same”,預設值=”same”

此常數會乘上 H 的正規化項。設定為零表示不對 H 進行正規化。如果設為 “same”(預設值),則會採用與 alpha_W 相同的值。

l1_ratiofloat,預設值=0.0

正規化混合參數,數值範圍為 0 <= l1_ratio <= 1。當 l1_ratio = 0 時,懲罰為逐元素的 L2 懲罰(亦稱為 Frobenius 範數)。當 l1_ratio = 1 時,懲罰為逐元素的 L1 懲罰。當 0 < l1_ratio < 1 時,懲罰為 L1 和 L2 的組合。

forget_factorfloat,預設值=0.7

過去資訊的重新縮放量。在有限數據集中,其值可能為 1。建議在線上學習中使用小於 1 的值,因為較新的批次權重會大於過去的批次。

fresh_restartsbool,預設值=False

是否在每個步驟完全解出 W。執行全新的重新啟動可能會在相同的迭代次數下獲得更好的解,但速度會慢得多。

fresh_restarts_max_iterint,預設值=30

在每個步驟求解 W 時的最大迭代次數。僅在執行全新的重新啟動時使用。這些迭代可能會基於由 tol 控制的 W 的微小變化而提早停止。

transform_max_iterint,預設值=None

在轉換時求解 W 的最大迭代次數。如果為 None,則預設為 max_iter

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

用於初始化(當 init == 'nndsvdar' 或 'random' 時),以及在座標下降法中使用。傳遞一個整數以便在多個函式呼叫中獲得可重複的結果。請參閱術語表

verbosebool,預設值=False

是否輸出詳細資訊。

屬性:
components_形狀為 (n_components, n_features) 的 ndarray

因式分解矩陣,有時稱為「字典」。

n_components_int

組件的數量。如果給定 n_components 參數,則與該參數相同。否則,它將與特徵的數量相同。

reconstruction_err_float

訓練資料 X 與由擬合模型重建的資料 WH 之間的矩陣差的 Frobenius 範數或 beta 散度。

n_iter_int

在整個資料集上實際開始的迭代次數。

n_steps_int

已處理的小批次數量。

n_features_in_int

fit 期間看到的特徵數量。

feature_names_in_形狀為 (n_features_in_,) 的 ndarray

fit 期間看到的特徵名稱。僅在 X 具有全為字串的特徵名稱時定義。

另請參閱

NMF

非負矩陣分解。

MiniBatchDictionaryLearning

尋找最適合用來使用稀疏碼表示資料的字典。

參考文獻

[1]

“用於大規模非負矩陣和張量分解的快速局部演算法” Cichocki, Andrzej 和 P. H. A. N. Anh-Huy。IEICE 電子、通信和計算機科學基礎學報 92.3: 708-721, 2009。

[2]

“具有 beta 散度的非負矩陣分解演算法” Fevotte, C., & Idier, J. (2011)。神經計算, 23(9)。

[3]

“具有 Itakura-Saito 散度的非負矩陣分解的線上演算法” Lefevre, A., Bach, F., Fevotte, C. (2011)。WASPA。

範例

>>> import numpy as np
>>> X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
>>> from sklearn.decomposition import MiniBatchNMF
>>> model = MiniBatchNMF(n_components=2, init='random', random_state=0)
>>> W = model.fit_transform(X)
>>> H = model.components_
fit(X, y=None, **params)[原始碼]#

為資料 X 學習 NMF 模型。

參數:
X形狀為 (n_samples, n_features) 的 {類陣列, 稀疏矩陣}

訓練向量,其中 n_samples 是樣本數量,n_features 是特徵數量。

y已忽略

未使用,為了 API 的一致性而依慣例存在。

**paramskwargs

傳遞給 fit_transform 實例的參數(關鍵字引數)和值。

傳回值:
self物件

傳回實例本身。

fit_transform(X, y=None, W=None, H=None)[原始碼]#

為資料 X 學習 NMF 模型並傳回轉換後的資料。

這比先呼叫 fit 再呼叫 transform 更有效率。

參數:
X形狀為 (n_samples, n_features) 的 {類陣列, 稀疏矩陣}

要分解的資料矩陣。

y已忽略

未使用,為了 API 的一致性而依慣例存在。

W形狀為 (n_samples, n_components) 的類陣列,預設值=None

如果 init='custom',則將其用作解的初始猜測。如果為 None,則使用 init 中指定的初始化方法。

H形狀為 (n_components, n_features) 的類陣列,預設值=None

如果 init='custom',則將其用作解的初始猜測。如果為 None,則使用 init 中指定的初始化方法。

傳回值:
W形狀為 (n_samples, n_components) 的 ndarray

轉換後的資料。

get_feature_names_out(input_features=None)[原始碼]#

取得轉換後的輸出特徵名稱。

輸出特徵名稱將會以小寫的類別名稱作為前綴。例如,如果轉換器輸出 3 個特徵,則輸出特徵名稱為:["class_name0", "class_name1", "class_name2"]

參數:
input_features類陣列 (array-like) 的字串或 None,預設值為 None

僅用於驗證特徵名稱是否與 fit 中看到的名稱一致。

傳回值:
feature_names_out字串物件的 ndarray

轉換後的特徵名稱。

get_metadata_routing()[原始碼]#

取得此物件的中繼資料路由。

請查閱 使用者指南,了解路由機制如何運作。

傳回值:
routingMetadataRequest

一個 MetadataRequest,封裝了路由資訊。

get_params(deep=True)[原始碼]#

取得此估算器的參數。

參數:
deep布林值 (bool),預設值為 True

如果為 True,將返回此估算器和包含的子物件 (也是估算器) 的參數。

傳回值:
params字典 (dict)

參數名稱對應到它們的值。

inverse_transform(X=None, *, Xt=None)[原始碼]#

將資料轉換回其原始空間。

於 0.18 版本新增。

參數:
X形狀為 (n_samples, n_components) 的 {ndarray, 稀疏矩陣}

轉換後的資料矩陣。

Xt形狀為 (n_samples, n_components) 的 {ndarray, 稀疏矩陣}

轉換後的資料矩陣。

自 1.5 版本起已棄用:Xt 已在 1.5 版本中棄用,並將在 1.7 版本中移除。請改用 X

傳回值:
X形狀為 (n_samples, n_features) 的 ndarray

返回原始形狀的資料矩陣。

partial_fit(X, y=None, W=None, H=None)[原始碼]#

使用 X 中的資料作為迷你批次來更新模型。

此方法預期會對資料集的不同區塊連續呼叫多次,以實作核心外 (out-of-core) 或線上學習。

當整個資料集太大而無法一次放入記憶體時,這特別有用 (請參閱 計算擴展策略:更大的資料)。

參數:
X形狀為 (n_samples, n_features) 的 {類陣列, 稀疏矩陣}

要分解的資料矩陣。

y已忽略

未使用,為了 API 的一致性而依慣例存在。

W形狀為 (n_samples, n_components) 的類陣列,預設值=None

如果 init='custom',則會將其用作解的初始猜測。僅在第一次呼叫 partial_fit 時使用。

H形狀為 (n_components, n_features) 的類陣列,預設值=None

如果 init='custom',則會將其用作解的初始猜測。僅在第一次呼叫 partial_fit 時使用。

傳回值:
self

傳回實例本身。

set_output(*, transform=None)[原始碼]#

設定輸出容器。

請參閱 介紹 set_output API,以了解如何使用 API 的範例。

參數:
transform{"default", "pandas", "polars"},預設值為 None

設定 transformfit_transform 的輸出。

  • "default":轉換器的預設輸出格式

  • "pandas":DataFrame 輸出

  • "polars":Polars 輸出

  • None:轉換組態不變

於 1.4 版本新增:已新增 "polars" 選項。

傳回值:
self估算器實例

估算器實例。

set_params(**params)[原始碼]#

設定此估算器的參數。

此方法適用於簡單的估算器以及巢狀物件 (例如 Pipeline)。後者的參數形式為 <component>__<parameter>,因此可以更新巢狀物件的每個元件。

參數:
**params字典 (dict)

估算器參數。

傳回值:
self估算器實例

估算器實例。

transform(X)[原始碼]#

根據擬合的 MiniBatchNMF 模型轉換資料 X。

參數:
X形狀為 (n_samples, n_features) 的 {類陣列, 稀疏矩陣}

要由模型轉換的資料矩陣。

傳回值:
W形狀為 (n_samples, n_components) 的 ndarray

轉換後的資料。