LDA算法调研报告

article/2025/9/18 20:26:29

LDA算法调研报告

 

 

1、LDA算法概述

    本文所阐述的LDA算法全称为Latent Dirichlet Allocation(网上没有标准的中文名称,我称之为潜在狄利克雷分配算法),不是线性判别分析算法(Linear Discriminant Analysis)。LDA算法由加州伯克利大学计算机系的David M. Blei于2003年发表。目前LDA算法的应用挺广泛,2012年北京举办的SIGKDD国际会议上,在个性化推荐、社交网络、广告预测等各个领域的workshop上都提到LDA模型。LDA算法是以同样出自加州伯克利大学计算机系的Thomas Hufmann于1999年发表的PLSA(Probabilistic Latent Semantic Analysis)为基础,PLSA算法则是对芝加哥大学Scott Deerwester, Susan T. Dumais等人在1990年发表的潜在语义分析(Latent Semantic Analysis,简称LSA)算法思想的吸收。本报告稍后会对PLSA、LSA、LDA三种方法的背景和关联作介绍。

 由于LDA算法是一个用于研究语料库(corpus)的生成模型(generation model),其理论基础是一元语义模型(unigram model),也就是说,LDA算法的前提是,文档(document)可以被认为是词(word)的集合,忽略任何语法或者出现顺序关系,这个特性也被称为可交换性(Exchangeability)。本文所涉及的PLSA、LSA、LDA三种方法的分析都是在一元语义模型下进行。

本文立足于细节阐释,即在假定读者没有机器学习算法基础的前提下,通过它能迅速了解到LDA算法的思想和实现原理。虽然PLSA目前并没有在工作中被使用,但是它和LDA有很多通用的思想,而且比LDA容易理解,因而也占据较大篇幅。

 

2、三种文本分析方法

    首先统一一下名称。表1列举了LSA算法、PLSA算法、LDA算法各自的简称、全称和别称。为了方便,下文中,我们统一采用简称。

 

  表1三种算法的全称和别名

 2.1 LSA算法

在文档的空间向量模型(VSM)中,文档被表示成由特征词出现概率组成的多维向量。这种方法的好处是可以将query和文档转化成同一空间下的向量计算相似度,可以对不同词项赋予不同的权重,在文本检索、分类、聚类问题中都得到了广泛应用。但是空间向量模型的缺点是无法处理一词多义和同义词问题,例如同义词也分别被表示成独立的一维,计算向量的余弦相似度时会低估用户期望的相似度;而某个词项有多个词义时,始终对应同一维度,因此计算的结果会高估用户期望的相似度。

潜在语义分析(LSA)是对传统的空间向量模型(VSM,vector space model)的改进。通过降维,LSA将词和文档映射到潜在语义空间,从而去除了原始向量空间中的一些“噪音”(比如词的误用或者不相关的词偶尔出现在一起),解决了同义词的问题。

    降维是LSA分析的核心。具体做法,是对词项文档矩阵(也叫Term-Document矩阵,以词项(terms)为行, 文档(documents)为列,这里记为C)做SVD分解

设C一共有t行d列, 矩阵的元素为词项的TF-IDF(词频term frequency–反文档频率inverse document frequency)值。然后把的r个对角元素的前k个保留(最大的k个保留), 后面最小的r-k个奇异值置0, 得到;最后计算一个近似的分解矩阵

   

则是在最小二乘意义下C的最佳逼近,从而得到原始词项文档矩阵的一个低秩逼近矩阵。

    通过在SVD分解近似,我们将原始的向量转化成一个低维隐含语义空间中,起到了特征降维的作用。每个奇异值对应的是每个“语义”维度的权重,将不太重要的权重置为0,只保留最重要的维度信息,去掉一些“噪音”,因而可以得到文档的一种更优表示形式。

 

2.2 PLSA算法

   基于SVD的LSA相比于空间向量模型解决了同义词问题,但是其缺乏严谨的数理统计基础,而且SVD分解非常耗时。另外,LSA没能解决一词多义的问题。

Hofmann于1999年在SIGIR'99提出了基于概率统计的PLSA模型,并且用EM算法学习模型参数。在传统文本分类或聚类模型中,一篇文章(document)只有一个topic(姑且翻译成主题),而Hofmann提出,一篇文章可以有多个topic,这就是自然语言处理领域颇具开创性的Topic Model的思想。之所以说LDA算法继承了PLSA的衣钵,一个重要的原因就是LDA在文本建模中继承并且发展了Topic Model。Topic Model目前在自然语言理解和生物信息学方面都有应用。通过增加Topic Model,一个词语可以从属于多个Topic,一个Topic下也有多个词(word),这样就保证了一词多义和同义词的问题都可以在Topic Model下得到解决。按照维基百科的解释,主题模型(Topic Model)就是一类从大量的文档中发掘抽象的“主题”的统计模型。至于Topic的具体理解,有些文章将之称之为主题,有的将之解释成“一个概念,一个方面”。

另外,与LSA依赖于矩阵运算得到结果不同,PLSA算法采用的是机器学习中以概率统计为基础的生成模型(generation model)来做文本建模和理解。这里对生成模型做一下简单的介绍。生成模型,在机器学习中的定义是“显示或者隐式地对输入输出的分布建模”,参考自Bishop的《Pattern Recognition and Machine Learning》。在决策论中,有三种决策方式,分别是对联合概率分布建模、对后验概率建模、和找判别函数。判别模型属于第二种,对后验概率建模,将每个观察值划分到一个类。判别函数法是思路最简单的,直接把观察值通过函数映射到分类。而生成模型,是对先验概率和类条件密度函数建模,然后标准化,进而得到后验概率估计。Bishop的《Pattern Recognition and Machine Learning》提到,决策论中,对于分类问题采用的决策准则是,如果决策目标是使观测值被误分类的概率最小,那么应该选择相应的后验概率最大的分类作为决策。

 

Hofmann提出的PLSA的概率图模型如下

 其中D代表文档,Z代表隐含类别或者主题,W为观察到的单词,表示单词出现在文档的概率,表示文档di中出现主题zk下的单词的概率,给定主题Zk出现单词Wj的概率。并且每个主题在所有词项上服从Multinomial (多项式)分布,每个文档在所有主题上服从Multinomial (多项式)分布。

 

    关于这里的两个关于多项式分布的选择,是有其理论依据的。以每个主题在所有词项上服从Multinomial (多项式)分布为例,主要是基于:

1)在同一个主题下,每个词项的产生都可以看成一次从该主题下的所有候选词项中随机挑选出一个词项的试验。不难发现,试验之间是相互独立的。在一元语义模型下,词项之间的顺序不影响其联合分布概率,也就是如果在一个主题下选择了V个词项,那么。举一个例子,如果先挑选词项w1,后挑选词项w2,其概率为,反过来,先挑选词项w2,后挑选词项w1,其概率为,不难看到

2)每个词项都需只能从从属于该主题的词项中选择。这一条在Topic Model下是很自然的。

3)在不同的试验中,同一个词项被选中的概率是相同的。这一条是在使用多项式分布的时候需要注意的,如果不能保证,多项式分布满足不了。但是这句话不要被错误理解成“在同一次的试验中,不同词项被选中的概率是相同的”。

 

整个文档的生成过程是这样的:

(1) 以的概率选中文档;

(2) 以的概率选中主题;

(3) 以的概率产生一个单词。

我们可以观察到的数据就是对,而zk是隐含变量。的联合分布是

 

 

分别对应两组Multinomial 分布,我们需要估计这两组分布的参数。PLSA采用EM算法来做估计。

   需要说明的是,PLSA有时会出现过拟合的现象。所谓过拟合(Overfit),是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据。此时我们就叫这个假设出现了Overfit的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。PLSA通过采用tempering heuristic来平滑参数,但是实际应用时,即使采用此方法,过拟合现象仍可能发生。

这里补充一个小插曲,Hofmann在他2004年的论文Latent semantic models for collaborative filtering中指出,他自然知道弄成LDA这种fully bayesian model更漂亮,可是为了避免高时间复杂度,他使用了tempered EM。

PLSA是LSA的概率学延伸,这样说的依据是,LSA的核心思想是降维,只是基于SVD分解的LSA方法是借助于矩阵分解降维,而PLSA是借助于引进Topic层降维。

PLSA中,求解两个多项式分布的参数,是求解的关键。注意到,对应每个文档在所有主题上所服从的多项式分布的参数,而di就表示第i个文档,所以我们可以看到这个参数的规模是随着文档数的增加而增加的。在下文中,我们会看到LDA算法的参数是和文档数无关的,只和Topic个数以及以及字典中term个数有关。

 

表2   LSA和PLSA的相同点和不同点


  

2.3 LDA算法与PLSA的关联和区别

   PLSA在文档级别没有提供一个概率模型,PLSA中每篇文档表示成一系列的主题数目,对于这些数目没有生成概率模型,将导致两个问题:

1) 模型的参数将随着语料库(corpus)的大小线性增长,继而导致过拟合的严重问题。

2) 不清楚如何对于训练集外的文档进行主题分配。

   关于“参数线性增长是如何导致过拟合”的问题,现有的论文和资料都没有做过详细解释,其实这里只举一个小例子就可以阐明。在基于最小二乘法,采用多项式拟合数据点的时候,可能使用的多项式次数高以后,最小二乘误差会最小的,但是,多项式的次数选取的过高,会出现严重的过拟合问题,在对后续数据点做预测的时候完全不可用。而这里的多项式的次数过高,会直接造成拟合时采用的参数过多(拟合一元N次多项式需要N+1个参数),实际上也是参数过多造成数据拟合时出现过拟合的一种情形。

   鉴于PLSA的局限性,LDA算法应运而生。前面提到,LDA算法继承了PLSA中采用生成模型的思路,延续了Topic Model的思想,自然LDA也具有解决一词多义和同义词问题的能力。此外,LDA也延续了PLSA中文档、主题、词项的生成过程,认为每个主题在所有词项上服从Multinomial 分布,每个文档在所有主题上服从Multinomial 分布,采用多项式分布的合理性在2.2中已经详尽说明。   

LDA的参数规模只取决于Topic个数和字典中term总数。LDA在document到topic一层引入了Dirichlet分布,这是它优于PLSA的地方,使得模型参数的数量不会随着语料库的扩大而增多。

这里取Dirichlet分布的依据是什么?首先需要说明,Dirichlet分布是多项分布的共轭先验(Conjugate priors),也就是说,先验分布为Dirichlet分布,似然函数为多项分布,那么后验分布仍为Dirichlet分布(《模式识别与机器学习》117页有证明)。但是,共轭先验又有什么好处呢?David M. Blei在文章里面说,这样的好处是fancy,或者说,“好算”。或许,这个好算也不够准确,准确的说法是“能算”,也就是在共轭的前提下,这个问题可以通过编程实现求解。无论是Variational inference方法还是Gibbs Sampling都是在前面共轭的条件保证下的计算方法。所以,如果没有Dirichlet分布,后面这些推导可能都不知道怎么算。LDA把一个几乎没法求解的东西解出来了,而且极大的推动了变分推断这个东西。因此,在很多LDA的资料里都会不加解释地说,“选择Dirichlet分布是因为其共轭特性大大减小了计算量”。

PLSA的主题是有观察到的数据,通过最大似然估计的方法得到的,也就是从经验获取的。而LDA是假设主题服从Dirichilet分布,然后从观察数据中,优化参数,得到后验参数,使用的思想是最大后验概率。前者是频率学派的思想,后者是贝叶斯学派的思想。

 

 


 

参考文献

[1]Patter Recognition and Machine Learning ,Christopher M. Bishop

[2]Latent Dirichlet Allocation,David M. Blei,Journal of Machine Learning Research 3 (2003) 993-1022

[3]Parameter estimation for text analysis,Gregor Heinrich

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/ds64be7N.shtml

相关文章

【机器学习】LDA算法原理

问题 线性判别分析(Linear Discriminant Analysis,LDA)是机器学习中常用的降维方法之一,本文旨在介绍LDA算法的思想,其数学推导过程可能会稍作简化。 LDA的思想 ● LDA是一种线性的、有监督的降维方法,即每个样本都有对应的类别标签(这点和PCA不同)。 ● 主要思想:…

Spark机器学习-LDA算法09

LDA算法 LDA即文档主题生成模型,该算法是一种无监督学习 将主题对应聚类中心,文档作为样本,则LDA也是一种聚类算法 该算法用来将多个文档划分为K个主题,与Kmeans类似 LDA是一种基于概率统计的生成算法 LDA算法—种常用的主题模型,可以对文档主题进行聚类,同样也可以用…

LDA算法实现鸢尾花数据集降维

目录 1. 作者介绍2. LDA降维算法2.1 基本概念2.2 算法流程 3. LDA算法实现3.1 数据集介绍3.2 代码实现3.3 结果展示 1. 作者介绍 唐杰,男,西安工程大学电子信息学院,2022级研究生 研究方向:机器视觉与人工智能 电子邮件&#xff…

秒懂---LDA算法

线性判别分析LDA原理总结 在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结。这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结。LDA在模式识别领域&…

基于Sklearn实现LDA算法

文章目录 一、LDA算法二、sklearn实现LDA三、结果如图四、总结五、参考 一、LDA算法 1.线性判别分析(Linear Discriminant Analysis, LDA)方法常被用于数据预处理中的降维(dimensionality reduction)步骤。LDA在保证良好的类别区…

LDA算法推导

LDA算法是什么 简单地说LDA算法就是向低维度投影,让同一类别数据投影点更接近,不同类别数据点距离更远。 LDA原理 定义,已知 我们要把两类数据都投影到w直线上。 让不同类别的数据的类别中心之间的距离尽可能的大, 同一种类别数…

线性判别分析LDA原理总结

转自http://www.cnblogs.com/pinard/p/6244265.html 在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结。这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总…

线性判别分析(Linear Discriminant Analysis, LDA)算法分析

LDA算法入门 一. LDA算法概述: 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的。性鉴别分析的基本思想是将高维的模式样本投影到…

机器学习笔记17-LDA算法

1. LDA算法简介 LDA(线性判别式分析 Linear Discriminant Analysis)属于机器学习中的监督学习算法,常用来做特征提取、数据降维和任务分类。在人脸识别、人脸检测等领域发挥重要作用。LDA算法与PCA算法都是常用的降维技术。二者的区别在于&a…

数据结构层次遍历二叉树

2022.11.19 计算二叉树的深度和节点个数 任务描述相关知识编程要求测试说明C/C代码 任务描述 本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树。 相关知识 为了完成本关任务,你需要掌握:1.队列基本操作,2.二叉…

树的层次遍历

二叉树的前序、中序、后序遍历我想大家应该都很熟悉了,那我们今天就来讲一下二叉树的层次遍历。 二叉树的前序、中序、后序遍历需要用到栈(递归的过程也就是一个栈),层次遍历需要借助队列这个数据结构。 层次遍历的思路 我们给…

层次遍历_树

哈喽大家好,这里是蒟蒻hanyiyang的博文,今天,我来给大家,介绍一个关于图的算法,希望能帮助到大家!!! 层次遍历 大家来看一看上面这个图,为什么要说这是层次遍历呢&…

树的应用 —— 二叉树的遍历【层次遍历、遍历序列还原树】

树的应用 —— 二叉树的遍历【层次遍历、遍历序列还原树】 【层次遍历】 二叉树的遍历一般有先序遍历、中序遍历和后序遍历,除了这三种遍历,还有另一种遍历方式——层次遍历,即按照层次的顺序从左向右进行遍历。 一棵树如下图所示。 层次…

二叉树:层次遍历算法(自上而下,从左到右)

层次遍历(LevelOrder)就是默认为自上而下,从左到右,一层一层进行遍历, 层次遍历需要借助队列来完成, 队列:先进先出(FIFO)。 分析:如图有一棵二叉树&#xff…

MATLAB符号运算——微分

微分 微分在数学中的定义:由函数Bf(A),得到A、B两个数集,在A中当dx靠近自己时,函数在dx处的极限叫作函数在dx处的微分,微分的中心思想是无穷分割。 在MATLAB中计算微分 函数:diff 调用格式: …

matlab中常用符号

在使用MATLAB的过程中,经常需要对输出图形中的变量进行标注,其中经常遇到的难题就是如何标注各种上标、下标、斜体、黑体、箭头、上圆圈、正负号等特殊符号,以及如何标注特殊的数学符号。这里第一机电网给大家总结一下,希望对大家…

MATLAB符号运算(七)

目录 1、实验目的: 2、实验内容: 1、实验目的: 1)掌握定义符号对象和创建符号表达式的方法; 2)掌握符号运算基本命令和规则; 3)掌握符号表达式的运算法则以及符号矩阵运算&#xf…

MATLAB符号运算小技巧

1. 引言 MATLAB具备强大的符号运算功能。符号运算就是所谓的计算机代数,通俗的说就是利用计算机进行数学公式的推导。这篇文章主要总结几个MATLAB进行符号运算时的小技巧,这也是作者在进行技术研究过程中实际碰到的一些难题,希望后来者能少走…

Matlab-运算符

运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。MATLAB主要用于整个矩阵和阵列的操作。因此,MATLAB中的运算符既可用于标量数据也可用于非标量数据。MATLAB允许以下类型的基本操作 算术运算符 关系运算符 逻辑运算符 按位运算符 集合运算符…

matlab常见符号运算(计算导数,积分、符号求和等))

符号运算的建立 sym 函数用来建立单个符号量,一般调用格式为: 符号变量 sym(A) 参数 A 可以是一个数或数值矩阵,也可以是字符串 syms 命令用来建立多个符号量,一般调用格式为: syms 符号变量1 符号变量2 … 符号变量…