LDA代码阅读笔记
原代码可以在这里下载。论文原作者David Blei用C写的。
lda-c.tgz载下来解压,用make编译,生成lda可执行程序。
lda est [initial alpha] [k] [settings] [data] [random/seeded/*] [directory]
lda inf [settings] [model] [data] [name]
第一个命令是模型生成的部分。est就是estimate
第二个命令是推理部分。inf就是inference
主函数在lda-estimate.c里。
readme.txt里的模型描述:
LDA is a hierarchical probabilistic model of documents. Let \alpha be a scalar and \beta_{1:K} be K distributions of words (called "topics"). As implemented here, a K topic LDA model assumes the following generative process of an N word document:
1. \theta | \alpha ~ Dirichlet(\alpha, ..., \alpha)
2. for each word n = {1, ..., N}:
a. Z_n | \theta ~ Mult(\theta)
b. W_n | z_n, \beta ~ Mult(\beta_{z_n})
This code implements variational inference of \theta and z_{1:N} for a document, and estimation of the topics \beta_{1:K} and Dirichlet parameter \alpha.
从前面一篇文章可知K是一个选取的参数表示topic的个数(在代码里用变量NTOPICS表示),\alpha是Dirichlet分布的参数,本来是一个k维向量,但是这里把它定义为标量,用一个值表示。在lda est命令里会给出一个初始的\alpha值,程序会根据训练数据求出最终的\alpha和\beta值,\beta值在上一篇文章中已经解释: β是一个k*V的矩阵。k就是主题个数,V是词语个数。计算模型实际上就是估算α和β的值。
lda est另外几个参数的解释。
setting: 配置文件,格式如下:
var max iter [integer e.g., 10 or -1]
var convergence [float e.g., 1e-8]
em max iter [integer e.g., 100]
em convergence [float e.g., 1e-5]
alpha [fit/estimate]
var max iter: 对于每一个文档的最大迭代次数,-1就是不限制,用收敛准则去判断是否停止迭代。
var convergence: 参数估计的收敛准则,当(score_old - score) / abs(score_old)小于设定值(或者迭代次数达到最大值)时,停止迭代
em max iter: EM最大迭代次数
em convergence: EM收敛准则
alpha: fit表示迭代过程中\alpha值保持不变,estimate表示\alpha值也会计算
data: 数据文件(数据格式在后面讲到)
random/seeded/*: 模型初始化参数,就是\beta矩阵的初始化。random就是用随机变量初始化,seeded就是随机抽取一个文档用平滑方法得到。*表示从已有的模型里载入。代码里涉及到一个概念:sufficient statistics(充分统计量),用结构体lda_suffstats存储,里面有一个k*V的二维数组class_word,不知道跟lda_model结构里的log_prob_w(也是k*V的二维数组)是什么关系。此处存疑。
directory: 输出目录
这里 有一个简单的语料库。载下来解压到lda程序所在目录。
然后运行如下命令
./lda 1 10 settings.txt ap/ap.dat random output
大概跑10来分钟
源地址:http://hi.baidu.com/lewutian/item/62da5818b716cc797a5f258d

浙公网安备 33010602011771号