MiniBatchNMF#

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)[源代码]#

Mini-Batch 非负矩阵分解(NMF)。

1.1 版本新增。

寻找两个非负矩阵,即所有元素均为非负的矩阵(WH),其乘积近似于非负矩阵 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。

  • 'random':非负随机矩阵,按 sqrt(X.mean() / n_components) 缩放。

  • 'nndsvd':非负双奇异值分解(NNDSVD)初始化(更适合稀疏性)。

  • 'nndsvda':NNDSVD,其中零用 X 的平均值填充(在不希望稀疏性时更好)。

  • 'nndsvdar':NNDSVD,其中零用小的随机值填充(通常更快,在不希望稀疏性时是 NNDSVDa 的一个不太准确的替代方案)。

  • 'custom':使用自定义矩阵 WH,两者都必须提供。

batch_sizeint,默认值=1024

每个 mini-batch 中的样本数量。较大的 batch size 会带来更好的长期收敛性,但启动速度较慢。

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

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

tolfloat,默认值=1e-4

根据 H 在 2 步之间的差异范数来控制早期停止。要禁用基于 H 变化的早期停止,请将 tol 设置为 0.0。

max_no_improvementint,默认值=10

根据连续未能在平滑成本函数上产生改进的 mini batch 数量来控制早期停止。要禁用基于成本函数的收敛检测,请将 max_no_improvement 设置为 None。

max_iterint,默认值=200

在超时之前对完整数据集进行的最大迭代次数。

alpha_Wfloat,默认值=0.0

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

alpha_Hfloat 或 “same”,默认值=”same”

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

l1_ratiofloat,默认值=0.0

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

forget_factorfloat,默认值=0.7

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

fresh_restartsbool,默认值=False

是否在每一步完全求解 W。进行全新重启可能会在相同迭代次数下获得更好的解,但速度会慢很多。

fresh_restarts_max_iterint,默认值=30

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

transform_max_iterint,默认值=None

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

random_stateint, RandomState 实例或 None,默认值=None

用于初始化(当 init == ‘nndsvdar’ 或 ‘random’)和坐标下降。传入一个整数以在多次函数调用中获得可重现的结果。参见 术语表

verbosebool,默认值=False

是否启用详细输出。

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

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

n_components_int

成分数量。如果给定,则与 n_components 参数相同。否则,将与特征数量相同。

reconstruction_err_float

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

n_iter_int

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

n_steps_int

处理的 mini-batch 数量。

n_features_in_int

拟合 期间观察到的特征数量。

feature_names_in_形状为 (n_features_in_,) 的 ndarray

拟合 期间观察到的特征名称。仅当 X 的所有特征名称均为字符串时定义。

另请参见

NMF

非负矩阵分解。

MiniBatchDictionaryLearning

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

参考文献

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

示例

>>> 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)[源代码]#

为数据 X 学习一个 NMF 模型。

参数:
X形状为 (n_samples, n_features) 的 {array-like, 稀疏矩阵}

训练向量,其中 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) 的 {array-like, 稀疏矩阵}

待分解的数据矩阵。

y忽略

未使用,根据约定为保持 API 一致性而存在。

W形状为 (n_samples, n_components) 的 array-like,默认值=None

如果 init='custom',则用作解的初始猜测。如果为 None,则使用 init 中指定的初始化方法。

H形状为 (n_components, n_features) 的 array-like,默认值=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 的 array-like 或 None,默认值=None

仅用于根据 fit 中看到的名称验证特征名称。

返回:
feature_names_outstr 对象的 ndarray

转换后的特征名称。

get_metadata_routing()[源代码]#

获取此对象的元数据路由。

请查看 用户指南 了解路由机制的工作原理。

返回:
routingMetadataRequest

封装路由信息的 MetadataRequest

get_params(deep=True)[源代码]#

获取此估计器的参数。

参数:
deepbool,默认值=True

如果为 True,将返回此估计器及其包含的作为估计器的子对象的参数。

返回:
paramsdict

参数名称映射到其值。

inverse_transform(X)[源代码]#

将数据转换回其原始空间。

0.18 版本新增。

参数:
X形状为 (n_samples, n_components) 的 {ndarray, 稀疏矩阵}

转换后的数据矩阵。

返回:
X_original形状为 (n_samples, n_features) 的 ndarray

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

partial_fit(X, y=None, W=None, H=None)[源代码]#

使用 X 中的数据作为 mini-batch 更新模型。

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

当整个数据集太大而无法一次性放入内存时,此方法特别有用(参见 计算扩展策略:处理更大的数据)。

参数:
X形状为 (n_samples, n_features) 的 {array-like, 稀疏矩阵}

待分解的数据矩阵。

y忽略

未使用,根据约定为保持 API 一致性而存在。

W形状为 (n_samples, n_components) 的 array-like,默认值=None

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

H形状为 (n_components, n_features) 的 array-like,默认值=None

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

返回:
self

返回实例本身。

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> 形式的参数,以便可以更新嵌套对象的每个组件。

参数:
**paramsdict

估计器参数。

返回:
self估计器实例

估计器实例。

set_partial_fit_request(*, H: bool | None | str = '$UNCHANGED$', W: bool | None | str = '$UNCHANGED$') MiniBatchNMF[源代码]#

请求传递给 partial_fit 方法的元数据。

请注意,此方法仅在 enable_metadata_routing=True 时才相关(参见 sklearn.set_config)。有关路由机制的工作原理,请参阅 用户指南

每个参数的选项是

  • True:请求元数据,如果提供则传递给 partial_fit。如果未提供元数据,则忽略请求。

  • False:不请求元数据,元估计器不会将其传递给 partial_fit

  • None:不请求元数据,如果用户提供元数据,元估计器将引发错误。

  • str:元数据应以给定别名而非原始名称传递给元估计器。

默认值(sklearn.utils.metadata_routing.UNCHANGED)保留现有请求。这允许您更改某些参数的请求而不更改其他参数。

1.3 版本新增。

注意

此方法仅当此估计器用作元估计器的子估计器时才相关,例如在 Pipeline 内部使用时。否则,它没有效果。

参数:
Hstr, True, False, 或 None,默认值=sklearn.utils.metadata_routing.UNCHANGED

partial_fit 方法中 H 参数的元数据路由。

Wstr, True, False, 或 None,默认值=sklearn.utils.metadata_routing.UNCHANGED

partial_fit 方法中 W 参数的元数据路由。

返回:
self对象

更新后的对象。

transform(X)[源代码]#

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

参数:
X形状为 (n_samples, n_features) 的 {array-like, 稀疏矩阵}

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

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

转换后的数据。