详解 Scikit-learn 的 decomposition.NMF函数:非负矩阵分解

  • Post category:Python

Scikit-learn sklearn.decomposition.NMF 函数

Scikit-learn的sklearn.decomposition模块提供了各种用于矩阵分解的方法,其中包括一种流行的矩阵分解技术——非负矩阵分解(NMF)。Scikit-learn的sklearn.decomposition.NMF函数可以用于执行NMF操作。在本文中,我们将讨论sklearn.decomposition.NMF函数的作用和使用方法,并提供两个实例说明。

NMF的作用

在机器学习中,矩阵分解是一种常见的方法,可用于数据降维、因子分析、图像处理等。非负矩阵分解(NMF)是一种基于线性代数的矩阵分解技术,它将非负矩阵分解为两个非负矩阵的乘积,这两个矩阵的维度低于原始矩阵,从而实现降维的目的。

使用NMF可以将高维数据降维到低维空间,同时保留原始数据的结构特征和语义信息。NMF在文本挖掘领域得到了广泛的应用,例如在文本聚类、主题建模和情感分析等方面都可以得到很好的效果。

sklearn.decomposition.NMF函数的使用方法

在使用sklearn.decomposition.NMF函数时,需要指定分解的矩阵和分解成的两个低维矩阵的维度。可以使用fit_transform方法对原始矩阵进行NMF分解,并得到分解后的两个矩阵。分解后的矩阵可以用于降维,重构原始矩阵或进行主题建模等。

函数参数

sklearn.decomposition.NMF(n_components=None, init=None, solver=’cd’, beta_loss=’frobenius’, tol=0.0001, max_iter=200, random_state=None, alpha=0.0, l1_ratio=0.0, verbose=0, shuffle=False)

参数说明:

  • n_components : int or None,指分解矩阵成多少个低维矩阵,默认为None。如果不指定,将分解为原始矩阵的最小秩。
  • init : None | str | number | array-like,分解前初始化矩阵的方法,默认为None。如果为None,则使用随机值初始化矩阵。可以在 ‘nndsvd’、‘nndsvda’、‘nndsvdar’、‘custom’ 中选择,以不同的方式进行初始化。
  • solver : ‘cd’ | ‘mu’,指定用哪种算法求解。当选择 ‘cd’ 时,使用 coordinate descent 算法,而当选择 ‘mu’ 时,使用 multiplicative update 算法。
  • beta_loss : str,指损失函数的类型,可以是 ‘frobenius’、‘kullback-leibler’、‘itakura-saito’ 中的一个。默认为 ‘frobenius’。
  • tol : float,指迭代停止的阈值,默认为1e-4。当矩阵的更新量小于此值时,认为迭代已经收敛。
  • max_iter : int,指最大迭代次数,默认为200。
  • random_state : int,指定随机数生成器的种子,用于初始化。
  • alpha : float,L1惩罚项的权重,默认为0.0。
  • l1_ratio : float,L2惩罚项的权重,默认为0.0。
  • verbose : int,指定信息显示的详细程度。
  • shuffle : boolean,指定在每次更新之前是否随机化列的顺序。

示例1:使用NMF进行文本主题建模

考虑一组新闻文章,我们想要对其进行主题建模。首先,我们需要将文章中的单词表示为一个矩阵,并对该矩阵进行NMF分解。具体步骤如下:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF

# 将文章表示为一个tf-idf权重矩阵
tf_idf = TfidfVectorizer().fit_transform(articles)

# 使用NMF对矩阵进行分解
nmf_model = NMF(n_components=num_topics).fit(tf_idf)

# 得到分解后的矩阵
W = nmf_model.transform(tf_idf)
H = nmf_model.components_

上面的代码将所有文章的tf-idf表示合并成一个大矩阵,并使用NMF将其分解为两个矩阵W和H。W表示由主题组成的文档向量,H表示由单词组成的重构矩阵。通过调整num_topics的值,可以控制分解后的主题数量。

示例2:使用NMF进行图像分解与重构

我们可以将NMF用于对图像进行降维和重构。图像可以表示为一个像素矩阵,我们将其传递给NMF函数,它将分解为两个低维矩阵。其中一个矩阵表示原始图像的一些特性,另一个矩阵表示每个像素的权重。因此,我们可以使用这两个矩阵重构原始图像,或将其用于图像分类和识别等任务。

from sklearn.datasets import load_digits
from sklearn.decomposition import NMF
import matplotlib.pyplot as plt

# 加载手写数字图像
digits = load_digits().data

# 使用NMF对图像进行分解
model = NMF(n_components=16, init='random', random_state=0)
W = model.fit_transform(digits)
H = model.components_

# 重构原始图像
reconstructed_digits = model.inverse_transform(W)

# 可视化重构的图像
fig, axes = plt.subplots(2, 10, figsize=(10, 2),
                        subplot_kw={'xticks':[], 'yticks':[]},
                        gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i in range(10):
    axes[0, i].imshow(digits[i].reshape(8, 8), cmap='gray')
    axes[1, i].imshow(reconstructed_digits[i].reshape(8, 8), cmap='gray')
plt.show()

上面的代码使用NMF将手写数字图像分解为两个矩阵,并使用重构矩阵H还原原始图像。我们使用matplotlib库可视化原始图像和重构的图像。可以看到分解后的矩阵中包含了原始图像的很多重要特征,重构出的图像也很接近原始图像。