LDA主题模型笔记

article/2025/11/10 14:18:49

Table of Contents

1、写在前面

2、数学知识

3、文本建模

4.LDA主题模型实战


1、写在前面

在机器学习领域,关于LDA有两种含义,一是线性判别分析(Linear Discriminant Analysis),是一种经典的降维学习方法;一是本文要讲的隐含狄利克雷分布(Latent Dirichlet Allocation),是一种概率主题模型,主要用来文本分类,在NLP领域有重要应用。LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,用来推测文档的主题分布。它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题分布后,便可以根据主题分布进行主题聚类或文本分类

2、数学知识

第一次接触LDA的同学肯定是一头雾水的,因为相比于其他的机器学习算法,LDA模型涉及到很多数学知识与公式,这也许是LDA晦涩难懂的原因。在本小节中会介绍LDA中所需要的数学应用,对后面进一步理解LDA模型打好基础。

要理解LDA, 涉及的先验知识有一下几种:

  1. 一个函数:Gamma函数
  2. 四个分布:二项分布、多项分布、beta分布、Dirichlet分布
  3. 一个概念和一个理念:共轭先验和贝叶斯框架
  4. 两个模型:pLSA和LDA
  5. 一个采样:Gibbs sampling

2.1、 Gamma函数

Gamma函数的定义为:

\Gamma(x) = \int_0^\infty t^{x-1}e^{-t}dt

对上式进行分部积分之后可以发现Gamma函数具有如下的性质:

\Gamma(x+1) = x\Gamma(x)

可知Gamma函数可以看成是阶乘函数在实数上的推广:

\Gamma(n) = (n-1)!

2.2、二项分布

要解释二项分布,首先要搞清楚伯努利分布(又称为两点分布或者0-1分布),它是一个离散型的随机分布,其中的随机变量只有两种取值,{0,1}。而二项分布就是对伯努利分布重复n次。举个栗子,把投掷一次硬币这个试验认为是伯努利分布,则投掷n次硬币的试验就可以被认为是二项分布。二项分布的概率密度公式为:

P(K = k) = \begin{pmatrix} n\\ k\\ \end{pmatrix}p^k{(1-p)}^{n-k}

2.3、多项分布

从二项分布到多项分布,只是从随机变量的取值由两种扩展为多维。

多项分布是指单次实验中的随机变量的取值不再是0-1的,而是有多重离散值(1,2,3....当然也不一定是整数)。举个栗子,投掷有六个面的骰子试验。

多项分布的概率密度公式为:

P(x_1, x_2, ..., x_k; n, p_1, p_2, ..., p_k) = \frac{n!}{x_1!...x_k!}{p_1}^{x_1}...{p_k}^{x_k}

其中x1,x2...是指随机变量的取值,而p1,p2...是指取到相对应随机变量的概率。

2.4、共轭先验分布

在贝叶斯概率理论中,如果后验概率P(θ|x)和先验概率p(θ)满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。

\begin{align} P(\theta | x) = \frac{P(\theta, x)} {P(x)} \end{align}

共轭的意思是,以Beta分布和二项式分布为例,数据符合二项分布的时候,参数的先验分布和后验分布都能保持Beta分布的形式,这种形式不变的好处是,我们能够在先验分布中赋予参数很明确的物理意义,这个物理意义可以延续到后续分布中进行解释,同时从先验变换到后验过程中从数据中补充的知识也容易有物理解释。

2.5、Beta分布

对于参数a>0,b>0,取值范围为[0,1]的随机变量x的概率密度函数为:

\begin{align} f(x; \alpha, \beta) = \frac{1}{B(\alpha, \beta)} x^{\alpha - 1} {(1-x)}^{\beta-1} \end{align}

其中,

\begin{align} \frac{1}{B(\alpha, \beta)} = \frac{\Gamma(\alpha + \beta)}{\Gamma(\alpha)\Gamma(\beta)} \end{align}

对比二项分布公式可以发现:Beta分布是二项分布的共轭先验分布。

2.6、Dirichlet分布

Dirichlet分布是Beta分布在高维上的推广,其公式为:

\begin{align} f(x_1, x_2, ..., x_k; \alpha_1, \alpha_2, ..., \alpha_k) = \frac{1}{B(\alpha)}\prod_{i=1}^{k}{x_i}^{\alpha^i-1} \end{align}

其中:

\begin{align} B(\alpha) = \frac{\prod_{i=1}^{k}\Gamma(\alpha^i)}{\Gamma(\sum_{i=1}^{k}\alpha^i)}, \sum_{i=1}^{k}x^i = 1 \end{align}

根据Beta分布、二项分布、Dirichlet分布、多项式分布的公式,我们可以得出结论:Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

2.7、MCMC和Gibbs sampling

在现实应用中,我们很多时候很难精确求出精确的概率分布,常常采用近似推断方法。近似推断方法大致可分为两大类:第一类是采样(Sampling), 通过使用随机化方法完成近似;第二类是使用确定性近似完成近似推断,典型代表为变分推断(variational inference).

留坑待补...

3、文本建模

ok,介绍完数学知识,下面来到了本文的重点,LDA模型。在这之前,会循序渐进地介绍几个基础模型:Unigram model、mixture of unigrams model,以及跟LDA最为接近的pLSA模型。

为了后续描述方便,首先定义一些变量:

  • 表示词,表示所有单词的个数(固定值)
  • 表示主题,是主题的个数(预先给定,固定值)
  • 表示语料库,其中的是语料库中的文档数(固定值)
  • 表示文档,其中的表示一个文档中的词数(随机变量)

3.1、 Unigram Model

在Unigram Model中,我们采用词袋模型,假设了文档之间相互独立,文档中的词汇之间相互独立。假设我们的词典中一共有 V 个词 \nu_1, \nu_2, \cdots, \nu_V ,那么最简单的 Unigram Model 就是认为上帝是按照如下的游戏规则产生文本的:

  • 1. 上帝只有一个骰子,这个骰子有V面,每个面对应一个词,各个面的概率不一;
  • 2. 每抛掷一次骰子,抛出的面就对应的产生一个词;如果一篇文档中N个词,就独立的抛掷n次骰子产生n个词;

用公式来表示的话也就是   

3.2、 Mixture of Unigram Model

相比于unigram model,mixture of unigram model引入了一个“主题”参数作为中间量来链接文档和词语。

该模型的生成过程是:

给某个文档先选择一个主题,再根据该主题生成文档,该文档中的所有词都来自一个主题。假设主题有,生成文档的概率为:

3.3、 pLSA

在上面的Mixture of unigrams model中,我们假定一篇文档只有一个主题生成,可实际中,一篇文章往往有多个主题,只是这多个主题各自在文档中出现的概率大小不一样。比如介绍一个国家的文档中,往往会分别从教育、经济、交通等多个主题进行介绍。那么在pLSA中,文档是怎样被生成的呢?
 

我们可以用以上的骰子模型来模拟PLSA生成一片文档的过程:

  1. 现有两种类型的骰子,一种是doc-topic骰子,每个doc-topic骰子有K个面,每个面一个topic的编号;一种是topic-word骰子,每个topic-word骰子有V个面,每个面对应一个词;
  2. 现有K个topic-word骰子(对应doc-topic骰子的K个面),每个骰子有一个编号,编号从1到K;
  3. 生成每篇文档之前,先为这篇文章制造一个特定的doc-topic骰子,重复如下过程生成文档中的词:
  •  投掷这个doc-topic骰子,得到一个topic编号z;
  • 选择K个topic-word骰子中编号为z的那个,投掷这个骰子,得到一个词;

重复至完成一篇文档所需的词语数。在这个过程中,我们并未关注词和词之间的出现顺序,所以pLSA是一种词袋方法。

在这里,我们定义:

  • 表示海量文档中某篇文档被选中的概率。
  • 表示词在给定文档中出现的概率。
  • 表示具体某个主题在给定文档下出现的概率。
  • 表示具体某个词在给定主题下出现的概率,与主题关系越密切的词,其条件概率越大。

利用上述定义好的概率,我们可以按照如下的步骤得到‘文档-词语’的生成模型:

  1. 按照概率选择一篇文档
  2. 选定文档后,从主题分布中按照概率选择一个隐含的主题类别
  3. 选定后,从词分布中按照概率选择一个词

简而言之,pLSA的生成文档过程可以理解为先选定文档生成主题,再确定主题生成词语。

但是如果我们现在的情况是,已知一篇文档,想要确定这个已存在的文档其主题分布是什么样的。这便是主题建模(文档生成模型的逆过程)的目的:自动地返现文档几种的主题分布。即文档d和单词w是可被观测到的,但是主题确实隐藏的。

由上分析,对于任意一片给定文档,其是可以计算的。从而可以根据大量已知文档的文档-词语信息,训练出文档-主题和主题-词语,如下公式所示:

故可以得到每个词语的生成概率为:

 由于可事先计算求出,未知,所以就是我们要估计的参数(值),通俗点说,就是要最大化这个θ

    用什么方法进行估计呢,常用的参数估计方法有极大似然估计MLE、最大后验证估计MAP、贝叶斯估计等等。因为该待估计的参数中含有隐变量z,所以我们可以考虑EM算法

关于EM算法,主要是可以分为E-step和M-step,这里就不再详细论述。可以参考PRML或者李航老师的小蓝书。

3.4、 LDA模型

从pLSA模型的分析中可以看出,pLSA模型的样本随机,参数虽未知单固定,属于频率派思想。

而在LDA模型中,样本固定,参数未知但不固定,是个随机变量,服从一定的分布,所以LDA模型属于贝叶斯派。

以上就是pLSA和LDA主要的区别,所以可以认为LDA就是在PLSA的基础上套上了贝叶斯框架(具体来说就是多加了两个先验参数)

废话不多说,直接上LDA模型生成文档的套路:

  1. 按照先验概率选择一篇文档
  2. 从狄利克雷分布(即Dirichlet分布)中取样生成文档 的主题分布,换言之,主题分布由超参数为的Dirichlet分布生成;
  3. 从主题的多项式分布中取样生成文档第 j 个词的主题
  4. 从超参数为的狄利克雷分布(即Dirichlet分布)中取样生成主题对应的词语分布,换言之,词语分布由参数为的Dirichlet分布生成;
  5. 从词语的多项式分布中采样最终生成词语 

可以看出,LDA 在 PLSA 的基础上,为主题分布和词分布分别加了两个 Dirichlet 先验。

我们仍然以上面骰子模型举例说明,在PLSA中,我们会以固定的概率来抽取一个主题词,比如0.5的概率抽取教育这个主题词,然后根据抽取出来的主题词,找其对应的词分布,再根据词分布,抽取一个词汇。由此,可以看出PLSA中,主题分布和词分布都是唯一确定的。但是,在LDA中,主题分布和词分布是不确定的,LDA的作者们采用的是贝叶斯派的思想,认为它们应该服从一个分布,主题分布和词分布都是多项式分布,因为多项式分布和狄利克雷分布是共轭结构,在LDA中主题分布和词分布使用了Dirichlet分布作为它们的共轭先验分布。所以,也就有了一句广为流传的话 -- LDA 就是 PLSA 的贝叶斯化版本。下面两张图片很好的体现了两者的区别:

 

在PLSA和LDA的两篇论文中,使用了下面的图片来解释模型,它们也很好的对比了PLSA和LDA的不同之处。

pLSA

左图是PLSA,右图是LDA,其中,阴影圆圈表示可观测变量,非阴影圆圈表示隐变量,箭头表示两变量间的条件依赖性,方框表示重复抽样,方框右下角表示重复抽样次数,Φ表示词分布,Θ表示主题分布, 是主题分布Θ的先验分布(即Dirichlet 分布)的参数,是词分布Φ的先验分布(即Dirichlet 分布)的参数,N表示文档的单词总数,M表示文档的总数。

   所以,对于一篇文档d中的每一个单词,LDA根据先验知识确定某篇文档的主题分布θ,然后从该文档所对应的多项分布(主题分布)θ中抽取一个主题z,接着根据先验知识确定当前主题的词语分布ϕ,然后从主题z所对应的多项分布(词分布)ϕ中抽取一个单词w。然后将这个过程重复N次,就产生了文档d。

LDA参数估计:Gibbs采样

  类似于pLSA,LDA的原始论文中是用的变分-EM算法估计未知参数,后来发现另一种估计LDA未知参数的方法更好,这种方法就是:Gibbs Sampling,有时叫Gibbs采样或Gibbs抽样,都一个意思。Gibbs抽样是马尔可夫链蒙特卡尔理论(MCMC)中用来获取一系列近似等于指定多维概率分布(比如2个或者多个随机变量的联合概率分布)观察样本的算法。

关于MCMC的细节留坑....

LDA训练

训练的过程:

  • 1. 对语料库中的每篇文档中的每个词汇\omega,随机的赋予一个topic编号z
  • 2. 重新扫描语料库,对每个词\omega,使用Gibbs Sampling公式对其采样,求出它的topic,在语料中更新
  • 3. 重复步骤2,直到Gibbs Sampling收敛
  • 4. 统计语料库的topic-word共现频率矩阵,该矩阵就是LDA的模型;

根据这个topic-word频率矩阵,我们可以计算每一个p(word|topic)概率,从而算出模型参数 \vec \varphi_1, \cdots, \vec \varphi_K , 这就是那 K 个 topic-word 骰子。而语料库中的文档对应的骰子参数 \theta_1, \cdots, \theta_M 在以上训练过程中也是可以计算出来的,只要在 Gibbs Sampling 收敛之后,统计每篇文档中的 topic 的频率分布,我们就可以计算每一个 p(topic|doc) 概率,于是就可以计算出每一个 \theta_m 。由于参数 \theta_m 是和训练语料中的每篇文档相关的,对于我们理解新的文档并无用处,所以工程上最终存储 LDA 模型时候一般没有必要保留。通常,在 LDA 模型训练的过程中,我们是取 Gibbs Sampling 收敛之后的 n 个迭代的结果进行平均来做参数估计,这样模型质量更高

4.LDA主题模型实战

上面讲了那么多的LDA原理,尽量理解,有时间可以自己从底层开始写LDA框架,但是现在已经有很多成熟的LDA给我们写好了,也就咩必要重复造轮子。下面我们利用gensim提供的LDA接口来看一下主题模型的效果。(像这种试验性质的跑算法,推荐用notebook,可以实时看到每一步的结果)

以上~


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

相关文章

LDA 主题模型

背景 我们生活中总是产生大量的文本,分析这些观察到的语料库是如何生成的就需要对文本进行建模。常见的文本建模方法包括:Unigram、PLSA、LDA 、词向量模型(CBOW、Skip-gram)等。LDA模型是一种主题模型(topic model&a…

lda php,LDA主题分析代码实现

主题文本分析: 首先读取txt文本,并删除stop_list中存放的停止词汇 f open(..\\LDA_test.txt) texts [[word for word in line.strip().lower().split() if word not in stop_list] for line in f] print(Text ) pprint(texts)  #输出格式处理好的文本…

详解 LDA

详解 LDA 详解 LDA基本概念什么是LDALDA 核心思想LDA 简单二分类实例 实现步骤(python)第一步 标准化处理第二步 计算每一类别特征的均值向量第三步 计算类间散布矩阵S(B)和类内散布矩阵S(W)第四步 计算矩阵S(W)^(-1)S(B)的特征值和对应的特征向量第五步…

LDA 指南

『本文转自:https://wdxtub.com/2017/05/03/lda-guide/』 LDA 作为文本分析中非常有用的算法,无论是在学术界还是工业界都已被广泛运用。本文是写给自己的 LDA 理解指南。 更新历史 2017.05.03: 完成初稿 关于 LDA 算法,网上的资料不胜枚举…

LDA

关于降维算法 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表…

LDA详解

【几个问题待解决:1.LDA的先计算联合概率体现在哪里 2.对于theta 的采样的理解,下文中的theta1 ,theta2等其实是指theta向量中的第一个,第二个等,也就是不同文章的不同单词的主题,固定其他,分别…

LDA的通俗理解

1.PLSA模型 在讲解LDA模型之前,与LDA模型最为接近的便是下面要阐述的这个pLSA模型,给pLSA加上贝叶斯框架,便是LDA。 1.1什么是pLSA模型 我们假定一篇文档只由一个主题生成,可实际中,一篇文章往往有多个主题&#xff…

LDA模型详解

LDA是自然语言处理中非常常用的一个主题模型,全称是隐含狄利克雷分布(Latent Dirichlet Allocation),简称LDA。作用是将文档集中每篇文档的主题以概率分布的形式给出,然后通过分析分到同一主题下的文档抽取其实际的主题…

机器学习——LDA(线性判别分析)与人脸识别

忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 目录 系列文章目录 一、LDA的概念与原理 1.LDA简介 2.LDA算法模型 3.LDA的不足与优化 二、LDA运用于人脸识别 1.预处理 1…

线性判别分析(LDA)详解

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 目录 一、LDA简介 二、数学原理(以二分类为例子) 1、设定 2、每一类的均值和方差 3、目标函数 4、目标…

LDA算法——线性判别

目录 一、前言 二、什么是LDA? 三、LDA原理 1.二分类问题 2.多分类问题 3.几点说明 四、算法实现 一、前言 之前我们已经介绍过PCA算法,这是一种无监督的降维方法,可以将高维数据转化为低维数据处理。然而,PCA总是能适用吗&…

主题模型:LDA原理详解与应用

LDA算法简介: LDA是一种基于贝叶斯思想的无监督的聚类算法,广泛用于文本聚类,文本分析,文本关键词等场景。具体的,算法 的输入是一个文档的集合D{d1, d2, d3, ... , dn},同时还需要主题Topic的类别数量m&a…

LDA主题模型简介及Python实现

一、LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。 LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来…

制作属于自己的个人博客-超详细教程

SpringBoot个人博客 一.博客效果预览 博客首页预览 博客详情预览 博客评论区预览 博客底部栏预览 关于页面预览 二.博客效果在线预览 http://blog.ShaoxiongDu.top 三.项目技术 后端SpringBoot框架 分为控制层(Controller) 业务层(Service) 数据持久层(Dao) 按照Spring…

如何搭建个人博客

新的安装方式:(强烈推荐,简单方便) 利用dockernginx配置halo博客 先碎碎念一下,最近在学习springboot项目,在b站跟着up主研究如何写一个简易的博客来着,后来发现可以直接简易的搭建一个博客(都不用写代码&a…

使用 nodejs 搭建个人博客

"使用nodejs搭建自己的个人博客" 说明运行后端 node 模块后端框架采用的是 express 框架进行接口构建,具体解释如下:数据库参数配置评论邮箱提示付费文件下载配置(支付宝)评论语句检测 关于跨域问题的解决 说明 使用no…

超详细图解:如何使用 WordPress搭建一个个人博客?

前两天我用WordPress 给自己搭建了一个网站,整个过程非常的顺利,体验非常地好,于是我就整个过程、以及其中的一些搭建心得,记录下来。 如果你也正好有搭建个人网站的想法,那么本文会给你一个参考,也许看了这…

个人博客网站的设计与实现

/ 前话 / 纯手工敲代码,代码结构简单,divcss布局html静态个人博客首页网页设计,dreamwaver和hb都可以编辑,文件结构包含了css、fonts、images、js和html,运用html5技术,包括nav标签、header标签和footer标签…

个人博客系统毕业设计开题报告

本文给出的是本科生个人博客系统的毕业设计开题报告,仅供参考!(具体模板和要求按照自己学校给的要求) 毕业设计开题报告 一、选题意义二、博客系统概述三 、毕业设计研究方案四、功能结构图五、进度安排六、参考文献 一、选题意义…

基于HTML个人博客网站项目的设计与实现——个人博客作品展示6页 HTML+CSS

Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 个人博客网站 | 个人主页介绍 | 个人简介 | 个人博客设计制作 | 等网站的设计与制作 | 大学生个人HTML网页设计作品 | HTML期末大学生网页设计作业 HTML:结构 CSS&…