GibbsLDA utils.cpp分析

来源:互联网 发布:人工智能三贤者理论 编辑:程序博客网 时间:2024/05/18 02:11

GibbsLDA utils.cpp分析

头文件

都看到了这儿,头文件有啥已经不重要了,都在心中。

函数

函数1:

int utils::parse_args(int argc, char ** argv, model * pmodel);

变量:

model_status就是当前model的状态,现在因为还不确定,所以是KNOWN。

dir就是存有model的文件夹的路径?

model_name是model的名称?

dfile肯定是最后要执行的file的名称。

alpha,beta,k,niters,savestep,twords,withrawdata这些都是文档中就有的参数。

然后就开始分析参数。

if (arg == "-est") {    model_status = MODEL_STATUS_EST;} else if (arg == "-estc") {    model_status = MODEL_STATUS_ESTC;} else if (arg == "-inf") {    model_status = MODEL_STATUS_INF;} 

以上是对于状态的确定

else if (arg == "-dir") {    dir = argv[++i];        } 

以上是已经训练好的模型的文件夹的路径

else if (arg == "-dfile") {    dfile = argv[++i];      }

以上是要进行训练的或者要进行inference的文件的路径,以.dat结尾

else if (arg == "-model") {    model_name = argv[++i];             } else if (arg == "-alpha") {    alpha = atof(argv[++i]);        } else if (arg == "-beta") {    beta = atof(argv[++i]);     } else if (arg == "-ntopics") {    K = atoi(argv[++i]);        } else if (arg == "-niters") {    niters = atoi(argv[++i]);       } else if (arg == "-savestep") {    savestep = atoi(argv[++i]);} else if (arg == "-twords") {    twords = atoi(argv[++i]);} else if (arg == "-withrawdata") {    withrawdata = 1;} else {    // any more?}

以上是模型的名称和各种参数的设置。虽然说,这里面有withrawdata,但是似乎手册中并没有说道这一点,可能也用不到。

pmodel

pmodel是一个传入的model,似乎是,一个指针。因为已经确定了各种的参数,所以要讲各种参数设置到这个model的各项设置中,可以看到其中的设置很有趣,都是直接赋值,我想在pmodel的初始化过程中应该已经进行了文档中数值的初始化的操作。

string::size_type idx = dfile.find_last_of("/");            if (idx == string::npos) {    pmodel->dir = "./";} else {    pmodel->dir = dfile.substr(0, idx + 1);    pmodel->dfile = dfile.substr(idx + 1, dfile.size() - pmodel->dir.size());    printf("dir = %s\n", pmodel->dir.c_str());    printf("dfile = %s\n", pmodel->dfile.c_str());}} 

以上代码是为了确定model的文件夹和文件名。

下面的两段巨长的代码是分别是-estc 和 -inf的时候才会分别执行的。

if (model_status == MODEL_STATUS_INF) {if (dir == "") {    printf("Please specify model directory please!\n");    return 1;}if (model_name == "") {    printf("Please specify model name for inference!\n");    return 1;}   if (dfile == "") {    printf("Please specify the new data file for inference!\n");    return 1;}pmodel->model_status = model_status;if (dir[dir.size() - 1] != '/') {    dir += "/";}pmodel->dir = dir;pmodel->model_name = model_name;pmodel->dfile = dfile;if (niters > 0) {    pmodel->niters = niters;} else {    // default number of Gibbs sampling iterations for doing inference    pmodel->niters = 20;}if (twords > 0) {    pmodel->twords = twords;}if (withrawdata > 0) {    pmodel->withrawstrs = withrawdata;}// read <model>.others file to assign values for ntopics, alpha, beta, etc.if (read_and_parse(pmodel->dir + pmodel->model_name + pmodel->others_suffix, pmodel)) {    return 1;}}

这个源码缩进的方式我也是醉了。。

以上是inference的判断,需要文件夹,模型的名称和需要判断的文件的名称。

函数2:

int utils::read_and_parse(string filename, model * pmodel);

这个从文件进行读取的就很简单了。不过我觉得也只有在特殊情况-estc和-inf的情况才会使用的。

比较简单,不必多言。

函数3:

string utils::generate_model_name(int iter);

这个函数的作用就是产生输出的model的name。

可以看到对于不同的iter,前面需要进行0的补充操作。modelname = “model-buff”/”model-final”

函数4:

void utils::sort(vector<double> & probs, vector<int> & words);

根据prob的大小对于probs和words进行降序排序。

函数5:

void utils::quicksort(vector<pair<int, double> > & vect, int left, int right);

根据第二个元素double进行排序的小快排。也是降序排序。

0 0