LDA笔记
来源:互联网 发布:手机淘宝部分退款流程 编辑:程序博客网 时间:2024/04/30 10:44
Z:词的主题,
W:词,
LDA假设一篇文档的生成过程如下:
- 随机选择一个主题分布
- 对文档中的每个词:
- 从主题分布中随机选择一个主题
- 从主题中随机选择一个单词
注意:步骤1我们需要的是分布上的分布。
LDA的目标是估计
求解LDA模型中的主题分布和词分布有两种方法:gibbs采样,基于变分推断EM算法。
collapsed gibbs sampling
省略了tokenize,去除停止词,stemming过程,以包含8个短文本的文档集为例。
raw_docs=["eat turkey on turkey day holiday", "i like to eat cake on holiday", "turkey trot race on thanksgiving holiday", "snail race the turtle", "time travel space race", "movie on thanksgiving", "movie at air and space museum is cool movie", "aspiring movie star"]raw_docs_=[doc.split() for doc in raw_docs]
提取词典,为每个词赋一个id,将文档中的词替换为词id
from gensim import corporadictionary=corpora.Dictionary(raw_docs_)#dictionary为每个出现在语料库中的单词分配了一个独一无二的整数编号。这个操作收集了单词计数及其他相关的统计信息。#dictionary.token2id得到字典{词,词的id} docs=[[dictionary.token2id[word] for word in doc] for doc in raw_docs_]"""输出docs:[2, 1, 3, 1, 0, 4][6, 8, 5, 2, 7, 3, 4][1, 9, 10, 3, 11, 4][12, 10, 13, 14][17, 16, 15, 10][18, 3, 11][18, 20, 19, 22, 15, 23, 24, 21, 18][25, 18, 26]"""
初始化主题分配列表(topic assignment list):给每篇文档的每个单词随机赋一个主题
词-主题矩阵:K
文档-主题矩阵:M
import numpy as npM=len(docs) #文档的个数K=2 #主题的个数V=len(dictionary.token2id) #词典的大小#@wt: the count of each word being assigned to each topicwt=np.zeros((K,V))#@dt: the number of words assigned to each topic for each documentdt=np.zeros((M,K))#@ta: topic assignment listta=[]for di in range(M): ta_di=[] for w in docs[di]: t=np.random.randint(0,K) ta_di.append(t) wt[t][w] = wt[t][w]+1 dt[di][t] = dt[di][t]+1 ta.append(ta_di)"""输出ta[1, 0, 0, 0, 1, 0][1, 0, 0, 0, 0, 0, 0][0, 1, 1, 1, 0, 0][0, 1, 1, 0][1, 1, 0, 0][1, 0, 0][0, 0, 1, 1, 1, 1, 1, 1, 0][0, 0, 1]输出dtarray([[ 4., 2.], [ 6., 1.], [ 3., 3.], [ 2., 2.], [ 2., 2.], [ 2., 1.], [ 3., 6.], [ 2., 1.]])输出wtarray([[ 0., 3., 3., 3., 1., 1., 1., 1., 0., 1., 2., 0., 0., 1., 1., 0., 0., 1., 3., 0., 0., 0., 0., 0., 1., 0., 1.], [ 1., 0., 1., 0., 1., 0., 0., 0., 1., 2., 0., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 0.]])"""
这样的随机分配已经给出了文档的主题表示和主题的词分布,然而很明显不是好的分配。因此使用gibbs采样来优化分配。
对每一篇文档,遍历每一个词w,为w分配一个新的主题。依据下面的公式选择新的主题。
等式左边:
等式右边:
W:文档集的所有单词总数
T:主题数,与前面定义的K相同
for m,doc in enumerate(docs): for n,t in enumerate(doc): z=ta[m][n] #z_-i指当采样token w时,在wt和dt计数矩阵中不包括token w dt[m][z]-=1 wt[z][t]-=1 #sampling left=(wt[:,t]+eta)/(np.sum(wt,axis=1)+V*eta) right=(dt[m]+alpha) p_z=left*right n_z=np.random.multinomial(1,p_z/p_z.sum()).argmax() #保存新得到的主题n_z dt[m][n_z]+=1 wt[n_z][t]+=1 ta[m][n]=n_z
迭代指定次数后
多项分布
单次实验有d种可能情况,第i种情况发生的概率是
当n=1,上式简化为:
numpy.random.multinomial(n=10, pvals=[0.2,0.4,0.4], size = 1)
生成一个三维向量,如[2,7,1],向量的每个元素位于0-10之间,三个元素之和为10。设置size = 1000,就会得到1000个三维向量,这1000个向量的均值为[2.013,4.058,3.929],可见其均值的分布趋近于概率[0.2,0.4,0.4]。
Dirichlet分布
参数为
- LDA笔记
- LDA笔记
- LDA学习笔记5-LDA模型
- LDA学习笔记
- LDA论文学习笔记
- LDA模型学习笔记
- 笔记-话题模型&LDA
- LDA学习笔记1-参数估计
- LDA学习笔记4-MCMC
- LDA入门级学习笔记
- LDA入门级学习笔记
- LDA主题模型学习笔记
- LDA入门级学习笔记
- LDA
- LDA
- LDA
- LDA
- LDA
- CSS3 Media Queries 实现响应式demo
- Python中数组及矩阵的大小
- 微信小程序有哪些商店案例
- 超简单实现Android自定义Toast(附源码)
- TensorFlow学习笔记-实现经典LeNet5模型
- LDA笔记
- 自定义View九宫格手势
- 面试题整理--Java设计模式--创建型模式
- Java堆内存Heap与非堆内存Non-Heap
- linux java程序控制台日志输出
- 【Raspberry Pi 3试用体验】+WiringPi控制GPIO
- alsa/asoundlib.h: No such file or directory
- java基础之泛型的使用
- C++中virtual(虚函数)的用法