NMF#

class sklearn.decomposition.NMF(n_components='auto', *, init=None, solver='cd', beta_loss='frobenius', tol=0.0001, max_iter=200, random_state=None, alpha_W=0.0, alpha_H='same', l1_ratio=0.0, 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}\) 可能代表 Frobenius 範數或其他支援的 beta 散度損失。選項之間的選擇由 beta_loss 參數控制。

正規化項會按 Wn_features 以及 Hn_samples 來縮放,以使其影響相對於彼此以及資料擬合項,盡可能獨立於訓練集的 n_samples 大小。

目標函數通過 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

用於初始化程序的Method。有效選項為

  • None:如果 n_components <= min(n_samples, n_features),則為 'nndsvda',否則為 random。

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

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

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

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

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

版本變更於 1.1: init=None 且 n_components 小於 n_samples 和 n_features 時,預設值為 nndsvda 而不是 nndsvd

solver{‘cd’, ‘mu’}, 預設值為 ‘cd’

要使用的數值求解器

  • ‘cd’ 是座標下降求解器。

  • ‘mu’ 是乘法更新求解器。

新增於 0.17 版: 座標下降求解器。

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

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

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

新增於 0.19 版。

tolfloat, 預設值為 1e-4

停止條件的容差。

max_iterint, 預設值為 200

逾時前的最大迭代次數。

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

用於初始化(當 init == ‘nndsvdar’ 或 ‘random’ 時),以及座標下降。傳遞 int 以在多個函數呼叫中獲得可重現的結果。請參閱詞彙表

alpha_Wfloat, 預設值為 0.0

乘以 W 的正規化項的常數。將其設定為零(預設值)則 W 上沒有正規化。

新增於 1.0 版。

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

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

新增於 1.0 版。

l1_ratiofloat, 預設值為 0.0

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

新增於 0.17 版: 座標下降求解器中使用的正規化參數 l1_ratio

verboseint, 預設值為 0

是否顯示詳細資訊。

shufflebool, 預設值為 False

如果為真,則在 CD 解算器中隨機化座標的順序。

在 0.17 版本中新增:shuffle 參數用於座標下降解算器。

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

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

n_components_整數

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

reconstruction_err_浮點數

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

n_iter_整數

實際迭代次數。

n_features_in_整數

fit 期間看到的特徵數量。

在 0.24 版本中新增。

feature_names_in_形狀為 (n_features_in_,) 的 ndarray

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

新增於 1.0 版。

另請參閱

DictionaryLearning

尋找稀疏編碼資料的字典。

MiniBatchSparsePCA

小批量稀疏主成分分析。

PCA

主成分分析。

SparseCoder

從固定的預先計算的字典中尋找資料的稀疏表示法。

SparsePCA

稀疏主成分分析。

TruncatedSVD

使用截斷的 SVD 進行降維。

參考文獻

[1]

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

[2]

「使用 beta 散度的非負矩陣因式分解演算法」 Fevotte, C., & Idier, J. (2011). Neural Computation, 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 NMF
>>> model = NMF(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) 的類陣列、稀疏矩陣

訓練向量,其中 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_featuresstr 或 None 的類陣列,預設值為 None

僅用於使用在 fit 中看到的名稱來驗證特徵名稱。

傳回
feature_names_outstr 物件的 ndarray

轉換的特徵名稱。

get_metadata_routing()[原始碼]#

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

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

傳回
routingMetadataRequest

封裝路由資訊的 MetadataRequest

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

取得此估算器的參數。

參數:
deepbool,預設值為 True

如果為 True,則會傳回此估算器的參數以及包含的子物件(這些子物件也是估算器)。

傳回
params字典

對應到其值的參數名稱。

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

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

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

設定輸出容器。

如需如何使用 API 的範例,請參閱 引入 set_output 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字典

估算器參數。

傳回
self估算器實例

估算器實例。

transform(X)[原始碼]#

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

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

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

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

轉換的資料。