非负矩阵分解(NMF)介绍

非负矩阵分解(Non-negative Matrix Factorization,简称NMF)是一种数据降维技术,它将一个非负矩阵分解为两个非负矩阵的乘积,这两个矩阵分别称为基矩阵(W)和系数矩阵(H)。这种分解方法在许多领域都有应用,例如图像处理、音频分析、文本挖掘等。NMF的目标是找到一个近似的分解,使得原始矩阵X可以通过W和H的乘积来近似表示。

在数学上,NMF问题可以表示为最小化以下目标函数:

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

其中,||A||_{Fro}^2 表示矩阵A的Frobenius范数,即矩阵中所有元素的平方和;||vec(A)||_1 表示矩阵A的元素级L1范数,即矩阵中所有元素的绝对值之和。目标函数中的正则化项用于控制W和H的稀疏性,以提高分解的可解释性。

NMF算法通常采用交替最小化的方法来求解W和H。具体来说,算法首先随机初始化W和H,然后交替地固定一个矩阵,优化另一个矩阵,直到收敛。在某些情况下,如果已知其中一个矩阵,可以设置update_H=False,只求解另一个矩阵。

NMF算法的参数包括:

  • n_components:分解的维数,即基矩阵W的列数。如果设置为'auto',则自动从W或H的形状推断维数。
  • init:初始化方法,可以是'random'、'nndsvd'、'nndsvda'、'nndsvdar'或'custom'。
  • update_H:是否更新系数矩阵H。如果设置为False,则只求解基矩阵W。
  • solver:数值求解器,可以是'cd'(坐标下降法)或'mu'(乘性更新法)。
  • beta_loss:用于衡量X和WH之间距离的beta散度。常用的值有'frobenius'、'kullback-leibler'和'itakura-saito'。
  • tol:停止条件的容忍度。
  • max_iter:最大迭代次数。
  • alpha_W和alpha_H:分别控制W和H的正则化项的系数。
  • l1_ratio:正则化混合参数,用于控制L1和L2正则化的权重。
  • random_state:用于初始化和坐标下降法中的随机数生成器。
  • verbose:输出日志的详细程度。
  • shuffle:是否在坐标下降法中随机化坐标的顺序。

下面是一个使用Python的scikit-learn库进行NMF分解的示例代码:

import numpy as np from sklearn.decomposition import non_negative_factorization # 定义一个非负矩阵X X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]]) # 进行NMF分解 W, H, n_iter = non_negative_factorization(X, n_components=2, init='random', random_state=0) # 打印结果 print("基矩阵W:") print(W) print("系数矩阵H:") print(H) print("迭代次数:", n_iter)

在这个示例中,首先导入了numpy和scikit-learn库,然后定义了一个非负矩阵X。接着,使用non_negative_factorization函数进行NMF分解,指定了分解的维数为2,初始化方法为'random',并设置了随机数生成器的种子为0。最后,打印出了基矩阵W、系数矩阵H和迭代次数。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485