小批量非负矩阵分解#

class sklearn.decomposition.MiniBatchNMF(n_components='auto', *, init=None, batch_size=1024, beta_loss='frobenius', tol=0.0001, max_no_improvement=10, max_iter=200, alpha_W=0.0, alpha_H='same', l1_ratio=0.0, forget_factor=0.7, fresh_restarts=False, fresh_restarts_max_iter=30, transform_max_iter=None, random_state=None, verbose=0)[source]#

小批量非负矩阵分解 (NMF)。

版本 1.1 中新增。

寻找两个非负矩阵,即所有元素都非负的矩阵,(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 参数控制。

目标函数通过交替最小化 WH 来最小化。

请注意,转换后的数据命名为 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':使用自定义矩阵 WH,两者都必须提供。

batch_sizeint,默认为 1024

每个小批量中的样本数。较大的批量大小以较慢的启动为代价,可以获得更好的长期收敛。

beta_lossfloat 或 {‘frobenius’, ‘kullback-leibler’, ‘itakura-saito’},默认为’frobenius’

要最小化的 Beta 散度,测量 X 和点积 WH 之间的距离。请注意,与 “frobenius”(或 2)和 “kullback-leibler”(或 1)不同的值会导致拟合速度明显变慢。请注意,对于 beta_loss <= 0(或 ‘itakura-saito’),输入矩阵 X 不能包含零。

tol浮点数,默认值=1e-4

基于两次迭代中H差异的范数来控制提前停止。若要禁用基于H变化的提前停止,请将tol设置为0.0。

max_no_improvement整数,默认值=10

基于连续多少个小批量没有改进平滑代价函数来控制提前停止。若要禁用基于代价函数的收敛检测,请将max_no_improvement设置为None。

max_iter整数,默认值=200

在超时前遍历完整数据集的最大迭代次数。

alpha_W浮点数,默认值=0.0

乘以W正则化项的常数。将其设置为零(默认值)表示对W不进行正则化。

alpha_H浮点数或“same”,默认值=“same”

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

l1_ratio浮点数,默认值=0.0

正则化混合参数,其中0 <= l1_ratio <= 1。对于l1_ratio = 0,惩罚项是逐元素的L2惩罚(又名Frobenius范数)。对于l1_ratio = 1,它是逐元素的L1惩罚。对于0 < l1_ratio < 1,惩罚项是L1和L2的组合。

forget_factor浮点数,默认值=0.7

过去信息的重新缩放量。对于有限数据集,其值可以为1。对于在线学习,建议选择< 1的值,因为最近的批次比过去的批次权重更大。

fresh_restarts布尔值,默认值=False

是否在每一步都完全求解W。进行fresh restarts可能会导致相同迭代次数下得到更好的解,但速度慢得多。

fresh_restarts_max_iter整数,默认值=30

每步求解W时的最大迭代次数。仅在进行fresh restarts时使用。这些迭代可能会根据tol控制的W的小变化而提前停止。

transform_max_iter整数,默认值=None

变换时求解W的最大迭代次数。如果为None,则默认为max_iter

random_state整数、RandomState实例或None,默认值=None

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

verbose布尔值,默认值=False

是否详细输出。

属性:
components_形状为(n_components, n_features)的ndarray

分解矩阵,有时称为“字典”。

n_components_整数

组件数量。如果给出n_components参数,则与其相同。否则,它将与特征数量相同。

reconstruction_err_浮点数

训练数据X与拟合模型重建数据WH之间的矩阵差异(或β散度)的Frobenius范数。

n_iter_整数

实际在整个数据集上启动的迭代次数。

n_steps_整数

处理的小批量数量。

n_features_in_整数

拟合期间看到的特征数量。

feature_names_in_形状为(n_features_in_,)的ndarray

拟合期间看到的特征名称。仅当X具有全是字符串的特征名称时才定义。

另请参见

NMF

非负矩阵分解。

MiniBatchDictionaryLearning

找到一个字典,该字典可以最好地用于使用稀疏代码表示数据。

参考文献

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

[3]

“使用Itakura-Saito散度的非负矩阵分解在线算法” Lefevre, A., Bach, F., Fevotte, C. (2011). WASPA.

示例

>>> 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 MiniBatchNMF
>>> model = MiniBatchNMF(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)的{类数组、稀疏矩阵}

要分解的数据矩阵。

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

返回原始形状的数据矩阵。

partial_fit(X, y=None, W=None, H=None)[source]#

使用 X 中的数据作为小批量来更新模型。

此方法预计将连续多次在数据集的不同块上调用,以便实现核心外或在线学习。

当整个数据集太大而无法一次全部放入内存时,这尤其有用(参见 扩展计算策略:更大的数据)。

参数:
X形状为(n_samples, n_features)的{类数组、稀疏矩阵}

要分解的数据矩阵。

y忽略

未使用,此处出于约定为了API一致性而存在。

W形状为(n_samples, n_components)的类数组,默认值=None

如果 init='custom',则将其用作解的初始猜测。仅在第一次调用 partial_fit 时使用。

H形状为 (n_components, n_features) 的类数组,默认为 None

如果 init='custom',则将其用作解的初始猜测。仅在第一次调用 partial_fit 时使用。

返回值:
self

返回实例本身。

set_output(*, transform=None)[source]#

设置输出容器。

参见 介绍 set_output API,了解如何使用此 API 的示例。

参数:
transform{"default","pandas","polars"},默认为 None

配置 transformfit_transform 的输出。

  • "default":转换器的默认输出格式

  • "pandas":DataFrame 输出

  • "polars":Polars 输出

  • None:转换配置不变

在 1.4 版本中添加: "polars" 选项已添加。

返回值:
self估计器实例

估计器实例。

set_params(**params)[source]#

设置此估计器的参数。

此方法适用于简单估计器以及嵌套对象(例如 Pipeline)。后者具有 <component>__<parameter> 形式的参数,因此可以更新嵌套对象的每个组件。

参数:
**params**字典

估计器参数。

返回值:
self估计器实例

估计器实例。

transform(X)[源代码]#

根据拟合的MiniBatchNMF模型转换数据X。

参数:
X形状为(n_samples, n_features)的{类数组、稀疏矩阵}

要由模型转换的数据矩阵。

返回值:
W形状为 (n_samples, n_components) 的 ndarray

变换后的数据。