LDA Jgibbslda

以下代码是Jibbslda中计算(文档-主题)和(主题-词)矩阵的代码实现

计算Theta(文档-主题)

nd[m][k] 是文档m被分配到主题k的单词数量

ndsum[m]是文档m中单词的数量

K * trnModel.alpha//因为所有的alpha,beta是一样的所以,K*alpha为所有alpha的和

public void computeTheta(){

for (int m = 0; m < trnModel.M; m++){

for (int k = 0; k < trnModel.K; k++){

//因为每个主题的alpha是一样的所以K*alpha

trnModel.theta[m][k] = (trnModel.nd[m][k] + trnModel.alpha) / (trnModel.ndsum[m] + trnModel.K * trnModel.alpha);

}

}

}


nw [i] [j]:分配给主题j的字/项i的实例数,大小V x K

nwsum[k] 被分配到主题K的单词总数

计算phi(主题-词)

public void computePhi(){

for (int k = 0; k < trnModel.K; k++){

for (int w = 0; w < trnModel.V; w++){

trnModel.phi[k][w] = (trnModel.nw[w][k] + trnModel.beta) / (trnModel.nwsum[k] + trnModel.V * trnModel.beta);

}

}

}

}

代码用到的数学公式为

----------------------------------------------------------------------------------------------------------

(以下摘抄于LDA数学八卦)

LDA中的估计和推断过程基本一样。我认为估计得出主题-词分布之后为每个主题手工赋予意义。然后推断的时候就不用显示topic7这样的数字,而显示例如文档c919国产民航飞机(topic7)。下面列出估计过程。

训练过程:

  1. 随机初始化:对语料中的每篇文档中的每个词w,随机赋予一个topic编号z;

  2. 重新扫描语料库,对每个w,按照gibbs 抽样公式重新采样它的topic,并在语料库中更新。

  3. 重复以上语料库的采样过程直到Gibbs Sampleing 收敛

  4. 统计语料库中的topic-word共现频率矩阵,该矩阵就是LDA的模型。

推断过程:(在推断过程中不用计算topic-word分布,因为在训练中样本足够大,推断时假定其不变,只要推断出文档-主题分布即可。)

  1. 随机初始化:对当前文档中的每个词w,随机赋予一个topic编号z;

  2. 重新扫描语料库,对每个w,按照gibbs 抽样公式重新采样它的topic。

  3. 重复以上采样过程直到Gibbs Sampleing 收敛

  4. 统计文档中的topic分布,该分布就是文档-主题分布。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章