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 版本新增。
寻找两个非负矩阵,即所有元素均为非负的矩阵(
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
和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。'random'
:非负随机矩阵,按sqrt(X.mean() / n_components)
缩放。'nndsvd'
:非负双奇异值分解(NNDSVD)初始化(更适合稀疏性)。'nndsvda'
:NNDSVD,其中零用 X 的平均值填充(在不希望稀疏性时更好)。'nndsvdar'
:NNDSVD,其中零用小的随机值填充(通常更快,在不希望稀疏性时是 NNDSVDa 的一个不太准确的替代方案)。'custom'
:使用自定义矩阵W
和H
,两者都必须提供。
- 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).
[3]“Online algorithms for nonnegative matrix factorization with the Itakura-Saito divergence” 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)[源代码]#
为数据 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
配置
transform
和fit_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对象
更新后的对象。