non_negative_factorization#

sklearn.decomposition.non_negative_factorization(X, W=None, H=None, n_components='warn', *, 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_featuresW 进行缩放,并通过 n_samplesH 进行缩放,以保持它们相对于彼此和数据拟合项的影响平衡,尽可能独立于训练集的大小 n_samples

目标函数通过交替最小化W和H来最小化。如果给定H且update_H=False,则仅求解W。

注意,变换后的数据命名为W,组件矩阵命名为H。在NMF文献中,命名惯例通常是相反的,因为数据矩阵X被转置。

Parameters:
X{array-like, sparse matrix} of shape (n_samples, n_features)

常数矩阵。

Warray-like of shape (n_samples, n_components), default=None

如果 init='custom' ,它被用作解决方案的初始猜测。 如果 update_H=False ,它被初始化为零数组,除非 solver='mu' ,然后它被填充为通过 np.sqrt(X.mean() / self._n_components) 计算的值。 如果 None ,使用 init 中指定的初始化方法。

Harray-like of shape (n_components, n_features), default=None

如果 init='custom' ,它被用作解决方案的初始猜测。 如果 update_H=False ,它被用作常数,仅求解W。 如果 None ,使用 init 中指定的初始化方法。

n_componentsint or {‘auto’} or None, default=None

组件数量,如果未设置n_components,则保留所有特征。 如果 n_components='auto' ,组件数量会自动从 WH 的形状推断。

Changed in version 1.4: 添加了 'auto' 值。

init{‘random’, ‘nndsvd’, ‘nndsvda’, ‘nndsvdar’, ‘custom’}, default=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。

Changed in version 0.23: init 的默认值从’random’改为None。

Changed in version 1.1: init=None 且n_components小于n_samples和n_features时,默认值改为 nndsvda 而不是 nndsvd

update_Hbool, default=True

设置为True,W和H都将从初始猜测中估计。 设置为False,仅估计W。

solver{‘cd’, ‘mu’}, default=’cd’

使用的数值求解器:

  • ‘cd’ 是使用快速分层交替最小二乘(Fast HALS)的坐标下降求解器。

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

Added in version 0.17: 坐标下降求解器。

Added in version 0.19: 乘法更新求解器。

beta_lossfloat or {‘frobenius’, ‘kullback-leibler’, ‘itakura-saito’}, default=’frobenius’

要最小化的beta散度,测量X和点积WH之间的距离。注意,不同于’frobenius’ (或2)和’kullback-leibler’(或1)的值会导致显著较慢的拟合。注意,对于beta_loss <= 0(或’itakura-saito’),输入矩阵X不能包含零。仅在’mu’求解器中使用。

Added in version 0.19.

tolfloat, default=1e-4

停止条件的容差。

max_iterint, default=200

超时前的最大迭代次数。

alpha_Wfloat, default=0.0

乘以 W 正则化项的常数。将其设置为零(默认)对 W 没有正则化。

Added in version 1.0.

alpha_Hfloat or “same”, default=”same”

乘以 H 正则化项的常数。将其设置为零对 H 没有正则化。如果为”same”(默认),则取与 alpha_W 相同的值。

Added in version 1.0.

l1_ratiofloat, default=0.0

正则化混合参数,0 <= l1_ratio <= 1。 对于l1_ratio = 0,惩罚是元素级的L2惩罚 (即Frobenius范数)。 对于l1_ratio = 1,惩罚是元素级的L1惩罚。 对于0 < l1_ratio < 1,惩罚是L1和L2的组合。

random_stateint, RandomState instance or None, default=None

用于NMF初始化(当 init == ‘nndsvdar’或 ‘random’),以及坐标下降。传递一个int以在多次函数调用中获得可重复的结果。 见 Glossary

verboseint, default=0

详细级别。

shufflebool, default=False

如果为真,在CD求解器中随机化坐标顺序。

Returns:
Wndarray of shape (n_samples, n_components)

非负最小二乘问题的解。

Hndarray of shape (n_components, n_features)

非负最小二乘问题的解。

n_iterint

实际迭代次数。

References

[1]

“Fast local algorithms for large scale nonnegative matrix and tensor factorizations” Cichocki, Andrzej, and P. H. A. N. Anh-Huy. IEICE transactions on fundamentals of electronics, communications and computer sciences 92.3: 708-721, 2009.

[2]

“Algorithms for nonnegative matrix factorization with the beta-divergence” Fevotte, C., & Idier, J. (2011). Neural Computation, 23(9).

Examples

>>> 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)