Topic Model 的复杂度计算(时间和空间)

本文详细探讨了主题模型的时间复杂度和空间复杂度,包括LDA、Biterm和hdLDA模型。时间复杂度分析中,LDA为O(NiterNDKl¯),Biterm为O(NiterKNDl¯(l¯−1)/2),hdLDA为O(NiterND(Kl¯+2KC¯lc¯+C¯lc¯)。空间复杂度方面,LDA为NDK+WK+ND∗l¯,Biterm为K+WK+NDl¯(l¯−1)/2,hdLDA为WK+NDK+JW+NDC¯lc¯。
摘要由CSDN通过智能技术生成

算法复杂度包含两个方面,时间复杂度和空间复杂度,也就是常称的计算复杂度和内存空间占用两方面。下面先说主题模型的计算复杂度,再说内存占用。

时间复杂度

    本来这个问题挺简单的,但是有搞统计的同学不知道CS里面的复杂度是怎么计算,就写到这里吧。本文比较三个topic model时间复杂度的计算方法,分别是LDA,Biterm,和hdLDA

    时间复杂度的计算很好掌握,就是把算法中的最基本操作作为单元操作,设定其时间复杂度为O(1)。最简单的可以是赋值、加减乘除等操作;复杂的也可以将之前文章中讲到的一次Gibbs sampling抽样(一个变量t+1时刻的值,由其它变量t时刻的值抽得),作为一个单元操作。最后看该操作总共执行了多少次,若执行了M次,则算法的时间复杂度就是O(M)。

    在Topic Model中,单元操作可看作是一次Gibbs抽样(其实可以更细粒度到加减乘除运算,但是本次所对比的LDA和Biterm模型的单次抽样复杂度相同,所以不需要比较更细粒度的运算)。那么计算时间复杂度就是计算该抽样所执行的次数。所以接下来就是看一下套在单元计算外面的计算步骤。

int last_iter = liter;
for (liter = last_iter + 1; liter <= niters + last_iter; liter++) {
    printf("Iteration %d ...\n", liter);
    for (int m = 0; m < M; m++) {
        for (int n = 0; n < ptrndata->docs[m]->length; n++) {
            int topic = sampling(m, n);
            z[m][n] = topic;
        }
    }
}

    由上面代码可以看出,最外层是一个迭代次数 Niter , 内层是文档个数 M ,也即 ND ,再内层是相应文档的长度(不重复单词的个数)。由于每一篇文档的长度不同,因此取平均值 l¯ 。然后再看一下sampling()代码:

int model::sampling(int m, int n) {
    // remove z_i from the count variables
    int topic = z[m][n];
    int w = ptrndata->docs[m]->words[n];
    nw[w][topic] -= 1;
    nd[m][topic] -= 1;
    nwsum[topic] -= 1;
    ndsum[m] -= 1;

    double Vbeta = V * beta;
    double Kalpha = K * alpha;    
    // do multinomial sampling via cumulative method
    for (int k = 0; k < K; k++) {
        p[k] = (nw[w][k] + beta) / (nwsum[k] + Vbeta) *
            (nd[m][k] + alpha) / (ndsum[m] + Kalpha);
    }
    // cumulate multinomial parameters
    for (int k = 1; k < K; k++) {
    p[k] += p[k - 1];
    }
    double u = ((double)random() / RAND_MAX) * p[K - 1];
    for (topic = 0; topic < K; topic++) {
        if (p[topic] > u) {
            break;
        }
    }
    nw[w][topic] += 1;
    nd[m][topic] += 1;
    nwsum[topic] += 1;
    ndsum[m] += 1;     
    return topic;
}

    可以看到核心计算过程也就是在为p[k]赋值的过程,而k一共有K个。所以最终的复杂度也就是: O(NiterNDKl¯)

    那么计算Biterm topic model也就很简单了。由于该模型的主题分布不在文档上,而是在biterm上,而biterm的个数为 NDl¯(l¯1)/2 。因此时间复杂度就是 O(

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值