non_negative_factorization# (非負矩陣分解)

sklearn.decomposition.non_negative_factorization(X, W=None, H=None, n_components='auto', *, init=None, update_H=True, solver='cd', beta_loss='frobenius', tol=0.0001, max_iter=200, alpha_W=0.0, alpha_H='same', l1_ratio=0.0, random_state=None, verbose=0, shuffle=False)[原始碼]#

計算非負矩陣分解 (NMF)。

找出兩個非負矩陣 (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 參數控制。

正則化項按 n_features 縮放以用於 W,並按 n_samples 縮放以用於 H,以保持其影響在彼此之間以及與資料擬合項之間的平衡,並且盡可能獨立於訓練集的 n_samples 大小。

目標函數透過 W 和 H 的交替最小化來最小化。如果 H 已給定且 update_H=False,則僅求解 W。

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

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

常數矩陣。

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

如果 init='custom',則將其用作解的初始猜測。如果 update_H=False,則將其初始化為零陣列,除非 solver='mu',然後將其填入由 np.sqrt(X.mean() / self._n_components) 計算的值。如果 None,則使用 init 中指定之初始化方法。

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

如果 init='custom',則將其用作解的初始猜測。如果 update_H=False,則將其用作常數,僅求解 W。如果 None,則使用 init 中指定之初始化方法。

n_componentsint 或 {'auto'} 或 None,預設值='auto'

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

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

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

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

用於初始化程序的 方法。

有效選項

  • None:如果 n_components < n_features,則為 'nndsvda',否則為 'random'。

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

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

  • 'nndsvda':NNDSVD,其中零值以 X 的平均值填入(當不需要稀疏性時更好)

  • 'nndsvdar':NNDSVD,其中零值以小的隨機值填入(當不需要稀疏性時,通常更快、但精確度較低的 NNDSVDa 替代方案)

  • 'custom':如果 update_H=True,則使用自訂矩陣 W 和 H,兩者都必須提供。如果 update_H=False,則僅使用自訂矩陣 H。

在 0.23 版中變更: init 的預設值從 'random' 變更為 0.23 中的 None。

在 1.1 版中變更: init=None 且 n_components 小於 n_samples 和 n_features 時,預設為 nndsvda 而非 nndsvd

update_Hbool,預設值=True

設定為 True,W 和 H 都將從初始猜測中估計。設定為 False,則僅估計 W。

solver{'cd', 'mu'},預設值='cd'

要使用的數值求解器

  • 'cd' 是使用快速階層交替最小平方 (Fast HALS) 的坐標下降求解器。

  • 'mu' 是乘法更新求解器。

在 0.17 版中新增: 坐標下降求解器。

版本 0.19 新增:乘法更新求解器。

beta_loss浮點數或 {‘frobenius’, ‘kullback-leibler’, ‘itakura-saito’}, 預設值 = ‘frobenius’

要最小化的 Beta 散度,用於衡量 X 與 WH 的點積之間的距離。請注意,使用 ‘frobenius’ (或 2) 和 ‘kullback-leibler’ (或 1) 以外的值會導致擬合速度顯著變慢。另請注意,對於 beta_loss <= 0 (或 ‘itakura-saito’),輸入矩陣 X 不能包含零。僅在 ‘mu’ 求解器中使用。

版本 0.19 新增。

tol浮點數, 預設值 = 1e-4

停止條件的容差。

max_iter整數, 預設值 = 200

在超時之前的最大迭代次數。

alpha_W浮點數, 預設值 = 0.0

乘以 W 的正規化項的常數。設定為零(預設值)表示 W 沒有正規化。

版本 1.0 新增。

alpha_H浮點數或 “same”, 預設值 = “same”

乘以 H 的正規化項的常數。設定為零表示 H 沒有正規化。如果為 “same”(預設值),則取與 alpha_W 相同的值。

版本 1.0 新增。

l1_ratio浮點數, 預設值 = 0.0

正規化混合參數,其中 0 <= l1_ratio <= 1。對於 l1_ratio = 0,懲罰是元素級的 L2 懲罰(又稱 Frobenius 範數)。對於 l1_ratio = 1,懲罰是元素級的 L1 懲罰。對於 0 < l1_ratio < 1,懲罰是 L1 和 L2 的組合。

random_state整數, RandomState 實例或 None, 預設值 = None

用於 NMF 初始化(當 init == ‘nndsvdar’ 或 ‘random’ 時),以及在座標下降法中使用。傳遞整數以便在多次函數呼叫中產生可重現的結果。請參閱 詞彙表

verbose整數, 預設值 = 0

詳細程度。

shuffle布林值, 預設值 = False

如果為 True,則在 CD 求解器中隨機化坐標順序。

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

非負最小二乘問題的解。

H形狀為 (n_components, n_features) 的 ndarray

非負最小二乘問題的解。

n_iter整數

實際迭代次數。

參考文獻

[1]

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

[2]

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

範例

>>> 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 non_negative_factorization
>>> W, H, n_iter = non_negative_factorization(
...     X, n_components=2, init='random', random_state=0)