2.5. 将信号分解为成分(矩阵分解问题)#

2.5.1. 主成分分析 (PCA)#

2.5.1.1. 精确 PCA 和概率解释#

PCA 用于将多变量数据集分解为一系列连续的正交成分,这些成分解释了最大量的方差。在 scikit-learn 中,PCA 实现为一个转换器对象,它在其 fit 方法中学习 \(n\) 个成分,并且可以用于新数据以将其投影到这些成分上。

在应用 SVD 之前,PCA 会对每个特征的输入数据进行中心化,但不会进行缩放。可选参数 whiten=True 使得可以将数据投影到奇异空间,同时将每个成分的方差缩放为单位方差。如果下游模型对方差的各向同性做出了强烈的假设,这通常很有用:例如,使用 RBF 核的支持向量机和 K 均值聚类算法就是这种情况。

下面是一个鸢尾花数据集的例子,它包含 4 个特征,投影到解释最多方差的 2 个维度上

../_images/sphx_glr_plot_pca_vs_lda_001.png

PCA 对象还提供 PCA 的概率解释,可以根据它解释的方差量给出数据的似然性。因此,它实现了一个 score 方法,可用于交叉验证

../_images/sphx_glr_plot_pca_vs_fa_model_selection_001.png

示例

2.5.1.2. 增量 PCA#

PCA 对象非常有用,但对于大型数据集有一些限制。最大的限制是 PCA 只支持批处理,这意味着要处理的所有数据都必须放入主内存。IncrementalPCA 对象使用不同的处理形式,并允许进行部分计算,这些计算几乎完全匹配 PCA 的结果,同时以小批量方式处理数据。IncrementalPCA 使得可以实现以下两种方式的内存外主成分分析:

  • 使用其 partial_fit 方法对从本地硬盘驱动器或网络数据库顺序获取的数据块进行处理。

  • 使用 numpy.memmap 对内存映射文件调用其 fit 方法。

为了增量更新explained_variance_ratio_IncrementalPCA 只存储分量和噪声方差的估计值。这就是内存使用取决于每个批次的样本数量,而不是数据集要处理的样本数量的原因。

PCA 一样,IncrementalPCA 在应用 SVD 之前,会对每个特征的输入数据进行中心化,但不会进行缩放。

../_images/sphx_glr_plot_incremental_pca_001.png
../_images/sphx_glr_plot_incremental_pca_002.png

示例

2.5.1.3. 使用随机 SVD 的 PCA#

通过丢弃与较低奇异值相关的分量的奇异向量,将数据投影到保留大部分方差的低维空间通常很有意义。

例如,如果我们使用 64x64 像素灰度图像进行人脸识别,则数据的维数为 4096,并且在如此宽的数据上训练 RBF 支持向量机速度很慢。此外,我们知道数据的内在维数远小于 4096,因为所有人的脸部图像看起来都有些相似。样本位于维数低得多的流形上(例如,大约 200)。PCA 算法可用于线性变换数据,同时降低维数并同时保留大部分解释方差。

使用可选参数 svd_solver='randomized'PCA 类在这种情况下非常有用:由于我们将丢弃大部分奇异向量,因此将计算限制在我们实际要执行变换时将保留的奇异向量的近似估计效率更高。

例如,以下是来自 Olivetti 数据集的 16 个样本肖像(以 0.0 为中心)。右侧是重塑为肖像的前 16 个奇异向量。由于我们只需要大小为 \(n_{samples} = 400\)\(n_{features} = 64 \times 64 = 4096\) 的数据集的前 16 个奇异向量,因此计算时间不到 1 秒。

orig_img pca_img

如果我们记 \(n_{\max} = \max(n_{\mathrm{samples}}, n_{\mathrm{features}})\)\(n_{\min} = \min(n_{\mathrm{samples}}, n_{\mathrm{features}})\),则随机 PCA 的时间复杂度为 \(O(n_{\max}^2 \cdot n_{\mathrm{components}})\),而不是 PCA 中实现的精确方法的 \(O(n_{\max}^2 \cdot n_{\min})\)

随机 PCA 的内存占用量也与 \(2 \cdot n_{\max} \cdot n_{\mathrm{components}}\) 成正比,而不是精确方法的 \(n_{\max} \cdot n_{\min}\)

注意:即使 whiten=False(默认值),使用 svd_solver='randomized'PCAinverse_transform 的实现也不是 transform 的精确逆变换。

示例

参考文献

2.5.1.4. 稀疏主成分分析 (SparsePCA 和 MiniBatchSparsePCA)#

SparsePCA 是 PCA 的一种变体,其目标是提取最能重构数据的稀疏分量集。

小型批次稀疏 PCA(MiniBatchSparsePCA)是 SparsePCA 的一种变体,它速度更快但精度较低。通过对给定迭代次数的一组特征的小块进行迭代来达到更高的速度。

主成分分析 (PCA) 的缺点是这种方法提取的分量具有完全密集的表达式,即当表示为原始变量的线性组合时,它们具有非零系数。这可能使解释变得困难。在许多情况下,真实的潜在分量可以更自然地想象为稀疏向量;例如,在人脸识别中,分量可能自然地映射到面部的一部分。

稀疏主成分产生更简洁、更易解释的表示,清楚地强调了哪些原始特征导致样本之间的差异。

下面的例子说明了使用稀疏 PCA 从 Olivetti 人脸数据集提取的 16 个分量。可以看到正则化项是如何导致许多零的。此外,数据的自然结构导致非零系数垂直相邻。模型不会在数学上强制执行此操作:每个分量都是一个向量 \(h \in \mathbf{R}^{4096}\),除了作为 64x64 像素图像的人性化可视化之外,没有垂直相邻的概念。下面显示的分量看起来很局部,这是数据固有结构的影响,这使得这种局部模式可以最小化重建误差。存在考虑相邻性和不同类型结构的稀疏诱导范数;参见 [Jen09] 以了解此类方法的综述。有关如何使用 Sparse PCA 的更多详细信息,请参见下面的“示例”部分。

pca_img spca_img

请注意,Sparse PCA 问题有很多不同的公式。这里实现的公式基于 [Mrl09]。求解的优化问题是一个具有分量上 \(\ell_1\) 惩罚的 PCA 问题(字典学习)

\[\begin{split}(U^*, V^*) = \underset{U, V}{\operatorname{arg\,min\,}} & \frac{1}{2} ||X-UV||_{\text{Fro}}^2+\alpha||V||_{1,1} \\ \text{subject to } & ||U_k||_2 <= 1 \text{ for all } 0 \leq k < n_{components}\end{split}\]

\(||.||_{\text{Fro}}\) 代表弗罗贝尼乌斯范数,而 \(||.||_{1,1}\) 代表逐元素矩阵范数,它是矩阵中所有元素绝对值之和。这种稀疏性诱导的 \(||.||_{1,1}\) 矩阵范数还可以防止在训练样本较少时从噪声中学习成分。惩罚程度(以及稀疏性)可以通过超参数 alpha 进行调整。较小的值会导致轻微正则化的分解,而较大的值会将许多系数缩小为零。

注意

虽然 MiniBatchSparsePCA 秉承在线算法的精神,但它并没有实现 partial_fit,因为该算法在线的是特征方向,而不是样本方向。

示例

参考文献

[Mrl09]

“用于稀疏编码的在线字典学习” J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009

[Jen09]

“结构化稀疏主成分分析” R. Jenatton, G. Obozinski, F. Bach, 2009

2.5.2. 核主成分分析 (kPCA)#

2.5.2.1. 精确核 PCA#

KernelPCA 是 PCA 的扩展,它通过使用核函数实现非线性降维(参见 成对度量、亲和性和核[Scholkopf1997]。它有许多应用,包括去噪、压缩和结构化预测(核依赖估计)。KernelPCA 支持 transforminverse_transform

../_images/sphx_glr_plot_kernel_pca_002.png

注意

KernelPCA.inverse_transform 依赖于核岭回归来学习将样本从 PCA 基映射到原始特征空间的函数 [Bakir2003]。因此,使用 KernelPCA.inverse_transform 获得的重建是一个近似值。有关更多详细信息,请参见下面链接的示例。

示例

参考文献

[Scholkopf1997]

Schölkopf, Bernhard, Alexander Smola 和 Klaus-Robert Müller。“核主成分分析。” 人工神经网络国际会议。Springer,柏林,海德堡,1997 年。

[Bakir2003]

Bakır, Gökhan H.,Jason Weston 和 Bernhard Schölkopf。“学习寻找原像。” 神经信息处理系统进展 16 (2003):449-456。

2.5.2.2. 核 PCA 的求解器选择#

PCA 中,成分数量受特征数量的限制,而在 KernelPCA 中,成分数量受样本数量的限制。许多现实世界的数据集具有大量的样本!在这些情况下,使用完整的 kPCA 查找 *所有* 成分是一种计算时间的浪费,因为数据主要由前几个成分描述(例如 n_components<=100)。换句话说,在核 PCA 拟合过程中进行特征分解的中心化 Gram 矩阵的有效秩远小于其大小。在这种情况下,近似特征值求解器可以在精度损失非常低的情况下提供加速。

特征值求解器#

可选参数 eigen_solver='randomized' 可用于在请求的 n_components 数量比样本数量小得多时 *显著* 减少计算时间。它依赖于随机分解方法在更短的时间内找到近似解。

随机 KernelPCA 的时间复杂度为 \(O(n_{\mathrm{samples}}^2 \cdot n_{\mathrm{components}})\),而不是使用 eigen_solver='dense' 实现的精确方法的 \(O(n_{\mathrm{samples}}^3)\)

随机 KernelPCA 的内存占用量也与 \(2 \cdot n_{\mathrm{samples}} \cdot n_{\mathrm{components}}\) 成正比,而不是精确方法的 \(n_{\mathrm{samples}}^2\)

注意:此技术与 使用随机 SVD 的 PCA 中的技术相同。

除了上述两个求解器之外,还可以使用 eigen_solver='arpack' 作为获得近似分解的替代方法。实际上,只有当要查找的成分数量极少时,此方法才能提供合理的执行时间。当所需成分数量小于 10(严格)且样本数量大于 200(严格)时,它默认启用。有关详细信息,请参见 KernelPCA

参考文献

2.5.3. 截断奇异值分解和潜在语义分析#

TruncatedSVD 实现了一种奇异值分解 (SVD) 的变体,它只计算 \(k\) 个最大的奇异值,其中 \(k\) 是用户指定的参数。

TruncatedSVDPCA 非常相似,但不同之处在于矩阵 \(X\) 不需要进行中心化。当从特征值中减去 \(X\) 的列均值(每个特征)时,对结果矩阵进行截断 SVD 等效于 PCA。

关于截断 SVD 和潜在语义分析 (LSA)#

当将截断 SVD 应用于词-文档矩阵(由 CountVectorizerTfidfVectorizer 返回)时,这种变换被称为 潜在语义分析 (LSA),因为它将此类矩阵转换为低维度的“语义”空间。特别是,LSA 已知可以克服同义词和多义词的影响(两者大致都意味着每个词有多个含义),这些影响会导致词-文档矩阵过于稀疏,并且在余弦相似度等度量下表现出较差的相似性。

注意

LSA 也被称为潜在语义索引 (LSI),尽管严格来说,它指的是在信息检索目的的持久索引中的使用。

在数学上,应用于训练样本 \(X\) 的截断 SVD 会产生一个低秩近似 \(X\)

\[X \approx X_k = U_k \Sigma_k V_k^\top\]

此操作之后,\(U_k \Sigma_k\) 是具有 \(k\) 个特征的转换后的训练集(在 API 中称为 n_components)。

要转换测试集 \(X\),我们将其与 \(V_k\) 相乘

\[X' = X V_k\]

注意

自然语言处理 (NLP) 和信息检索 (IR) 文献中大多数关于 LSA 的论述都交换了矩阵 \(X\) 的轴,使其形状为 (n_features, n_samples)。我们以不同的方式呈现 LSA,使其更符合 scikit-learn API,但找到的奇异值是相同的。

虽然 TruncatedSVD 变换器可用于任何特征矩阵,但在 LSA/文档处理设置中,建议将其用于 tf-idf 矩阵而不是原始频率计数。特别是,应开启次线性缩放和逆文档频率 (sublinear_tf=True, use_idf=True),以使特征值更接近高斯分布,从而弥补 LSA 对文本数据的错误假设。

示例

参考文献

  • Christopher D. Manning, Prabhakar Raghavan 和 Hinrich Schütze (2008), *Introduction to Information Retrieval*, Cambridge University Press, 第 18 章: 矩阵分解与潜在语义索引

2.5.4. 字典学习#

2.5.4.1. 使用预计算字典的稀疏编码#

SparseCoder 对象是一个估计器,可用于将信号转换为来自固定预计算字典(例如离散小波基)的原子的稀疏线性组合。因此,此对象不实现 fit 方法。转换相当于一个稀疏编码问题:找到数据的表示,使其尽可能少地使用字典原子进行线性组合。所有字典学习的变体都实现以下变换方法,可通过 transform_method 初始化参数进行控制。

阈值法速度很快,但不能产生精确的重建结果。文献中已证明它们在分类任务中很有用。对于图像重建任务,正交匹配追踪可以产生最准确、最无偏差的重建结果。

字典学习对象通过 split_code 参数提供将稀疏编码结果中的正值和负值分开的功能。当使用字典学习提取将用于监督学习的特征时,这很有用,因为它允许学习算法为特定原子的负载荷分配与相应正载荷不同的权重。

单个样本的分割代码长度为2 * n_components,其构造规则如下:首先,计算长度为n_components的常规代码。然后,将split_code的前n_components个元素填充为常规代码向量的正部分。分割代码的后半部分填充为代码向量的负部分,但带有正号。因此,分割代码是非负的。

示例

2.5.4.2. 通用字典学习#

字典学习(DictionaryLearning)是一个矩阵分解问题,相当于寻找一个(通常是过完备的)字典,该字典能够很好地对拟合数据进行稀疏编码。

将数据表示为来自过完备字典的原子的稀疏组合,被认为是哺乳动物初级视觉皮层的工作方式。因此,应用于图像块的字典学习已被证明在图像处理任务(如图像补全、修复和去噪)以及监督识别任务中取得了良好的效果。

字典学习是一个优化问题,通过交替更新稀疏代码来解决,将字典视为固定值,求解多个Lasso问题,然后更新字典以最佳拟合稀疏代码。

\[\begin{split}(U^*, V^*) = \underset{U, V}{\operatorname{arg\,min\,}} & \frac{1}{2} ||X-UV||_{\text{Fro}}^2+\alpha||U||_{1,1} \\ \text{subject to } & ||V_k||_2 <= 1 \text{ for all } 0 \leq k < n_{\mathrm{atoms}}\end{split}\]

pca_img2 dict_img2

\(||.||_{\text{Fro}}\)表示弗罗贝尼乌斯范数,\(||.||_{1,1}\)表示逐元素矩阵范数,即矩阵中所有元素绝对值的和。在使用此过程拟合字典后,变换只是一个稀疏编码步骤,其实现与所有字典学习对象相同(参见使用预计算字典的稀疏编码)。

也可以将字典和/或代码约束为正数,以匹配数据中可能存在的约束。以下是应用不同正性约束的面部图像。红色表示负值,蓝色表示正值,白色表示零。

dict_img_pos1 dict_img_pos2

dict_img_pos3 dict_img_pos4

下图显示了从浣熊脸图像的一部分中提取的 4x4 像素图像块学习到的字典的样子。

../_images/sphx_glr_plot_image_denoising_001.png

示例

参考文献

2.5.4.3. 小批量字典学习#

MiniBatchDictionaryLearning实现了一个更快但精度较低的字典学习算法版本,更适合大型数据集。

默认情况下,MiniBatchDictionaryLearning将数据分成小批量,并通过对小批量进行指定次数的迭代来在线优化。但是,目前它没有实现停止条件。

该估计器还实现了partial_fit,它通过仅对小批量进行一次迭代来更新字典。当数据无法从一开始就 readily available,或者数据无法放入内存时,这可用于在线学习。

../_images/sphx_glr_plot_dict_face_patches_001.png

2.5.5. 因子分析#

在无监督学习中,我们只有一个数据集\(X = \{x_1, x_2, \dots, x_n \}\)。如何用数学方法描述这个数据集?一个非常简单的连续 潜在 变量模型\(X\)

\[x_i = W h_i + \mu + \epsilon\]

向量\(h_i\)被称为“潜在”变量,因为它未被观察到。\(\epsilon\)被认为是服从均值为0,协方差为\(\Psi\)的高斯分布的噪声项(即\(\epsilon \sim \mathcal{N}(0, \Psi)\)),\(\mu\)是某个任意的偏移向量。这种模型被称为“生成式”模型,因为它描述了\(x_i\)是如何由\(h_i\)生成的。如果我们将所有\(x_i\)作为列向量构成矩阵\(\mathbf{X}\),并将所有\(h_i\)作为列向量构成矩阵\(\mathbf{H}\),那么我们可以写成(对于适当定义的\(\mathbf{M}\)\(\mathbf{E}\)):

\[\mathbf{X} = W \mathbf{H} + \mathbf{M} + \mathbf{E}\]

换句话说,我们对矩阵\(\mathbf{X}\)进行了分解

如果给定\(h_i\),上述等式自动蕴含以下概率解释:

\[p(x_i|h_i) = \mathcal{N}(Wh_i + \mu, \Psi)\]

对于完整的概率模型,我们还需要潜在变量\(h\)的先验分布。最直接的假设(基于高斯分布的良好性质)是\(h \sim \mathcal{N}(0, \mathbf{I})\)。这使得\(x\)的边缘分布为高斯分布:

\[p(x) = \mathcal{N}(\mu, WW^T + \Psi)\]

现在,在没有任何进一步的假设下,具有潜在变量\(h\)的想法将是多余的——\(x\)可以用均值和协方差完全建模。我们需要对这两个参数中的一个强加一些更具体的结构。一个简单的附加假设涉及误差协方差\(\Psi\)的结构。

  • \(\Psi = \sigma^2 \mathbf{I}\):这个假设导致了PCA的概率模型。

  • \(\Psi = \mathrm{diag}(\psi_1, \psi_2, \dots, \psi_n)\):这个模型被称为FactorAnalysis,一个经典的统计模型。矩阵W有时被称为“因子载荷矩阵”。

这两个模型本质上都是估计具有低秩协方差矩阵的高斯分布。因为这两个模型都是概率模型,所以它们可以集成到更复杂的模型中,例如因子分析混合模型。如果假设潜在变量的非高斯先验,则会得到非常不同的模型(例如FastICA)。

因子分析可以产生与PCA类似的成分(其载荷矩阵的列)。但是,人们不能对这些成分做出任何一般性陈述(例如,它们是否正交)。

pca_img3 fa_img3

因子分析相对于PCA的主要优势在于,它可以独立地对输入空间每个方向上的方差进行建模(异方差噪声)。

../_images/sphx_glr_plot_faces_decomposition_009.png

这使得在存在异方差噪声的情况下,比概率PCA具有更好的模型选择。

../_images/sphx_glr_plot_pca_vs_fa_model_selection_002.png

因子分析通常后接因子旋转(使用参数rotation),通常是为了提高可解释性。例如,Varimax旋转最大化平方载荷的方差之和,即它倾向于产生更稀疏的因子,每个因子只受少数几个特征的影响(“简单结构”)。参见下面的第一个例子。

示例

2.5.6. 独立成分分析 (ICA)#

独立成分分析将多元信号分离成最大独立的加性子成分。它在scikit-learn中使用Fast ICA算法实现。通常,ICA不用于降维,而是用于分离叠加信号。由于ICA模型不包含噪声项,为了使模型正确,必须应用白化处理。这可以使用whiten参数内部进行,也可以使用PCA的变体手动进行。

它经典地用于分离混合信号(一个被称为盲源分离的问题),如下面的例子所示。

../_images/sphx_glr_plot_ica_blind_source_separation_001.png

ICA也可以用作另一种非线性分解方法,它可以找到一些稀疏的成分。

pca_img4 ica_img4

示例

2.5.7. 非负矩阵分解 (NMF 或 NNMF)#

2.5.7.1. 使用Frobenius范数的NMF#

NMF [1]是一种替代的分解方法,它假设数据和成分都是非负的。NMF可以在数据矩阵不包含负值的情况下,替代PCA或其变体。它通过优化\(X\)和矩阵乘积\(WH\)之间的距离\(d\),找到样本\(X\)分解成两个非负元素矩阵\(W\)\(H\)的方法。最常用的距离函数是平方Frobenius范数,它是欧几里得范数到矩阵的直接扩展。

\[d_{\mathrm{Fro}}(X, Y) = \frac{1}{2} ||X - Y||_{\mathrm{Fro}}^2 = \frac{1}{2} \sum_{i,j} (X_{ij} - {Y}_{ij})^2\]

PCA不同,向量的表示是通过叠加成分获得的,而不是相减。这种加性模型对于表示图像和文本非常有效。

在[Hoyer, 2004] [2]中观察到,当仔细约束时,NMF可以产生数据集的基于部分的表示,从而产生可解释的模型。下面的例子显示了NMF从Olivetti人脸数据集中的图像中找到的16个稀疏成分,并与PCA特征脸进行了比较。

pca_img5 nmf_img5

init属性决定了所应用的初始化方法,这会极大地影响该方法的性能。NMF实现了非负双奇异值分解方法。NNDSVD [4]基于两个SVD过程,一个逼近数据矩阵,另一个利用单位秩矩阵的代数性质逼近所得部分SVD因子的正部分。基本的NNDSVD算法更适合稀疏分解。在密集情况下,建议使用其变体NNDSVDa(其中所有零都设置为所有数据元素的平均值)和NNDSVDar(其中零设置为小于数据平均值除以100的随机扰动)。

请注意,乘法更新(‘mu’)求解器无法更新初始化中存在的零,因此当与引入大量零的基本NNDSVD算法一起使用时,会导致较差的结果;在这种情况下,应优先选择NNDSVDa或NNDSVDar。

通过设置init="random"NMF也可以用正确缩放的随机非负矩阵进行初始化。 也可以将整数种子或RandomState传递给random_state以控制可重复性。

NMF中,可以向损失函数添加L1和L2先验以正则化模型。L2先验使用Frobenius范数,而L1先验使用逐元素L1范数。与ElasticNet一样,我们使用l1_ratio (\(\rho\))参数控制L1和L2的组合,并使用alpha_Walpha_H (\(\alpha_W\)\(\alpha_H\))参数控制正则化的强度。对于H,先验项按样本数(\(n\_samples\))缩放,对于W,按特征数(\(n\_features\))缩放,以保持它们的影响相互平衡,并尽可能独立于训练集的大小与数据拟合项保持平衡。然后先验项为

\[(\alpha_W \rho ||W||_1 + \frac{\alpha_W(1-\rho)}{2} ||W||_{\mathrm{Fro}} ^ 2) * n\_features + (\alpha_H \rho ||H||_1 + \frac{\alpha_H(1-\rho)}{2} ||H||_{\mathrm{Fro}} ^ 2) * n\_samples\]

正则化目标函数为

\[d_{\mathrm{Fro}}(X, WH) + (\alpha_W \rho ||W||_1 + \frac{\alpha_W(1-\rho)}{2} ||W||_{\mathrm{Fro}} ^ 2) * n\_features + (\alpha_H \rho ||H||_1 + \frac{\alpha_H(1-\rho)}{2} ||H||_{\mathrm{Fro}} ^ 2) * n\_samples\]

2.5.7.2. 基于β散度的NMF#

如前所述,最常用的距离函数是平方Frobenius范数,它是欧几里德范数到矩阵的明显扩展

\[d_{\mathrm{Fro}}(X, Y) = \frac{1}{2} ||X - Y||_{Fro}^2 = \frac{1}{2} \sum_{i,j} (X_{ij} - {Y}_{ij})^2\]

其他距离函数也可以用于NMF,例如(广义) Kullback-Leibler (KL) 散度,也称为I散度

\[d_{KL}(X, Y) = \sum_{i,j} (X_{ij} \log(\frac{X_{ij}}{Y_{ij}}) - X_{ij} + Y_{ij})\]

或者,Itakura-Saito (IS) 散度

\[d_{IS}(X, Y) = \sum_{i,j} (\frac{X_{ij}}{Y_{ij}} - \log(\frac{X_{ij}}{Y_{ij}}) - 1)\]

这三种距离是β散度族的特例,分别对应\(\beta = 2, 1, 0\)[6]。β散度的定义为

\[d_{\beta}(X, Y) = \sum_{i,j} \frac{1}{\beta(\beta - 1)}(X_{ij}^\beta + (\beta-1)Y_{ij}^\beta - \beta X_{ij} Y_{ij}^{\beta - 1})\]
../_images/beta_divergence.png

注意,如果\(\beta \in (0; 1)\),则此定义无效,但它可以连续扩展到\(d_{KL}\)\(d_{IS}\)的定义。

NMF 实现的求解器#

NMF实现了两种求解器,使用坐标下降法(‘cd’) [5]和乘法更新法(‘mu’) [6]。‘mu’求解器可以优化每种β散度,当然包括Frobenius范数(\(\beta=2\))、(广义) Kullback-Leibler散度(\(\beta=1\))和Itakura-Saito散度(\(\beta=0\))。请注意,对于\(\beta \in (1; 2)\),‘mu’求解器比其他\(\beta\)值快得多。还要注意,对于负数(或0,即‘itakura-saito’) \(\beta\),输入矩阵不能包含零值。

‘cd’求解器只能优化Frobenius范数。由于NMF的潜在非凸性,即使优化相同的距离函数,不同的求解器也可能收敛到不同的最小值。

NMF 最好与fit_transform方法一起使用,该方法返回矩阵W。矩阵H存储在拟合模型的components_属性中;transform方法将基于这些存储的成分分解新的矩阵X_new。

>>> 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 NMF
>>> model = NMF(n_components=2, init='random', random_state=0)
>>> W = model.fit_transform(X)
>>> H = model.components_
>>> X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]])
>>> W_new = model.transform(X_new)

示例

2.5.7.3. 小批量非负矩阵分解#

MiniBatchNMF [7]实现了一个更快但不太精确的非负矩阵分解版本(即NMF),更适合大型数据集。

默认情况下,MiniBatchNMF将数据分成小批量,并通过循环遍历指定迭代次数的小批量以在线方式优化NMF模型。batch_size参数控制批次的尺寸。

为了加快小批量算法的速度,还可以缩放过去的批次,使其比新的批次的重要性降低。这是通过引入所谓的遗忘因子来实现的,该因子由forget_factor参数控制。

该估计器还实现了partial_fit方法,该方法通过仅迭代一次小批量数据来更新H。当数据并非一开始就 readily available,或者数据无法放入内存时,这可以用于在线学习。

参考文献

2.5.8. 潜在狄利克雷分配 (LDA)#

潜在狄利克雷分配是一种用于离散数据集集合(例如文本语料库)的生成概率模型。它也是一种主题模型,用于从文档集合中发现抽象主题。

LDA 的图形模型是一个三层生成模型。

../_images/lda_model_graph.png

关于上图中所示符号的说明,可在 Hoffman 等人(2013)中找到。

  • 语料库是包含\(D\)个文档的集合。

  • 一个文档是一个包含\(N\)个词的序列。

  • 语料库中共有\(K\)个主题。

  • 方框表示重复采样。

在图形模型中,每个节点都是一个随机变量,并在生成过程中发挥作用。阴影节点表示观察变量,非阴影节点表示隐藏(潜在)变量。在本例中,语料库中的词是我们唯一观察到的数据。潜在变量决定了语料库中主题的随机混合以及文档中词的分布。LDA 的目标是利用观察到的词来推断隐藏的主题结构。

文本语料库建模详情#

在对文本语料库建模时,该模型假设对于具有\(D\)个文档和\(K\)个主题的语料库,以下生成过程,其中\(K\)对应于API中的n_components

  1. 对于每个主题\(k \in K\),绘制\(\beta_k \sim \mathrm{Dirichlet}(\eta)\)。这提供了一个词的分布,即词出现在主题\(k\)中的概率。\(\eta\)对应于topic_word_prior

  2. 对于每个文档\(d \in D\),绘制主题比例\(\theta_d \sim \mathrm{Dirichlet}(\alpha)\)\(\alpha\)对应于doc_topic_prior

  3. 对于文档\(d\)中的每个词\(i\)

    1. 绘制主题分配\(z_{di} \sim \mathrm{Multinomial} (\theta_d)\)

    2. 绘制观察到的词\(w_{ij} \sim \mathrm{Multinomial} (\beta_{z_{di}})\)

对于参数估计,后验分布为

\[p(z, \theta, \beta |w, \alpha, \eta) = \frac{p(z, \theta, \beta|\alpha, \eta)}{p(w|\alpha, \eta)}\]

由于后验分布是难以处理的,变分贝叶斯方法使用更简单的分布\(q(z,\theta,\beta | \lambda, \phi, \gamma)\)来逼近它,并且这些变分参数\(\lambda\)\(\phi\)\(\gamma\)被优化以最大化证据下界 (ELBO)

\[\log\: P(w | \alpha, \eta) \geq L(w,\phi,\gamma,\lambda) \overset{\triangle}{=} E_{q}[\log\:p(w,z,\theta,\beta|\alpha,\eta)] - E_{q}[\log\:q(z, \theta, \beta)]\]

最大化 ELBO 等效于最小化\(q(z,\theta,\beta)\)与真实后验\(p(z, \theta, \beta |w, \alpha, \eta)\)之间的 Kullback-Leibler (KL) 散度。

LatentDirichletAllocation实现了在线变分贝叶斯算法,并支持在线和批量更新方法。批量方法在每次完整遍历数据后更新变分变量,而在线方法则从小批量数据点更新变分变量。

注意

虽然在线方法保证收敛到局部最优点,但最优点的质量和收敛速度可能取决于小批量大小和与学习率设置相关的属性。

LatentDirichletAllocation应用于“文档-词项”矩阵时,该矩阵将被分解为“主题-词项”矩阵和“文档-主题”矩阵。“主题-词项”矩阵存储在模型中的components_中,“文档-主题”矩阵可以通过transform方法计算。

LatentDirichletAllocation还实现了partial_fit方法。当数据可以顺序获取时,可以使用此方法。

示例

参考文献

另见 降维 了解使用邻域成分分析进行降维。