非负矩阵分解#
- 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)[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}\)可以表示弗罗贝尼乌斯范数或其他支持的beta散度损失。选项之间的选择由 - beta_loss参数控制。- 正则化项分别按 - n_features(对于- W)和- n_samples(对于- H)进行缩放,以保持它们的影响彼此平衡,并尽可能独立于训练集的大小- 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
- 用于初始化过程的方法。有效选项: - None:如果n_components <= min(n_samples, n_features),则为'nndsvda',否则为随机。
- 'random':非负随机矩阵,按以下比例缩放:- sqrt(X.mean() / n_components)
- 'nndsvd':非负双奇异值分解 (NNDSVD) 初始化(更适合稀疏性)
- 'nndsvda':用X的平均值填充零的NNDSVD(当不需要稀疏性时更好)
- 'nndsvdar':用小随机值填充零的NNDSVD(通常更快,当不需要稀疏性时,NNDSVDa 的不太精确的替代方案)
- 'custom':使用必须同时提供的自定义矩阵- W和- H。
 - 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' 时)以及在坐标下降中。传递一个整数以在多次函数调用中获得可重复的结果。参见词汇表。
- 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_int
- 组件数量。如果给出 - n_components参数,则与其相同。否则,它将与特征数量相同。
- reconstruction_err_float
- 训练数据 - X与拟合模型重建数据- WH之间的矩阵差的弗罗贝尼乌斯范数或beta散度。
- n_iter_int
- 实际迭代次数。 
- n_features_in_int
- 在拟合期间看到的特征数量。 - 0.24版本中新增。 
- feature_names_in_形状为 (n_features_in_,) 的 ndarray
- 在拟合期间看到的特征名称。仅当 - 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]- “基于β散度的非负矩阵分解算法” 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 NMF >>> model = NMF(n_components=2, init='random', random_state=0) >>> W = model.fit_transform(X) >>> H = model.components_ - fit(X, y=None, **params)[source]#
- 学习数据X的NMF模型。 - 参数:
- X形状为 (n_samples, n_features) 的 {数组、稀疏矩阵}
- 训练向量,其中 - n_samples是样本数,- n_features是特征数。
- y忽略
- 未使用,出于API一致性约定而保留。 
- **params关键字参数
- 传递给fit_transform实例的参数(关键字参数)和值。 
 
- 返回:
- self对象
- 返回实例本身。 
 
 
 - fit_transform(X, y=None, W=None, H=None)[source]#
- 学习数据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)[source]#
- 获取转换后的输出特征名称。 - 输出的特征名称将以小写的类名作为前缀。例如,如果转换器输出3个特征,则输出的特征名称为: - ["class_name0", "class_name1", "class_name2"]。- 参数:
- input_features字符串数组或None,默认为None
- 仅用于使用在 - fit中看到的名称验证特征名称。
 
- 返回:
- feature_names_out字符串对象的ndarray
- 转换后的特征名称。 
 
 
 - get_metadata_routing()[source]#
- 获取此对象的元数据路由。 - 请查看 用户指南,了解路由机制的工作原理。 - 返回:
- routingMetadataRequest
- 一个 - MetadataRequest封装路由信息。
 
 
 - get_params(deep=True)[source]#
- 获取此估计器的参数。 - 参数:
- deep布尔值,默认为True
- 如果为True,将返回此估计器和包含的作为估计器的子对象的参数。 
 
- 返回:
- params字典
- 参数名称与其值的映射。 
 
 
 - inverse_transform(X=None, *, Xt=None)[source]#
- 将数据转换回其原始空间。 - 在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)[source]#
- 设置输出容器。 - 参见 介绍set_output API,了解如何使用API的示例。 - 参数:
- transform{"default", "pandas", "polars"},默认为None
- 配置 - transform和- fit_transform的输出。- "default": 变换器的默认输出格式
- "pandas": DataFrame 输出
- "polars": Polars 输出
- None: 转换配置保持不变
 - 1.4版本新增: - "polars"选项已添加。
 
- 返回:
- self估计器实例
- 估计器实例。 
 
 
 
 
     
 
