以下代码是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)。下面列出估计过程。
训练过程:
随机初始化:对语料中的每篇文档中的每个词w,随机赋予一个topic编号z;
重新扫描语料库,对每个w,按照gibbs 抽样公式重新采样它的topic,并在语料库中更新。
重复以上语料库的采样过程直到Gibbs Sampleing 收敛
统计语料库中的topic-word共现频率矩阵,该矩阵就是LDA的模型。
推断过程:(在推断过程中不用计算topic-word分布,因为在训练中样本足够大,推断时假定其不变,只要推断出文档-主题分布即可。)
随机初始化:对当前文档中的每个词w,随机赋予一个topic编号z;
重新扫描语料库,对每个w,按照gibbs 抽样公式重新采样它的topic。
重复以上采样过程直到Gibbs Sampleing 收敛
统计文档中的topic分布,该分布就是文档-主题分布。
本文出自 “进阶之路” 博客,谢绝转载!
原文地址:http://12844768.blog.51cto.com/12834768/1923677