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分佈,該分佈就是文檔-主題分佈。


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