non_negative_factorization#

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

计算非负矩阵分解(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\) (弗罗贝尼乌斯规范)和 \(||vec(A)||_1 = \sum_{i,j} abs(A_{ij})\) (元素级L1范数)

一般规范 \(||X - WH||_{loss}^2\) 可能代表弗罗贝尼乌斯规范或另一种支持的β-背离损失。选项之间的选择由 beta_loss 参数.

正规化项的缩放方式为 n_featuresWn_samplesH 保持其相互影响平衡,并尽可能独立于规模的数据匹配项 n_samples 训练集的。

通过W和H的交替最小化来最小化目标函数。如果给出H并且Update_H=False,则仅求解W。

请注意,转换后的数据命名为W,分量矩阵命名为H。在NMF文献中,命名惯例通常相反,因为数据矩阵X是转置的。

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

不变矩阵。

W形状类似阵列(n_samples,n_components),默认=无

If init='custom', it is used as initial guess for the solution. If update_H=False, it is initialised as an array of zeros, unless solver='mu', then it is filled with values calculated by np.sqrt(X.mean() / self._n_components). If None, uses the initialisation method specified in init.

H形状类似阵列(n_components,n_features),默认=无

If init='custom', it is used as initial guess for the solution. If update_H=False, it is used as a constant, to solve for W only. If None, uses the initialisation method specified in init.

n_componentsint或' Auto '}或无,默认=' Auto '

组件数量。如果 None ,所有功能均保留。如果 n_components='auto' ,自动推断出组件数量 WH 形状.

在 1.4 版本发生变更: 添加 'auto'

在 1.6 版本发生变更: 默认值更改为 None'auto' .

init' random ',' nnddsvda ',' nndsdar ',

用于初始化过程的方法。

有效选项:

  • 无:如果n_components < n_features,则为“nndsvda”,否则为“随机”。

  • “random”:非负随机矩阵,按以下方式缩放: sqrt(X.mean() / n_components)

  • “nndsvd”:非负双奇异值分解(NNDSDVD)初始化(对于稀疏性更好)

  • “nndsvda”:用X的平均值填充零的NNDS VD(当不需要稀疏时更好)

  • 'nndsvdar':NDNDS VD,零填充小随机值(通常在不需要稀疏性时代替NNDSVDa,通常更快、准确性较低)

  • “定制”:如果 update_H=True ,使用必须提供的自定义矩阵W和H。如果 update_H=False ,则仅使用自定义矩阵H。

在 0.23 版本发生变更: 的默认值 init 0.23中从“随机”更改为无。

在 1.1 版本发生变更: init=None 并且n_components小于n_samples,并且n_features默认为 nndsvda 而不是 nndsvd .

update_H布尔,默认=True

设置为True时,W和H都将根据最初的猜测进行估计。设置为False,将仅估计W。

solver' CD ',',默认=' CD '

要使用的数字求解器:

  • “CD”是一个使用快速分层交替最小平方(Fast HALS)的坐标下降解算器。

  • “ku”是一个相乘更新解算器。

Added in version 0.17: 协调下降求解器。

Added in version 0.19: 乘法更新解算器。

beta_lossfloat或' frobenius ',&#39 ' itakura-saito '},默认=' frobenius '

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

Added in version 0.19.

tolfloat,默认= 1 e-4

停止条件的容忍度。

max_iterint,默认=200

超时前的最大迭代次数。

alpha_Wfloat,默认=0.0

乘以的正规化项的常数 W .将其设置为零(默认)以没有规则化 W .

Added in version 1.0.

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

乘以的正规化项的常数 H .将其设置为零以不进行正规化 H .如果“相同”(默认),则采用与 alpha_W .

Added in version 1.0.

l1_ratiofloat,默认=0.0

正规化混合参数,0 <= l1_ratio <= 1。对于l1_ratio = 0,罚分是元素L2罚分(又名Frobenius Norm)。对于l1_ratio = 1,这是一个元素L1罚分。对于0 <l1_ratio < 1,罚分是L1和L2的组合。

random_stateint,RandomState实例或无,默认=无

用于NMF初始化(当 init ==' nndsvdar '或' random '),并在坐标下降中。传递int以获得跨多个函数调用的可重复结果。看到 Glossary .

verboseint,默认=0

冗长程度。

shuffle布尔,默认=假

如果为真,请随机化CD求解器中的坐标顺序。

返回:
W形状的nd数组(n_samples,n_components)

非负最小二乘问题的解。

Hndrow形状数组(n_components,n_features)

非负最小二乘问题的解。

n_iterint

实际迭代次数。

引用

[1]

"Fast local algorithms for large scale nonnegative matrix and tensor factorizations" 西西斯基、安杰伊和PH A. N.安惠。IEICE电子、通信和计算机科学基础交易92.3:708-721,2009年。

[2]

"Algorithms for nonnegative matrix factorization with the beta-divergence" 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 non_negative_factorization
>>> W, H, n_iter = non_negative_factorization(
...     X, n_components=2, init='random', random_state=0)