LDA可以分為以下5個(gè)步驟:
創(chuàng)新互聯(lián)建站專注于邗江企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城系統(tǒng)網(wǎng)站開發(fā)。邗江網(wǎng)站建設(shè)公司,為邗江等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
關(guān)于LDA有兩種含義,一種是線性判別分析(Linear Discriminant Analysis),一種是概率主題模型: 隱含狄利克雷分布(Latent Dirichlet Allocation,簡(jiǎn)稱LDA) ,本文講后者。
按照wiki上的介紹,LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,是一種主題模型,它可以將文檔集 中每篇文檔的主題以概率分布的形式給出,從而通過分析一些文檔抽取出它們的主題(分布)出來后,便可以根據(jù)主題(分布)進(jìn)行主題聚類或文本分類。同時(shí),它是一種典型的詞袋模型,即一篇文檔是由一組詞構(gòu)成,詞與詞之間沒有先后順序的關(guān)系。此外,一篇文檔可以包含多個(gè)主題,文檔中每一個(gè)詞都由其中的一個(gè)主題生成。
人類是怎么生成文檔的呢?首先先列出幾個(gè)主題,然后以一定的概率選擇主題,以一定的概率選擇這個(gè)主題包含的詞匯,最終組合成一篇文章。如下圖所示(其中不同顏色的詞語(yǔ)分別對(duì)應(yīng)上圖中不同主題下的詞)。
那么LDA就是跟這個(gè)反過來: 根據(jù)給定的一篇文檔,反推其主題分布。
在LDA模型中,一篇文檔生成的方式如下:
其中,類似Beta分布是二項(xiàng)式分布的共軛先驗(yàn)概率分布,而狄利克雷分布(Dirichlet分布)是多項(xiàng)式分布的共軛先驗(yàn)概率分布。此外,LDA的圖模型結(jié)構(gòu)如下圖所示(類似貝葉斯網(wǎng)絡(luò)結(jié)構(gòu)):
先解釋一下以上出現(xiàn)的概念。
至此,我們可以看到二項(xiàng)分布和多項(xiàng)分布很相似,Beta分布和Dirichlet 分布很相似。
如果想要深究其原理可以參考: 通俗理解LDA主題模型 ,也可以先往下走,最后在回過頭來看詳細(xì)的公式,就更能明白了。
總之, 可以得到以下幾點(diǎn)信息。
在講LDA模型之前,再循序漸進(jìn)理解基礎(chǔ)模型:Unigram model、mixture of unigrams model,以及跟LDA最為接近的pLSA模型。為了方便描述,首先定義一些變量:
反過來,既然文檔已經(jīng)產(chǎn)生,那么如何根據(jù)已經(jīng)產(chǎn)生好的文檔反推其主題呢?這個(gè)利用看到的文檔推斷其隱藏的主題(分布)的過程(其實(shí)也就是產(chǎn)生文檔的逆過程),便是 主題建模的目的:自動(dòng)地發(fā)現(xiàn)文檔集中的主題(分布)。
文檔d和詞w是我們得到的樣本,可觀測(cè)得到,所以對(duì)于任意一篇文檔,其 是已知的。從而可以根據(jù)大量已知的文檔-詞項(xiàng)信息 ,訓(xùn)練出文檔-主題 和主題-詞項(xiàng) ,如下公式所示:
故得到文檔中每個(gè)詞的生成概率為:
由于 可事先計(jì)算求出,而 和 未知,所以 就是我們要估計(jì)的參數(shù)(值),通俗點(diǎn)說,就是要最大化這個(gè)θ。
用什么方法進(jìn)行估計(jì)呢,常用的參數(shù)估計(jì)方法有極大似然估計(jì)MLE、最大后驗(yàn)證估計(jì)MAP、貝葉斯估計(jì)等等。因?yàn)樵摯烙?jì)的參數(shù)中含有隱變量z,所以我們可以考慮EM算法。詳細(xì)的EM算法可以參考之前寫過的 EM算法 章節(jié)。
事實(shí)上,理解了pLSA模型,也就差不多快理解了LDA模型,因?yàn)長(zhǎng)DA就是在pLSA的基礎(chǔ)上加層貝葉斯框架,即LDA就是pLSA的貝葉斯版本(正因?yàn)長(zhǎng)DA被貝葉斯化了,所以才需要考慮歷史先驗(yàn)知識(shí),才加的兩個(gè)先驗(yàn)參數(shù))。
下面,咱們對(duì)比下本文開頭所述的LDA模型中一篇文檔生成的方式是怎樣的:
LDA中,選主題和選詞依然都是兩個(gè)隨機(jī)的過程,依然可能是先從主題分布{教育:0.5,經(jīng)濟(jì):0.3,交通:0.2}中抽取出主題:教育,然后再?gòu)脑撝黝}對(duì)應(yīng)的詞分布{大學(xué):0.5,老師:0.3,課程:0.2}中抽取出詞:大學(xué)。
那PLSA跟LDA的區(qū)別在于什么地方呢?區(qū)別就在于:
PLSA中,主題分布和詞分布是唯一確定的,能明確的指出主題分布可能就是{教育:0.5,經(jīng)濟(jì):0.3,交通:0.2},詞分布可能就是{大學(xué):0.5,老師:0.3,課程:0.2}。
但在LDA中,主題分布和詞分布不再唯一確定不變,即無法確切給出。例如主題分布可能是{教育:0.5,經(jīng)濟(jì):0.3,交通:0.2},也可能是{教育:0.6,經(jīng)濟(jì):0.2,交通:0.2},到底是哪個(gè)我們不再確定(即不知道),因?yàn)樗请S機(jī)的可變化的。但再怎么變化,也依然服從一定的分布, 即主題分布跟詞分布由Dirichlet先驗(yàn)隨機(jī)確定。正因?yàn)長(zhǎng)DA是PLSA的貝葉斯版本,所以主題分布跟詞分布本身由先驗(yàn)知識(shí)隨機(jī)給定。
換言之,LDA在pLSA的基礎(chǔ)上給這兩參數(shù) 加了兩個(gè)先驗(yàn)分布的參數(shù)(貝葉斯化):一個(gè)主題分布的先驗(yàn)分布Dirichlet分布 ,和一個(gè)詞語(yǔ)分布的先驗(yàn)分布Dirichlet分布 。
綜上,LDA真的只是pLSA的貝葉斯版本,文檔生成后,兩者都要根據(jù)文檔去推斷其主題分布和詞語(yǔ)分布(即兩者本質(zhì)都是為了估計(jì)給定文檔生成主題,給定主題生成詞語(yǔ)的概率),只是用的參數(shù)推斷方法不同,在pLSA中用極大似然估計(jì)的思想去推斷兩未知的固定參數(shù),而LDA則把這兩參數(shù)弄成隨機(jī)變量,且加入dirichlet先驗(yàn)。
所以,pLSA跟LDA的本質(zhì)區(qū)別就在于它們?nèi)ス烙?jì)未知參數(shù)所采用的思想不同,前者用的是頻率派思想,后者用的是貝葉斯派思想。
LDA參數(shù)估計(jì): Gibbs采樣 ,詳見文末的參考文獻(xiàn)。
推薦系統(tǒng)中的冷啟動(dòng)問題是指在沒有大量用戶數(shù)據(jù)的情況下如何給用戶進(jìn)行個(gè)性化推薦,目的是最優(yōu)化點(diǎn)擊率、轉(zhuǎn)化率或用戶 體驗(yàn)(用戶停留時(shí)間、留存率等)。冷啟動(dòng)問題一般分為用戶冷啟動(dòng)、物品冷啟動(dòng)和系統(tǒng)冷啟動(dòng)三大類。
解決冷啟動(dòng)問題的方法一般是基于內(nèi)容的推薦。以Hulu的場(chǎng)景為例,對(duì)于用 戶冷啟動(dòng)來說,我們希望根據(jù)用戶的注冊(cè)信息(如:年齡、性別、愛好等)、搜 索關(guān)鍵詞或者合法站外得到的其他信息(例如用戶使用Facebook賬號(hào)登錄,并得 到授權(quán),可以得到Facebook中的朋友關(guān)系和評(píng)論內(nèi)容)來推測(cè)用戶的興趣主題。 得到用戶的興趣主題之后,我們就可以找到與該用戶興趣主題相同的其他用戶, 通過他們的歷史行為來預(yù)測(cè)用戶感興趣的電影是什么。
同樣地,對(duì)于物品冷啟動(dòng)問題,我們也可以根據(jù)電影的導(dǎo)演、演員、類別、關(guān)鍵詞等信息推測(cè)該電影所屬于的主題,然后基于主題向量找到相似的電影,并將新電影推薦給以往喜歡看這 些相似電影的用戶。 可以使用主題模型(pLSA、LDA等)得到用戶和電影的主題。
以用戶為例,我們將每個(gè)用戶看作主題模型中的一篇文檔,用戶對(duì)應(yīng)的特征 作為文檔中的單詞,這樣每個(gè)用戶可以表示成一袋子特征的形式。通過主題模型 學(xué)習(xí)之后,經(jīng)常共同出現(xiàn)的特征將會(huì)對(duì)應(yīng)同一個(gè)主題,同時(shí)每個(gè)用戶也會(huì)相應(yīng)地 得到一個(gè)主題分布。每個(gè)電影的主題分布也可以用類似的方法得到。
那么如何解決系統(tǒng)冷啟動(dòng)問題呢? 首先可以得到每個(gè)用戶和電影對(duì)應(yīng)的主題向量,除此之外,還需要知道用戶主題和電影主題之間的偏好程度,也就是哪些主題的用戶可能喜歡哪些主題的電影。當(dāng)系統(tǒng)中沒有任何數(shù)據(jù)時(shí),我們需要一些先驗(yàn)知識(shí)來指定,并且由于主題的數(shù)目通常比較小,隨著系統(tǒng)的上線,收集到少量的數(shù)據(jù)之后我們就可以對(duì)主題之間的偏好程度得到一個(gè)比較準(zhǔn)確的估計(jì)。
通俗理解LDA主題模型
LDA模型應(yīng)用:一眼看穿希拉里的郵件
【 機(jī)器學(xué)習(xí)通俗易懂系列文章 】
輸入?syso?之后?alt?+?/?就會(huì)快速幫你補(bǔ)全!
復(fù)制一行的快捷鍵是?選中要被復(fù)制的行? ctrl?+?alt?+?上下?鍵
1.1 LDA實(shí)例
實(shí)例步驟:
1)加載數(shù)據(jù)
返回的數(shù)據(jù)格式為:documents: RDD[(Long, Vector)],其中:Long為文章ID,Vector為文章分詞后的詞向量;用戶可以讀取指定目錄下的數(shù)據(jù),通過分詞以及數(shù)據(jù)格式的轉(zhuǎn)換,轉(zhuǎn)換成RDD[(Long, Vector)]即可。
2)建立模型
模型參數(shù)設(shè)置說明:
k: 主題數(shù),或者聚類中心數(shù)
DocConcentration:文章分布的超參數(shù)(Dirichlet分布的參數(shù)),必需1.0
TopicConcentration:主題分布的超參數(shù)(Dirichlet分布的參數(shù)),必需1.0
MaxIterations:迭代次數(shù)
setSeed:隨機(jī)種子
CheckpointInterval:迭代計(jì)算時(shí)檢查點(diǎn)的間隔
Optimizer:優(yōu)化計(jì)算方法,目前支持"em", "online"
3)結(jié)果輸出
topicsMatrix以及topics(word,topic))輸出。
實(shí)例代碼如下:
[java] view plain copy
import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.mllib.clustering.LDA
import org.apache.spark.mllib.linalg.Vectors
object lda {
def main(args: Array[String]) {
//0 構(gòu)建Spark對(duì)象
val conf = new SparkConf().setAppName("lda")
val sc = new SparkContext(conf)
Logger.getRootLogger.setLevel(Level.WARN)
//1 加載數(shù)據(jù),返回的數(shù)據(jù)格式為:documents: RDD[(Long, Vector)]
// 其中:Long為文章ID,Vector為文章分詞后的詞向量
// 可以讀取指定目錄下的數(shù)據(jù),通過分詞以及數(shù)據(jù)格式的轉(zhuǎn)換,轉(zhuǎn)換成RDD[(Long, Vector)]即可
val data = sc.textFile("data/mllib/sample_lda_data.txt")
val parsedData = data.map(s = Vectors.dense(s.trim.split(' ').map(_.toDouble)))
// Index documents with unique IDs
val corpus = parsedData.zipWithIndex.map(_.swap).cache()
//2 建立模型,設(shè)置訓(xùn)練參數(shù),訓(xùn)練模型
/**
* k: 主題數(shù),或者聚類中心數(shù)
* DocConcentration:文章分布的超參數(shù)(Dirichlet分布的參數(shù)),必需1.0
* TopicConcentration:主題分布的超參數(shù)(Dirichlet分布的參數(shù)),必需1.0
* MaxIterations:迭代次數(shù)
* setSeed:隨機(jī)種子
* CheckpointInterval:迭代計(jì)算時(shí)檢查點(diǎn)的間隔
* Optimizer:優(yōu)化計(jì)算方法,目前支持"em", "online"
*/
val ldaModel = new LDA().
setK(3).
setDocConcentration(5).
setTopicConcentration(5).
setMaxIterations(20).
setSeed(0L).
setCheckpointInterval(10).
setOptimizer("em").
run(corpus)
//3 模型輸出,模型參數(shù)輸出,結(jié)果輸出
// Output topics. Each is a distribution over words (matching word count vectors)
println("Learned topics (as distributions over vocab of " + ldaModel.vocabSize + " words):")
val topics = ldaModel.topicsMatrix
for (topic - Range(0, 3)) {
print("Topic " + topic + ":")
for (word - Range(0, ldaModel.vocabSize)) { print(" " + topics(word, topic)); }
println()
}
}
}
import?java.awt.event.ActionEvent;
import?java.awt.*;
import?java.awt.event.ActionListener;
import?java.util.ArrayList;
import?javax.swing.*;
import?javax.swing.JButton;
import?javax.swing.JPanel;
import?javax.swing.JTextField;
public?class?test??{
/**
*?@param?args
*/
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
testJFrame?frame=new?testJFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class?testJFrame?extends?JFrame{
private?JTextField?text1;
private?JTextField?text2;
private?JTextField?text3;
private?JButton?button;
private?JPanel?panel;
private?static?final?int?WIDTH=300;
private?static?final?int?HEIGHT=300;
public?testJFrame(){
setTitle("test");
setSize(WIDTH,HEIGHT);
text1=new?JTextField(12);
text2=new?JTextField(12);
text3=new?JTextField(12);
button=new?JButton("確定");
button.addActionListener(new?ActionListener(){
@Override
public?void?actionPerformed(ActionEvent?arg0)?{
//?TODO?Auto-generated?method?stub
String?str=text1.getText();
text2.setText(""+str.length());
for(int?i=str.length()-1;i=0;i--){
text3.setText(text3.getText()+str.charAt(i));
}
}
});
panel=new?JPanel();
panel.add(text1);
panel.add(text2);
panel.add(text3);
panel.add(button);
add(panel);
}
}
因?yàn)閷懙谋容^趕,所以做的比較粗糙,不過你要的功能都有實(shí)現(xiàn)。
針對(duì)短文本存在的稀疏問題,有一系列的算法被提出??梢源笾路譃槿?。第一類采用一種的簡(jiǎn)單的假設(shè)去學(xué)習(xí)隱含的主題,可以認(rèn)為是基于窗口的算法,一個(gè)窗口內(nèi)的詞具有同一主題或者共現(xiàn)的詞具有相同的主題,代表算法Dirichlet Multinomial Mixture (DMM) in conference KDD2014, Biterm Topic Model (BTM) in journal TKDE2016。第二類算法可以成為偽長(zhǎng)文檔算法,主要是把短文本聚合成偽長(zhǎng)文檔來增強(qiáng)詞的共現(xiàn)信息,代表算法有Pseudo-Document-Based Topic Model (PTM) in conference KDD2016, Self-Aggregation-Based Topic Model (SATM) in conference IJCAI2015。 第三類是通過外部語(yǔ)料(如詞嵌入)增強(qiáng)詞的語(yǔ)義信息,代表算法有Generalized P′olya Urn (GPU) based Dirichlet Multinomial Mixturemodel (GPU-DMM) in conference SIGIR2016, Generalized P′olya Urn (GPU) based Poisson-based Dirichlet Multinomial Mixturemodel (GPU-PDMM) in journal TIS2017 and Latent Feature Model with DMM (LF-DMM) in journal TACL2015.。
這些算法的源代碼都可以在這個(gè)基于JAVA的包里獲取到網(wǎng)頁(yè)鏈接。