GibbsLDA++使用手册

GibbsLDA++使用手册


1.Description

GNU license


2.Compile GibbsLDA++

默认编译器是

CC=     g++

OBJS=       strtokenizer.o dataset.o utils.o model.o
MAIN=       lda

all:    $(OBJS) $(MAIN).cpp
    $(CC) -o $(MAIN) $(MAIN).cpp $(OBJS)
    strip $(MAIN)

strtokenizer.o: strtokenizer.h strtokenizer.cpp
    $(CC) -c -o strtokenizer.o strtokenizer.cpp

dataset.o:  dataset.h dataset.cpp
    $(CC) -c -o dataset.o dataset.cpp

utils.o:    utils.h utils.cpp
    $(CC) -c -o utils.o utils.cpp

model.o:    model.h model.cpp
    $(CC) -c -o model.o model.cpp

test:


clean:
    rm $(OBJS) 
    rm $(MAIN)

可以看出,首先设置的就是编译器CC = …
OBJS就是生成的目标.o文件,一共有四个,最后确实生成了四个.o文件。
MAIN就是主函数lda。
其实lda的src文件夹下面只有五个cpp文件,lda作为main,剩下的生成同名.o文件。

所有要make的东西,就是OBJS和MAIN这两个东西。
对应于不同的.o确实有自己的cpp文件,逐个编译就成。

test没有。

clean就是移除掉所有.o和make出来的lda即可


3.How to use

其实对于使用来说,主要就知道

1.参数的意义

2.能实现什么功能

3.输入输出

参数的意义

从开始进行训练

-est:开始训练

-alpha:超参数,默认为50/K(K = topics的个数)

-beta:超参数:默认0.1

-ntopics:topic的个数,默认100

-niters:迭代轮数,默认2000

-savestep:隔多少步保存

-twords:每个topic的出现最高的n个单词,默认20

-dfile:原文件,即.dat文件

从半截开始训练

-estc:继续进行训练

-dir包含原model的路径

-model原来模型的名字

-niters继续进行训练的轮数,默认2000

-savestep:隔多少步保存

-twords:topn word

对新文本进行推断

-inf:进行inference

-dir:包含模型的文件夹

-model:model的名称

-niters:迭代轮数

-twords:topn word

-dfile:包含新数据的文件

能实现什么功能

三种,举个例子:

$ src/lda -est -alpha 0.5 -beta 0.1 -ntopics 100 -niters 1000 -savestep 100 -twords 20 -dfile models/casestudy/ trndocs.dat

这就意味着使用进行训练阶段,topic是100个。100步一存,文件时casestudy中的trndocs文件。

$ src/lda -estc -dir models/casestudy/ -model model-01000 - niters 800 -savestep 100 -twords 30

继续训练800轮,使用的是casestudy的1000轮的model

$ src/lda -inf -dir models/casestudy/ -model model-01800 - niters 30 -twords 20 -dfile newdocs.dat

对于训练的模型,在dir文件夹中,对于dfile进行计算,结果存储在同名的几个输出文件中。

输入格式

一个文档:

第一行:文档的个数

第2-n+1行:分词后的文档。

输出格式

-.others:参数

-.phi:(word|topic)

-.theta:(topic|document)

-.tassign:word:wopic of word

-.twords:top n words of each topic


几个参数的出现地点:

alpha:

void model::compute_theta() {
for (int m = 0; m < M; m++) {
for (int k = 0; k < K; k++) {
    theta[m][k] = (nd[m][k] + alpha) / (ndsum[m] + K * alpha);
}
}
}

——model.cpp

我认为alpha是为了平滑之用。

beta:

void model::compute_phi() {
for (int k = 0; k < K; k++) {
for (int w = 0; w < V; w++) {
    phi[k][w] = (nw[w][k] + beta) / (nwsum[k] + V * beta);
}
}
}

——model.cpp

beta应该也是相同的效果。


另外,似乎lda不仅仅能应用在文本上,也能应用在图像等具有结构性的数据中(目前还不明白什么意思,不过可以使图看源代码了!)

你可能感兴趣的:(LDA)