小批量非負矩陣分解 # (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
參數控制。目標函數通過交替最小化
W
和H
來最小化。請注意,轉換後的數據命名為
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'
:使用必須同時提供的自訂矩陣W
和H
。
- 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
設定
transform
和fit_transform
的輸出。"default"
:轉換器的預設輸出格式"pandas"
:DataFrame 輸出"polars"
:Polars 輸出None
:轉換組態不變
於 1.4 版本新增:已新增
"polars"
選項。
- 傳回值:
- self估算器實例
估算器實例。