导航:首页 > 编程语言 > lda模型java实现

lda模型java实现

发布时间:2023-07-04 08:56:07

1. LDA 原理说明

LDA为latent Dirichlet allocation的简称,是一个生成式模型,是一种主题模型,无监督度学习方法。其基本假设是一篇文档是一个词袋,由多个词组成,与词的顺序无关,它可以有多个主题(topic),并且文档中的词都和这些主题相关。这里使用sparse dirichlet的原因是,一个主题中的词的概率分布是被修剪过得,所以仅有一小部分词的概率较大,这就和实际场景更加贴近

先定义几个简写表示:
①词袋表示为D,词袋中有V个词,里面有M篇文档,每个文档的长度为Ni(文档中含有N个词);
②α为每个文档的主题分布的先验dirichlet分布的参数;(这里简单说明一下dirichlet分布,见文章最后)
③β为每个主题词分布的先验dirichlet分布的参数 ;
④Θi文档i的主题分布,为多项式分布,但受到参数为α的Dirichlet先验分布控制;
⑤φk为主题k的词分布,k∈[0,K],为多项式分布,但受到参数为β的Dirichlet先验分布控制;
⑥ωij为具体的词,这是和①中的已知量,其他的均为变量;
⑦zij为第i篇文档的第j个词的主题;

统计说明如下:

从dirichlet分布α中取样生成文档i的主题分布Θ i (Θ i ~Dir(α),α<1)

从主题k的多项式分布φ k 中取样生成的文档i的第j个词的主题z ij

从dirichlet分布β中取样生成主题词z ij 的词语分布φz ij

从词语的多项式分布φz ij 中重采样最终生成词语ω ij

那么,模型的联合分布(生成词w的概率)为:

最终,文档i的单词分布集对Θ i 、φ求积分,对z ij 求和,(因为有一篇文档假设由K个主题组成,每个主题k满足多项式分布,并且文档包含j个词)得到:

根据p(ω i |α,β)的最大似然估计,最终可以通过EM/吉布斯采样估计出模型中的参数。

对文档中的所有词遍历一遍为其随机分配一个主题(zij),即zij符合mult(1/K),将文档i中k主题出现的次数、文档i中主题数量和、k主题对应的某个词的次数、主题k的总词数,这4个变量都加1。
之后,开始重复迭代寻优。

例如,文档i的词ωij对应的主题为k,根据LDA中topic sample的概率分布sample出新的主题,更新对应的上述4个变量分布加1

迭代完成后,输出主题-词参数矩阵φ和文档-主题矩阵Θ

beta分布的x∈[0,1],是实数,概率密度为x (α-1)(1-x) (β-1),其中α,β>0,这和bernoulli 分布形式上类似,但是bernoulli的x取值为0或1。

当选择不同α和β时,beta分布的pdf为:

说明:

pdf为连续型变量的概率密度函数

beta分布是针对一个x变量,dirichlet分布是针对多个随机变量,通常标记为Dir(α),表示连续多元概率分布,参数α>0,是beta分布的扩展,通常被用于贝叶斯统计中的一种先验分布。

对于两个随机变量(k=2)的pdf分布如下图:

dirichlet分布的pd如下所示:

共轭:假定一个先验分布A,将该先验分布的参数带入另外的一个分布中,得到后验证分布,如果该后验分布和该先验分布有相同的形式,则称为共轭(conjugacy)。

beta分布是bernoulli(二项式分布)的共轭先验分布为共轭,dirichlet为multinomial(多项式分布)的共轭先验分布。

参考链接:

<u>https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation</u>

https://blog.csdn.net/MeituanTech/article/details/80804170

wiki中文版

2. 我是这样一步步理解--主题模型(Topic Model)、LDA(案例代码)

LDA可以分为以下5个步骤:

关于LDA有两种含义,一种是线性判别分析(Linear Discriminant Analysis),一种是概率主题模型: 隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA) ,本文讲后者。

按照wiki上的介绍,LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,是一种主题模型,它可以将文档集 中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题(分布)出来后,便可以根据主题(分布)进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。此外,一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。

人类是怎么生成文档的呢?首先先列出几个主题,然后以一定的概率选择主题,以一定的概率选择这个主题包含的词汇,最终组合成一篇文章。如下图所示(其中不同颜色的词语分别对应上图中不同主题下的词)。

那么LDA就是跟这个反过来: 根据给定的一篇文档,反推其主题分布。

在LDA模型中,一篇文档生成的方式如下:

其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。此外,LDA的图模型结构如下图所示(类似贝叶斯网络结构):

先解释一下以上出现的概念。

至此,我们可以看到二项分布和多项分布很相似,Beta分布和Dirichlet 分布很相似。

如果想要深究其原理可以参考: 通俗理解LDA主题模型 ,也可以先往下走,最后在回过头来看详细的公式,就更能明白了。

总之, 可以得到以下几点信息。

在讲LDA模型之前,再循序渐进理解基础模型:Unigram model、mixture of unigrams model,以及跟LDA最为接近的pLSA模型。为了方便描述,首先定义一些变量:

反过来,既然文档已经产生,那么如何根据已经产生好的文档反推其主题呢?这个利用看到的文档推断其隐藏的主题(分布)的过程(其实也就是产生文档的逆过程),便是 主题建模的目的:自动地发现文档集中的主题(分布)。

文档d和词w是我们得到的样本,可观测得到,所以对于任意一篇文档,其 是已知的。从而可以根据大量已知的文档-词项信息 ,训练出文档-主题 和主题-词项 ,如下公式所示:

故得到文档中每个词的生成概率为:

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

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

事实上,理解了pLSA模型,也就差不多快理解了LDA模型,因为LDA就是在pLSA的基础上加层贝叶斯框架,即LDA就是pLSA的贝叶斯版本(正因为LDA被贝叶斯化了,所以才需要考虑历史先验知识,才加的两个先验参数)。

下面,咱们对比下本文开头所述的LDA模型中一篇文档生成的方式是怎样的:

LDA中,选主题和选词依然都是两个随机的过程,依然可能是先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后再从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。

那PLSA跟LDA的区别在于什么地方呢?区别就在于:

PLSA中,主题分布和词分布是唯一确定的,能明确的指出主题分布可能就是{教育:0.5,经济:0.3,交通:0.2},词分布可能就是{大学:0.5,老师:0.3,课程:0.2}。
但在LDA中,主题分布和词分布不再唯一确定不变,即无法确切给出。例如主题分布可能是{教育:0.5,经济:0.3,交通:0.2},也可能是{教育:0.6,经济:0.2,交通:0.2},到底是哪个我们不再确定(即不知道),因为它是随机的可变化的。但再怎么变化,也依然服从一定的分布, 即主题分布跟词分布由Dirichlet先验随机确定。正因为LDA是PLSA的贝叶斯版本,所以主题分布跟词分布本身由先验知识随机给定。

换言之,LDA在pLSA的基础上给这两参数 加了两个先验分布的参数(贝叶斯化):一个主题分布的先验分布Dirichlet分布 ,和一个词语分布的先验分布Dirichlet分布 。

综上,LDA真的只是pLSA的贝叶斯版本,文档生成后,两者都要根据文档去推断其主题分布和词语分布(即两者本质都是为了估计给定文档生成主题,给定主题生成词语的概率),只是用的参数推断方法不同,在pLSA中用极大似然估计的思想去推断两未知的固定参数,而LDA则把这两参数弄成随机变量,且加入dirichlet先验。

所以,pLSA跟LDA的本质区别就在于它们去估计未知参数所采用的思想不同,前者用的是频率派思想,后者用的是贝叶斯派思想。

LDA参数估计: Gibbs采样 ,详见文末的参考文献。

推荐系统中的冷启动问题是指在没有大量用户数据的情况下如何给用户进行个性化推荐,目的是最优化点击率、转化率或用户 体验(用户停留时间、留存率等)。冷启动问题一般分为用户冷启动、物品冷启动和系统冷启动三大类。

解决冷启动问题的方法一般是基于内容的推荐。以Hulu的场景为例,对于用 户冷启动来说,我们希望根据用户的注册信息(如:年龄、性别、爱好等)、搜 索关键词或者合法站外得到的其他信息(例如用户使用Facebook账号登录,并得 到授权,可以得到Facebook中的朋友关系和评论内容)来推测用户的兴趣主题。 得到用户的兴趣主题之后,我们就可以找到与该用户兴趣主题相同的其他用户, 通过他们的历史行为来预测用户感兴趣的电影是什么。

同样地,对于物品冷启动问题,我们也可以根据电影的导演、演员、类别、关键词等信息推测该电影所属于的主题,然后基于主题向量找到相似的电影,并将新电影推荐给以往喜欢看这 些相似电影的用户。 可以使用主题模型(pLSA、LDA等)得到用户和电影的主题。

以用户为例,我们将每个用户看作主题模型中的一篇文档,用户对应的特征 作为文档中的单词,这样每个用户可以表示成一袋子特征的形式。通过主题模型 学习之后,经常共同出现的特征将会对应同一个主题,同时每个用户也会相应地 得到一个主题分布。每个电影的主题分布也可以用类似的方法得到。

那么如何解决系统冷启动问题呢? 首先可以得到每个用户和电影对应的主题向量,除此之外,还需要知道用户主题和电影主题之间的偏好程度,也就是哪些主题的用户可能喜欢哪些主题的电影。当系统中没有任何数据时,我们需要一些先验知识来指定,并且由于主题的数目通常比较小,随着系统的上线,收集到少量的数据之后我们就可以对主题之间的偏好程度得到一个比较准确的估计。

通俗理解LDA主题模型

LDA模型应用:一眼看穿希拉里的邮件

【 机器学习通俗易懂系列文章 】

3. 请问那位高人有关于人脸识别lda算法的实例,带图片库最好,谢谢

clc
clear all
close all
clear memory
nump=40; %no_of_classes
nots=5; %no_of_training_set
D=pwd;
cd([D, '\ORLDatabase']);
[face,MAP]=imread('face1.bmp');
[a,b]=size(face);
counter=0;
for i=1:nump
for j=1:nots
file=['face' int2str((i-1)*10+j) '.bmp'];
[face,MAP]=imread(file);
grayface=ind2gray(face,MAP);
counter=counter+1;
X(counter,:)=double(reshape(grayface,a*b,1));
end
end
counter=0;
for i=1:nump
for j=nots+1:10
file=['face' int2str((i-1)*10+j) '.bmp'];
[face,MAP]=imread(file);
grayface=ind2gray(face,MAP);
counter=counter+1;
Y(counter,:)=double(reshape(grayface,a*b,1));
end
end
cd(D)
clear memory
clc
AVERAGE=mean(x')';
Average_Matrix=(ones(noc*nots,1)*AVERAGE')';
clear memory
Difference=double(x)-double(Average_Matrix);
[V,L]=eig(Difference'*Difference);
clear memory
[rr,cc]=size(L);
maxL=min(min(L));
for i=1:rr
for j=1:cc
if L(i,j)>maxL
maxL=L(i,j);
ii=i;
jj=j;
end
end
end
v=V(:,jj);
Lamda=max(max(L));
clear memory
counter=1;
for i=1:nump
for j=1:nots
new_X(counter,:)=v(i,:)'*(x(:,counter))';
counter=counter+1;
end
end
clear memory
counter=1;
for i=1:nump
for j=1:3-nots
new_Y(counter,:)=v(i,:)'*(y(:,counter))';
counter=counter+1;
end
end
clear memory

counter=0;holder=0;
for i=1:nump*(3-nots)
error=[];
for j=1:nump*nots
temp=(new_X(j,:)-new_Y(i,:));
distance=sqrt(temp*temp');
error=[error distance];
end
clear memory
Minimum_Error=max(error);
for k=1:nump*nots
if error(k)<Minimum_Error
Minimum_Error=error(k);
holder=k;
end
end
if ceil(holder/nots)==ceil(i/(3-nots))
counter=counter+1;
end
clear memory
end
clear memory
clear new_Y new_X v x y error Minimum_Error
LDA_Performance=(counter/(noc*(3-nots)))*100
clear counter

阅读全文

与lda模型java实现相关的资料

热点内容
岳阳微信公司 浏览:96
win10如何从备份中恢复出厂设置密码 浏览:659
什么软件修改wifi密码错误 浏览:582
遇见不安全网站怎么办 浏览:251
哪个app有庆余年电视剧 浏览:420
iphone5s视频时很黑 浏览:601
js获取端口号 浏览:347
手机短息发的链接病毒苹果手机 浏览:724
win10专业忘记家庭组密码 浏览:176
南宁applestore几楼 浏览:296
java字符串怎么初始化 浏览:349
医美哪个app好 浏览:768
代码编程和机器人编程哪个好 浏览:875
90版本男法 浏览:796
win10桌面字体难看 浏览:848
三菱fx5u支持哪些编程 浏览:7
优酷在文件夹在哪里 浏览:91
趣打印的数据文件是什么 浏览:871
linuxjava程序 浏览:483
苹果6splus数据线图片 浏览:98

友情链接