LDA notes
每次再看LDA,都要费一番功夫,因此需要记录一些比较接地气的笔记外加形象的比喻。让一个CS的人去弄LDA似乎有点吃别人饭碗的感觉,这块几乎是
数学或者说统计知识,当然可能某些CS背景的Math基础较好的学生可能看起来也不是太费力了。
包括模型的过程(其他地方可能是目标函数,但是这里是没有的,因为目的是为每一篇文档计算一个主题分布,至少我用来做元基因组聚类只需要这个东西)
- Dirichlet
- Multinomal
- Dirichlet
- Multinomial
正如Ahdoc大神说的,LDA牵涉的数学先验知识太多了,一个CS背景的人几乎是不太可能对他加以改进的,所以我也只能把抽象的语言稍加形象解释。
1.Dirichlet是多维连续变量分布(概率论课虽然学的是A,但是也只讲了二维的,课本二维推广到高维没有实质困难这句话将困难都留给我等CS学生了),参数是一个K
维向量,alpha1….alphaK, 并且概率密度函数有一个belta函数,暂时不管他长啥样。
因此从一个概率分布里抽样,其实是获取一次X的值,对于多维就是一个K维向量,第一步的Dirichlet是K维,K表示topic数,这是用户无背景知识输入的,因此具有主观性,最后
的结果也是通过这个来调节 ,记得之前微博说如果十二神肖的topic改为11会变成什么样。。。
抽样得到了K维向量,表示第i个文档的主题分布,因为X1+….XK=1, 刚好符合主题概率和为1。
2.第二步是获取第i个文档j个单词的具体主题,从多项分布中抽样获取一个具体的值(主题table里的index,具体编程实现),P(X1=N1,X2=N2…Xk=Nk)=(N!/(N1!…Nk!))p1^N1*p2^N2…pk^Nk,这里表示一次抽样有K种结果,那么抽样N次,Xi结果又Ni次的概率由上式表示。
因此很多地方对于这里MultiNomial分布产生质疑,因为其实N=1,准确的说是Categori分布,也就是N=1的多项分布,有一个K维的参数可以抽样得到一个具体的值(根据概率),犹记得看了
sumous_t的随机数笔记后,对于这方面的编程实现有了一定的了解,可以稍微帮助理解这一过程以及编程实现。
3.还是一个Dirichlet,有时称职为分布上的分布,但是这次不是K维而是V维的了,V表示单词vocabular的大小,所以同上可以抽样得到V维的一个向量,表示之前算出的主题对应的
单词分布,也是概率和为1,理论上来说,实际不是,Blei的代码用了对数处理,具体原因暂不明确。
4.同上还是MultiNomial分布,然后根据公式,抽样出一个具体的单词出来。
关于求解有VB(基于著名的EM算法),以及gibbs sampling, 对于gibbs sampling,抽样就是通过多次采样来逼近实际的结果。但是Wikipedia上的说明似乎看的不太明白。
现在GS算法较普遍,求解简单,并且利于并行,尽管前后两次采样的依赖关系影响了更高层次的并行。
Dirichlet http://zh.wikipedia.org/wiki/%E7%8B%84%E5%88%A9%E5%85%8B%E9%9B%B7%E5%88%86%E5%B8%83
B http://zh.wikipedia.org/wiki/%CE%92%E5%88%86%E5%B8%83
http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation
http://zxw.xjxnw.com/ZCL/part2/C11g.htm MultiNomial分布
PS:Lab里都是教育网,还push不到github,这有点悲催,还要VPN,但是设置Library代理好像也不行,不知道是不是系统代理对git无效。
记得之前MultiNomial分布的参数写错了,是N维,而不是Ni维的。
今天弄完Gibbs Sampling,累觉不爱了。。。。。