非负矩阵分解#
- 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)[source]#
计算非负矩阵分解 (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
参数控制。正则化项按
W
的n_features
和H
的n_samples
进行缩放,以保持它们彼此之间以及与数据拟合项的影响尽可能平衡,并尽可能独立于训练集的大小n_samples
。目标函数通过交替最小化 W 和 H 来最小化。如果给定 H 且 update_H=False,则仅求解 W。
请注意,变换后的数据命名为 W,分量矩阵命名为 H。在 NMF 文献中,命名约定通常相反,因为数据矩阵 X 是转置的。
- 参数:
- X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}
常数矩阵。
- W形状为 (n_samples, n_components) 的 array-like,默认为 None
如果
init='custom'
,则将其用作解的初始猜测。如果update_H=False
,则将其初始化为零数组,除非solver='mu'
,则将其填充为np.sqrt(X.mean() / self._n_components)
计算的值。如果为None
,则使用init
中指定的初始化方法。- H形状为 (n_components, n_features) 的 array-like,默认为 None
如果
init='custom'
,则将其用作解的初始猜测。如果update_H=False
,则将其用作常数,仅求解 W。如果为None
,则使用init
中指定的初始化方法。- 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 < n_features,则为 'nndsvda',否则为 'random'。
‘random’:非负随机矩阵,按以下比例缩放:
sqrt(X.mean() / n_components)
‘nndsvd’:非负双奇异值分解 (NNDSVD) 初始化(更适合稀疏性)
‘nndsvda’:用 X 的平均值填充零的 NNDSVD(当不需要稀疏性时更好)
‘nndsvdar’:用小随机值填充零的 NNDSVD(通常更快,当不需要稀疏性时,它是 NNDSVDa 的不太精确的替代方案)
‘custom’:如果
update_H=True
,则使用必须同时提供的自定义矩阵 W 和 H。如果update_H=False
,则仅使用自定义矩阵 H。
0.23 版更改:
init
的默认值在 0.23 版中从 'random' 更改为 None。1.1版本变更: 当
init=None
且n_components小于n_samples和n_features时,默认使用nndsvda
而不是nndsvd
。- update_H布尔值,默认为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'
要最小化的β散度,用于测量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
如果为真,则在CD求解器中随机化坐标的顺序。
- 返回:
- W形状为(n_samples, n_components)的ndarray
非负最小二乘问题的解。
- H形状为(n_components, n_features)的ndarray
非负最小二乘问题的解。
- n_iter整数
实际迭代次数。
参考文献
[1]“用于大规模非负矩阵和张量分解的快速局部算法” 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]“使用β散度的非负矩阵分解算法” 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 non_negative_factorization >>> W, H, n_iter = non_negative_factorization( ... X, n_components=2, init='random', random_state=0)