LDA概率主题模型
LDA
这里简单的介绍一下LDA的另一种身份,概率主题模型
隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)隐含狄利克雷分布(英语:Latent Dirichlet allocation,简称LDA),是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出。同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。
LDA首先由 David M. Blei、吴恩达和迈克尔·I·乔丹于2003年提出[1],目前在文本挖掘领域包括文本主题识别、文本分类以及文本相似度计算方面都有应用。
维基百科
e~,比较抽象啊。。
举个栗子:
一般写一篇文章,常规的思路就是:
- 给几个主题,然后以一定的概率选择某个或者某几个,俗称先定题
- 对于每个主题,再去以一定的概率去选择词去详细说明某个主题,俗称描述主题
- ok一篇文章生成了~
那LDA正好就是上述过程反过来,已知一篇文章了,但是需要确定这篇文章的主题。
步骤
从狄利克雷分布\(\alpha\) 中取样生成文档i的主题分布\(\theta _{i}\)
从主题的多项式分布\(\theta _{i}\)中取样生成文档i第j个词的主题\(z_{{i,j}}\)
从狄利克雷分布\(\beta\) 中取样生成主题\(z_{{i,j}}\)的词语分布\(\phi _{{z_{{i,j}}}}\)
从词语的多项式分布\(\phi _{{z_{{i,j}}}}\)中采样最终生成词语\(w_{{i,j}}\)
其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。此外,LDA的图模型结构如下图所示(类似贝叶斯网络结构):
主题模型
主题模型(Topic Model)在机器学习和自然语言处理等领域是用来在一系列文档中发现抽象主题的一种统计模型。直观来讲,如果一篇文章有一个中心思想,那么一些特定词语会更频繁的出现。比方说,如果一篇文章是在讲狗的,那“狗”和“骨头”等词出现的频率会高些。如果一篇文章是在讲猫的,那“猫”和“鱼”等词出现的频率会高些。而有些词例如“这个”、“和”大概在两篇文章中出现的频率会大致相等。但真实的情况是,一篇文章通常包含多种主题,而且每个主题所占比例各不相同。因此,如果一篇文章10%和猫有关,90%和狗有关,那么和狗相关的关键字出现的次数大概会是和猫相关的关键字出现次数的9倍。一个主题模型试图用数学框架来体现文档的这种特点。主题模型自动分析每个文档,统计文档内的词语,根据统计的信息来断定当前文档含有哪些主题,以及每个主题所占的比例各为多少。
主题模型最初是运用于自然语言处理相关方向,但目前以及延伸至例如生物信息学的其它领域。维基百科
几个重要分布
二项分布
重复n次的伯努利实验,就是0~1分布,\(X \sim b(n, p)\)
多项分布
是二项分布扩展到多维的情况。多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3...,k)。比如投掷5个面的骰子实验,N次实验结果服从K=5的多项分布\(\sum_{i=1}^{k} p_{i}=1, p_{i}>0\)
共轭先验分布
贝叶斯里面的先验分布和后验分布
参考这个的先验概率和后验概率难逃贝叶斯的宠幸
Beta分布
二项分布的共轭先验分布。给定参数 α>0 和 β>0,取值范围为[0,1]的随机变量 x 的概率密度函数:
\(f(x ; \alpha, \beta)=\frac{1}{B(\alpha, \beta)} x^{\alpha-1}(1-x)^{\beta-1}\)
\(\frac{1}{B(\alpha, \beta)}=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha) \Gamma(\beta)}\)
\(\Gamma(z)=\int_{0}^{\infty} t^{z-1} e^{-t} d t\)
这便是所谓的gamma函数cnblogs
狄利克雷分布
\(f\left(x_{1}, x_{2}, \ldots, x_{k} ; \alpha_{1}, \alpha_{2}, \ldots, \alpha_{k}\right)=\frac{1}{B(\alpha)} \prod_{i=1}^{k} x_{i}^{\alpha^{i}-1}\)
\(B(\alpha)=\frac{\prod_{i=1}^{k} \Gamma\left(\alpha^{i}\right)}{\Gamma\left(\sum_{i=1}^{k} \alpha^{i}\right)}, \sum x_{i}=1\)
\(\operatorname{Dir}(\vec{p} | \vec{\alpha})+\operatorname{Mult} \operatorname{Count}(\vec{m})=\operatorname{Dir}(p | \vec{\alpha}+\vec{m})\)
直接上公式不太好理解
模型
定义变量cnblogs
\(w\) 表示词,\(V\) 表示所有单词的个数(固定值)。
\(z\) 表示主题,\(k\) 是主题的个数(预先给定,固定值)。
\(D=(W_1,...,W_M)\) 表示语料库,其中的\(M\)是语料库中的文档数(固定值)。
\(W=(w1,w2,...,w_N)\) 表示文档,其中的\(N\)表示一个文档中的词数(随机变量)。
Unigram model
对于文档\(W=(w_1,w_2,...,w_N)\),用 \(p(w_n)\) 表示词 \(w_n\) 的先验概率,生成文档\(w\)的概率为:\(p(W)=\prod_{n=1}^{N} p\left(w_{n}\right)\)
这个好理解,就是每个词概率的乘积,先验概率,是一个词袋模型,cnblogs
Mixture of unigrams model
该模型的生成过程是:给某个文档先选择一个主题z,再根据该主题生成文档,该文档中的所有词都来自一个主题。假设主题有 z1,...,zn,生成文档w的概率为:
后验概率
\(p(W)=p\left(z_{1}\right) \prod_{n=1}^{N} p\left(w_{n} | z_{1}\right)+\ldots+p\left(z_{k}\right) \prod_{n=1}^{N} p\left(w_{n} | z_{k}\right)=\sum_{z} p(z) \prod_{n=1}^{N} p\left(w_{n} | z\right)\)
PLSA模型
详细推导见:cnblogs
既然文档已经产生,那么如何根据已经产生好的文档反推其主题呢?这个利用看到的文档推断其隐藏的主题(分布)的过程(其实也就是产生文档的逆过程),便是主题建模的目的:自动地发现文档集中的主题(分布)。
文档d和词w是我们得到的样本,可观测得到,所以对于任意一篇文档,其 \(P(w_j|d_i)\) 是已知的。从而可以根据大量已知的文档-词项信息 \(P(w_j|d_i)\),训练出文档-主题 \(P(z_k|d_i)\) 和主题-词项 \(P(w_j|z_k)\),如下公式所示:\(P\left(w_{j} | d_{i}\right)=\sum_{k=1}^{K} P\left(w_{j} | z_{k}\right) P\left(z_{k} | d_{i}\right)\)
故得到文档中每个词的生成概率为:\(P\left(d_{i}, w_{j}\right)=P\left(d_{i}\right) P\left(w_{j} | d_{i}\right)=P\left(d_{i}\right) \sum_{k=1}^{K} P\left(w_{j} | z_{k}\right) P\left(z_{k} | d_{i}\right)\)
由于 \(P(d_i)\) 可事先计算求出,而 \(P(w_j|z_k)\) 和 \(P(z_k|d_i)\) 未知,所以 \(θ=(P(w_j|z_k),P(z_k|d_i))\) 就是我们要估计的参数(值),通俗点说,就是要最大化这个θ。
用什么方法进行估计呢,常用的参数估计方法有极大似然估计MLE、最大后验证估计MAP、贝叶斯估计等等。因为该待估计的参数中含有隐变量z,所以我们可以考虑EM算法。
LDA
再PLSA的基础上加了贝叶斯优化
因此有了先验概率和后验概率
在LDA中,主题分布和词分布不再唯一确定不变,即无法确切给出。例如主题分布可能是{教育:0.5,经济:0.3,交通:0.2},也可能是{教育:0.6,经济:0.2,交通:0.2},到底是哪个我们不再确定(即不知道),因为它是随机的可变化的。但再怎么变化,也依然服从一定的分布,即主题分布跟词分布由Dirichlet先验随机确定。正因为LDA是PLSA的贝叶斯版本,所以主题分布跟词分布本身由先验知识随机给定。cnblogs
怎么确定LDA的topic个数?
基于经验 主观判断、不断调试、操作性强、最为常用。
基于困惑度(主要是比较两个模型之间的好坏)。
使用Log-边际似然函数的方法,这种方法也挺常用的。
非参数方法:Teh提出的基于狄利克雷过程的HDP法。
基于主题之间的相似度:计算主题向量之间的余弦距离,KL距离等。cnblogs
如何用主题模型解决推荐系统中的冷启动问题?
推荐系统中的冷启动问题是指在没有大量用户数据的情况下如何给用户进行个性化推荐,目的是最优化点击率、转化率或用户 体验(用户停留时间、留存率等)。冷启动问题一般分为用户冷启动、物品冷启动和系统冷启动三大类。
用户冷启动是指对一个之前没有行为或行为极少的新用户进行推荐;
物品冷启动是指为一个新上市的商品或电影(这时没有与之相关的 评分或用户行为数据)寻找到具有潜在兴趣的用户;
系统冷启动是指如何为一个 新开发的网站设计个性化推荐系统。
解决冷启动问题的方法一般是基于内容的推荐。以Hulu的场景为例,对于用 户冷启动来说,我们希望根据用户的注册信息(如:年龄、性别、爱好等)、搜 索关键词或者合法站外得到的其他信息(例如用户使用Facebook账号登录,并得 到授权,可以得到Facebook中的朋友关系和评论内容)来推测用户的兴趣主题。 得到用户的兴趣主题之后,我们就可以找到与该用户兴趣主题相同的其他用户, 通过他们的历史行为来预测用户感兴趣的电影是什么。cnblogs
同样地,对于物品冷启动问题,我们也可以根据电影的导演、演员、类别、关键词等信息推测该电影所属于的主题,然后基于主题向量找到相似的电影,并将新电影推荐给以往喜欢看这 些相似电影的用户。可以使用主题模型(pLSA、LDA等)得到用户和电影的主题。
以用户为例,我们将每个用户看作主题模型中的一篇文档,用户对应的特征 作为文档中的单词,这样每个用户可以表示成一袋子特征的形式。通过主题模型 学习之后,经常共同出现的特征将会对应同一个主题,同时每个用户也会相应地 得到一个主题分布。每个电影的主题分布也可以用类似的方法得到。
那么如何解决系统冷启动问题呢?首先可以得到每个用户和电影对应的主题向量,除此之外,还需要知道用户主题和电影主题之间的偏好程度,也就是哪些主题的用户可能喜欢哪些主题的电影。当系统中没有任何数据时,我们需要一些先验知识来指定,并且由于主题的数目通常比较小,随着系统的上线,收集到少量的数据之后我们就可以对主题之间的偏好程度得到一个比较准确的估计。cnblogs
LDA概率主题模型的更多相关文章
- 概率主题模型简介 Introduction to Probabilistic Topic Models
此文为David M. Blei所写的<Introduction to Probabilistic Topic Models>的译文,供大家参考. 摘要:概率主题模型是一系列旨在发现隐藏在 ...
- 转:概率主题模型简介 --- ---David M. Blei所写的《Introduction to Probabilistic Topic Models》的译文
概率主题模型简介 Introduction to Probabilistic Topic Models 转:http://www.cnblogs.com/siegfang/archive/2 ...
- LDA算法 (主题模型算法) 学习笔记
转载请注明出处: http://www.cnblogs.com/gufeiyang 随着互联网的发展,文本分析越来越受到重视.由于文本格式的复杂性,人们往往很难直接利用文本进行分析.因此一些将文本数值 ...
- LDA(主题模型算法)
LDA整体流程 先定义一些字母的含义: 文档集合D,topic集合T D中每个文档d看作一个单词序列< w1,w2,...,wn >,wi表示第i个单词,设d有n个单词.(LDA里面称之为 ...
- 用scikit-learn学习LDA主题模型
在LDA模型原理篇我们总结了LDA主题模型的原理,这里我们就从应用的角度来使用scikit-learn来学习LDA主题模型.除了scikit-learn, 还有spark MLlib和gensim库 ...
- Spark:聚类算法之LDA主题模型算法
http://blog.csdn.net/pipisorry/article/details/52912179 Spark上实现LDA原理 LDA主题模型算法 [主题模型TopicModel:隐含狄利 ...
- 自然语言处理之LDA主题模型
1.LDA概述 在机器学习领域,LDA是两个常用模型的简称:线性判别分析(Linear Discriminant Analysis)和 隐含狄利克雷分布(Latent Dirichlet Alloca ...
- 理解 LDA 主题模型
前言 gamma函数 0 整体把握LDA 1 gamma函数 beta分布 1 beta分布 2 Beta-Binomial 共轭 3 共轭先验分布 4 从beta分布推广到Dirichlet 分布 ...
- 主题模型 LDA 入门
主题模型 LDA 入门(附 Python 代码) 一.主题模型 在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model ...
随机推荐
- python学习要点(一)
我的个人博客排版更舒服: https://www.luozhiyun.com/archives/264 列表和元组 列表是动态的,长度大小不固定,可以随意地增加.删减或者改变元素(mutable). ...
- OpenWrite技术自媒体界的JVM一次编辑、随处发布
原文 :https://mp.weixin.qq.com/s/KUtJ2dwhBRuJ2G_-PkQFEA 最懂你的科技自媒体管理平台 [实用小工具推荐]给科技或技术同学们推荐一款比较好用的工具,可以 ...
- ES6规范及语法基础
var的特点 函数作用域 let的特点 没有变量提升,必须先声明.再调用 同一个作用域下不可以重复定义同一个名称 块级作用域 function fun(){ let a = 10 if(true){ ...
- 详细解析kafka之 kafka消费者组与重平衡机制
消费组组(Consumer group)可以说是kafka很有亮点的一个设计.传统的消息引擎处理模型主要有两种,队列模型,和发布-订阅模型. 队列模型:早期消息处理引擎就是按照队列模型设计的,所谓队列 ...
- RabbitMQ集群架构(HA)并结合.NET Core实操
一.前言 已经一年没有更新博客了,由于公司事务比较多,并且楼主我也积极在公司项目中不断实践.net core.DDD以及Abp vnext,也积累了一些吐血经验,目前我在做一家在线教育公司负责智慧校园 ...
- Debug 是门艺术
最近想结合发生在身边码农身上的一些小故事,尝试表达一个观点“Coding 是门技术,Debug 是门艺术”. 上期的分享<Coding 是门技术>主要通过引入身边 Code farmer ...
- 《Three.js 入门指南》2.3.1- 照相机 - 正交投影demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [Vue warn]: Failed to mount component: template or render function not defined. found in ---> <XFbwz> at src/views/XFbwz.vue <App> at src/App.vue <Root>
1.引入.vue文件忘记加.vue 2.引入文件内容为空
- Linux系统安装java jdk
1)下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 我这里下载的是 ...
- c++用递归法将一个整数n转换成字符串
任务描述 用递归法将一个整数n转换成字符串.例如,输入483,应输出字符串“483”.n的位数不确定,可以是任意位数的整数. 测试输入: 预期输出: 程序源码: #include <stdio. ...