Skip to content

2.5. 信号分量分解(矩阵因子分解问题)

2.5.1. 主成分分析 (PCA)

2.5.1.1. 精确的PCA和概率性解释

PCA 用来把多元数据集分解成一组连续正交分量的表示,这些正交分量可以用来解释方差的最大量。在scikit-learn中,PCA被实现为学习的转换器(transformer)对象,可以在它的fit 方法中学习$n$个分量(components),并且可以把新的数据投影到学习到的这些分量上。

在应用SVD之前,PCA会集中但不会缩放每个输入数据的特征。可选参数whiten=True使得它可以将数据投影到奇异空间(singular space),同时将每一个分量缩放到单位方差。 如果下游模型对信号的各向同性(isotropy)作了强有力的假设,例如带有RBF核的支持向量机和K-means聚类算法就做了这个假定, 这样的变换通常是有用的。

下面是鸢尾属植物数据集上的例子,鸢尾属植物数据集有四个特征分量组成,将其投影到方差最大的2个维度上:

https://scikit-learn.org/stable/_images/sphx_glr_plot_pca_vs_lda_0011.png

PCA对象还提供了PCA的概率解释,该解释可以根据其解释的方差量给出数据的似然性。它还是实现了一种可用于交叉验证的评分方法:

https://scikit-learn.org/stable/_images/sphx_glr_plot_pca_vs_fa_model_selection_0011.png

案例:

2.5.1.2. 增量主成分分析(Incremental PCA)

PCA对象非常有用,但是对于大型数据集有某些限制。最大的限制是PCA仅支持批处理,这意味着所有要处理的数据必须在主存储器中进行拟合。IncrementalPCA对象使用不同的处理形式,并允许部分计算,这些计算结果几乎与PCA以小批量方式处理数据时的结果完全一样。IncrementalPCA通过以下方式可以实现核外(out-of-core)主成分分析:

  • 使用其partial_fit 方法在从硬盘或网络上顺序取来的数据块上拟合。
  • 调用它的fit方法在使用numpy.memmap的内存映射文件上。

IncrementalPCA仅存储分量和噪声方差的估计值,以便按explained_variance_ratio_的顺序递增。这就是为什么内存使用量取决于每批样品的数量,而不是数据集中要处理的样品数量的原因。

PCA一样,IncrementalPCA在应用SVD之前,它会集中但不会缩放每个输入数据的特征

https://scikit-learn.org/stable/_images/sphx_glr_plot_incremental_pca_0011.png

https://scikit-learn.org/stable/_images/sphx_glr_plot_incremental_pca_0021.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}$。

注意:参数为svd_solver='randomized'PCA,其inverse_transform方法的实现并不是transform的确切的逆变换,即使当whiten=False(default)时。

案例:

参考文献:

2.5.1.4. 内核 PCA

KernelPCA是PCA的扩展,它通过使用内核来实现非线性降维(请参阅成对度量,相似度和内核)。它具有许多应用,包括降噪,压缩和结构化预测(内核相关性估计)。KernelPCA同时支持 transforminverse_transform

https://scikit-learn.org/stable/_images/sphx_glr_plot_kernel_pca_0011.png

案例:

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

SparsePCA是PCA的一种变体,其目的抽取一组能够最好的重构数据的稀疏分量。

小批量稀疏PCA(MiniBatchSparsePCA)是 SparsePCA的一种变体,它速度更快,但准确性较低。对于给定的迭代次数,通过迭代特征集合的一小部分来达到提高的速度的目的。

主成分分析(PCA)的缺点在于,用这种方法提取的成分仅具有密集的表达式,即当表达为原始变量的线性组合时,它们具有非零系数。这会使解释变得困难。在许多情况下,真正的底层分量可以更自然地想象为稀疏向量。例如在面部识别中,每个分量可能自然地映射到面部的某个部分。

稀疏的主成分产生更简洁、可解释的表达,明确强调了样本之间的差异性来自哪些原始特征。

以下示例说明了使用稀疏PCA从Olivetti人脸数据集中提取的16个分量。可以看出正则化项是如何产生许多零的。 此外,数据的自然结构导致了非零系数的垂直相邻(vertically adjacent)。该模型并没有在数学上强制执行这一点:每个分量都是一个向量$h \in \mathbf{R}^{4096}$,没有垂直相邻性的概念,除非人性化地的可视化为64x64像素的图像。下面显示的分量看起来局部化(appear local)是数据的内在结构的影响,这种局部模式使重建误差最小化。存在几种将邻接性和不同结构类型都考虑进去的稀疏诱导范数(sparsity-inducing norms),请参见 [Jen09]。有关如何使用稀疏PCA的更多详细信息,请参见下面的“案例”部分。

pca_img spca_img

请注意,稀疏PCA问题有许多不同的表述。此处实现的是基于[Mrl09]的。待求解的优化问题是一个带有对分量的$ℓ1$惩罚项的PCA问题(字典学习(dictionary learning)):

$$ (U^, V^)=\underset{U, V}{\operatorname{arg\,min\,}}\frac{1}{2}||X-UV||2^2+\alpha||V||_1 \ \text{subject to }||U_k||_2 = 1\text{ for all }0\leq k < n{components} $$ 当训练样本比较少的时候,稀疏诱导的$ℓ1$范数还可以防止从噪声中学习分量。惩罚的程度(以及由此导致的稀疏性)可以通过参数alpha进行调节。较小的值会导致轻微的正则化因子分解,而较大的值会将多个系数收缩为零。

注意:尽管本着在线算法的精神,MiniBatchSparsePCA未实现partial_fit方法,因为该算法是沿着特征方向在线,而不是样本方向。

案例:

参考文献:

[Mrl09] “Online Dictionary Learning for Sparse Coding” J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009

[Jen09] “Structured Sparse Principal Component Analysis” R. Jenatton, G. Obozinski, F. Bach, 2009

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

TruncatedSVD 实现奇异值分解(SVD)的变体,该变体仅计算$k$最大奇异值,其中$k$是用户指定的参数。

当将截短的SVD应用于术语文档(term-document)矩阵(由CountVectorizerTfidfVectorizer返回)时,此转换称为 潜在语义分析 (LSA),因为它将此类矩阵转换为低维的“语义”空间。特别是,众所周知,LSA可以消除同义词和多义性的影响(这两者都大致意味着每个单词具有多种含义),这会导致术语文档(term-document)矩阵过于稀疏,并且在诸如余弦相似度的度量下显示出较差的相似度。

注意:LSA也被称为潜在语义索引(latent semantic indexing,LSI),尽管严格意义上是指它在持久索引中用于信息检索的目的。

从数学上讲,应用在训练集$X$上的截短SVD产生一个低秩近似(low-rank approximation)$X$: $$ X \approx X_k = U_k \Sigma_k V_k^\top $$ 经过这个操作以后,$U_k \Sigma_k^\top$是具有$k$(在API中称之为n_components)个特征的变换训练集。.

还要对测试集$X$也进行变换,我们用$V_k$乘以它:

$$ X' = X V_k $$ 注意:

自然语言处理(NLP)和信息检索(IR)文献中的LSA的大多数处理方式是交换矩阵$X$的坐标轴,使其形状为n_features × n_samples。我们以不同方式呈现LSA,使其与scikit-learn的API相匹配,但是找到的奇异值(singular values)是相同的。

TruncatedSVDPCA极为相似,但不同之处在于它工作在样本矩阵$X$上而不是它们的协方差矩阵。当从特征数值中减去 $X$的每列(每一列对应一个特征)的均值时,在得到的矩阵上应用截断SVD等价于PCA。实际上,这意味着TruncatedSVD转换器可以接受scipy.sparse矩阵,而不需要把它们变稠密,因为即使密集化(densifying)中型大小文档的集合也可能填满内存。

虽然TruncatedSVD转换器可以处理任何(稀疏)特征矩阵,但建议在tf–idf矩阵上使用它,而不是在LSA /文档处理设置中的原始频率计数上使用。特别是,应该打开子线性缩放(sublinear scaling)和逆文档频率(inverse document frequency),即 (sublinear_tf=True, use_idf=True) 以使特征数值更接近于高斯分布,补偿 LSA 对文本数据的错误假设。

案例:

参考文献:

2.5.3. 字典学习(Dictionary Learning)

2.5.3.1. 使用预先计算好的字典进行稀疏编码

SparseCoder对象是一个估计器,用来将信号变换成很多原子的稀疏线性组合,如离散小波基(discrete wavelet basis)。而这些原子来自于一个固定的预先计算好的字典中。因此,该对象不实现fit方法。该变换相当于一个稀疏编码问题:将数据表示为尽可能少的字典原子(dictionary atoms)的线性组合。字典学习的所有变体实现以下变换方法,可以通过transform_method初始化参数进行控制:

阈值处理非常快,但是不能产生准确的重建结果。它们在文献中已经显示出对分类任务有用。对于图像重建任务,正交匹配追踪可以产生最准确,无偏的重建结果。

字典学习对象通过split_code参数提供将稀疏编码结果中的正值和负值分离的可能性。当使用字典学习来提取用于监督学习的特征时,这是有用的,因为它允许学习算法将不同的权重从正加载(positive loading)分配给相应的负加载(negative loadings)的特定原子。

单个样本的分割编码具有长度2 * n_components,并使用以下规则构造:首先,计算长度为n_components的常规编码。然后,split_code的第一个n_components元素将用正常编码向量的正部分填充。分割编码的第二部分用编码向量的负部分填充,只有一个正号。因此,split_code是非负的。

案例:

2.5.3.2. 通用字典学习

字典学习(DictionaryLearning)是一个矩阵分解问题,相当于找到一个在拟合过的数据的稀疏编码中表现良好的(通常是过完备的)字典。

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

字典学习是一种优化问题,通过交替更新稀疏编码来求解。作为解决多个Lasso问题的一个解决方案,考虑到字典的固定性,然后更新字典以最好地适合于稀疏编码。

$$ (U^, V^) = \underset{U, V}{\operatorname{arg\,min\,}}\frac{1}{2} ||X-UV||2^2+\alpha||U||_1 \\text{subject to } ||V_k||_2 = 1 \text{ for all } 0\leq k < n{\mathrm{atoms}} $$ pca_img2 dict_img2

在使用这样一个过程来拟合字典之后,转换只是一个稀疏编码步骤,与所有字典学习对象共享相同的实现(请参见使用预计算好的字典来进行稀疏编码)。

也可以将字典和/或编码约束为正,以匹配数据中可能存在的约束。下面是应用不同正性约束(positivity constraints)的人脸。红色表示负值,蓝色表示正值,白色表示零。

dict_img_pos1 dict_img_pos2

dict_img_pos3 dict_img_pos4

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

https://scikit-learn.org/stable/_images/sphx_glr_plot_image_denoising_0011.png

案例:

参考文献:

2.5.3.3. 小批量字典学习

MiniBatchDictionaryLearning实现了字典学习算法的更快但不太准确的版本,该版本更适合大型数据集。

默认情况下,MiniBatchDictionaryLearning将数据划分为多个小批量(mini-batches)数据,并以在线方式通过指定次数的迭代循环对数据进行优化。但是,目前该类还没有实现停止条件。

这个估计器也实现了partial_fit,只通过在一个小批量(mini-batches)上迭代一次来更新字典。当数据从一开始就不容易获得时,或者当数据不适合全部放在内存时,这可以用于在线学习。

字典学习聚类

请注意,在使用字典学习提取表示形式(例如,用于稀疏编码)时,聚类可以是学习字典的良好中间方法。例如,MiniBatchKMeans估计器的计算效率很高,并且使用一种partial_fit方法来实现在线学习 。

https://scikit-learn.org/stable/_images/sphx_glr_plot_dict_face_patches_0011.png

案例:面部字典的在线学习

2.5.4. 因子分析(Factor Analysis)

在无监督学习中,我们只有一个数据集$X = {x_1, x_2, \dots, x_n}$。如何用数学方式描述此数据集? 一个用于描述$X$的非常简单的连续隐变量(continuous latent variable)模型如下所示: $$ x_i = W h_i + \mu + \epsilon $$ 向量$h_i$被称为“隐变量(latent variable)”,是因为它无法被观测。$ϵ$被看做是一个服从0均值协方差为$Ψ$的高斯分布的噪声项,即$\epsilon \sim \mathcal{N}(0, \Psi)$。$μ$是一个任意的实数偏移向量。这样的模型被称之为“生成式”模型,因为它描述了如何从$h_i$中产生$x_i$的。如果我们使用所有的$x_i$作为列来形成一个矩阵$X$并且所有的$h_i$作为列来形成一个矩阵$H$,那么我们可以得到下面的式子(用适当的定义$M$和$E$):

$$ \mathbf{X} = W \mathbf{H} + \mathbf{M} + \mathbf{E} $$ 换句话说,我们分解了矩阵$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相比,因子分析的主要优点是它可以独立地模拟输入空间每个方向上的方差(异方差噪声(heteroscedastic noise)):

https://scikit-learn.org/stable/_images/sphx_glr_plot_faces_decomposition_0081.png

与存在异方差噪声的概率PCA相比,这提供了更好的模型选择:

https://scikit-learn.org/stable/_images/sphx_glr_plot_pca_vs_fa_model_selection_0021.png

案例:

2.5.5.独立成分分析(ICA)

独立分量分析(Independent component analysis)将多变量信号分解为独立性最强的加性子分量。在scikit-learn中可以使用Fast ICA来实现ICA算法,ICA 通常不用于降低维度,而是用于分离叠加信号。由于 ICA 模型不包括噪声项,因此要使模型正确,必须使用白化(whitening)。这可以在内部调节白化参数或手动使用PCA的一种变体。

通常,它用于分离混合信号(称为盲源分离(blind source separation)的问题 ),如下例所示:

https://scikit-learn.org/stable/_images/sphx_glr_plot_ica_blind_source_separation_0011.png

ICA 还可以用于另一个非线性分解—寻找稀疏分量:

pca_img4 ica_img4

案例:

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

2.5.6.1. 带有Frobenius范数的NMF

NMF [1]是一种分解的替代方法,它假定数据和分量都为非负数。在数据矩阵不包含负值的情况下,NMF可以直接插入对PCA或其变体进行替换。通过优化$X$与矩阵乘积$WH$之间的距离$d$,可以将样本$X$分解为两个非负矩阵$W$和$H$。最广泛使用的距离函数是平方Frobenius范数(squared Frobenius norm),它是欧几里德范数到矩阵的推广: $$ 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 ($ρ$)参数和正则化强度参数alpha($α$)来控制L1和L2的组合。 那么先验项为:

$$ \alpha \rho ||W||1 + \alpha \rho ||H||_1+\frac{\alpha(1-\rho)}{2} ||W||{\mathrm{Fro}} ^ 2+\frac{\alpha(1-\rho)}{2} ||H||_{\mathrm{Fro}} ^ 2 $$ 正规化目标函数为:

$$ d_{\mathrm{Fro}}(X, WH)+\alpha \rho ||W||1 + \alpha \rho ||H||_1+\frac{\alpha(1-\rho)}{2} ||W||{\mathrm{Fro}} ^ 2+\frac{\alpha(1-\rho)}{2} ||H||_{\mathrm{Fro}} ^ 2 $$ NMF正则化W和H。公开函数non_negative_factorization允许通过regularization属性来进行更加精细的控制,并且可以仅正则化W,仅正则化H或同时正则化W和H。

2.5.6.2. 带有beta差异(beta-divergence)的NMF

如前面所述,最广泛使用的距离函数是平方Frobenius范数(squared 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-divergence:

$$ 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}) $$ https://scikit-learn.org/stable/_images/sphx_glr_plot_beta_divergence_0011.png

请注意,如果$\beta \in (0; 1)$,此定义无效,仅仅在$d_{KL}$和$d_{IS}$上可以分别连续扩展。

NMF使用坐标下降(cd)[5]和乘性更新(mu)[6]实现两个求解器。“ mu”求解器可以优化每个beta差异,当然包括Frobenius范数($β = 2$),(广义)Kullback-Leibler散度($β = 1$)和Itakura-Saito散度($β = 0$)。请注意,对于$\beta \in (1; 2)$,“ mu”求解器的速度明显快于其他$β$值。另请注意,使用小于0的(或0,即‘itakura-saito’ )$β$,输入矩阵不能包含零值。

‘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)

案例:

参考文献:

[1] “Learning the parts of objects by non-negative matrix factorization” D. Lee, S. Seung, 1999

[2] “Non-negative Matrix Factorization with Sparseness Constraints” P. Hoyer, 2004

[4] “SVD based initialization: A head start for nonnegative matrix factorization” C. Boutsidis, E. Gallopoulos, 2008

[5] “Fast local algorithms for large scale nonnegative matrix and tensor factorizations.” A. Cichocki, A. Phan, 2009

6(1,2) “Algorithms for nonnegative matrix factorization with the beta-divergence” C. Fevotte, J. Idier, 2011

2.5.7. 潜在狄利克雷分配(Latent Dirichlet Allocation)(LDA)

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

LDA的图形模型是一个三级生成模型:

https://scikit-learn.org/stable/_images/lda_model_graph.png

注意上述图形模型中显示的符号,可在Hoffman等人中找到(Hoffman et al. (2013)):

  • 语料库是$D$个文档的集合。
  • 一个文档是$N$个单词的序列。
  • 一个语料库有$K$个主题。
  • 图中的方框代表了重复采样。

在图形模型中,每个节点都是随机变量,并且在生成过程中起作用。阴影节点表示观察到的变量,无阴影节点表示隐藏(潜在)变量。在这种情况下,语料库中的单词是我们观察到的唯一数据。潜在变量确定语料库中主题的随机混合以及文档中单词的分布。LDA的目标是使用观察到的词来推断隐藏的主题结构。

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

  1. 对于每个主题$k∈K$,都有$\beta_k \sim\mathrm{Dirichlet}(\eta)$。这提供了单词的分布,即单词出现在主题$k$中的概率。 η对应于topic_word_prior
  2. 对于每个文档$d∈D$,绘制主题比例$\theta_d \sim \mathrm{Dirichlet}(\alpha)$。$α$对应于doc_topic_prior
  3. 对文档$d$中的每一个单词$i$:

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

  5. 绘制观察到的词 $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)$来近似它,然后优化这些变分参数$λ$,$ϕ$,$γ$,来最大化证据下界(Evidence Lower Bound)(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)$之间的KL散度。

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

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

LatentDirichletAllocation应用于“文档术语(document-term)”矩阵时,该矩阵将分解为“主题术语(topic-term)”矩阵和“文档主题(document-topic)”矩阵。尽管“文档主题(document-topic)”矩阵是被存储在模型的components_属性中,但可以调用transform方法来计算“文档主题(document-topic)”矩阵。

LatentDirichletAllocation还实现partial_fit方法。该方法是在数据可以按顺序获取时使用的。

案例:

参考文献:

另外请参见降维章节,来获取有关使用邻域分量分析进行降维的相关内容。

©2007-2019,scikit-learn开发人员(BSD许可证)。 显示此页面源码