本文主要用于理解主題模型LDA(Latent Dirichlet Allocation)其背后的數(shù)學(xué)原理及其推導(dǎo)過程宏榕。本菇力求用簡(jiǎn)單的推理來論證LDA背后復(fù)雜的數(shù)學(xué)知識(shí),苦于自身數(shù)學(xué)基礎(chǔ)不夠旗吁,因此文中還是大量引用了各方大神的數(shù)學(xué)推導(dǎo)細(xì)節(jié),既是為了方便自己以后回顧,也方便讀者追本溯源别厘,當(dāng)然喜歡直接看應(yīng)用的讀者可直接翻到第二章~
基本目錄如下:
LDA的原理
1.1 先導(dǎo)數(shù)學(xué)知識(shí)準(zhǔn)備
1.2 文本模型 - Unigram Model
1.3 主題模型 - PLSA Model
1.4 主題模型 - LDA ModelLDA的應(yīng)用與擴(kuò)展
2.1 LDA的Python實(shí)現(xiàn)
2.2 LDA模型中的主題個(gè)數(shù)
------------------第一菇 - LDA的原理------------------
1.1 先導(dǎo)數(shù)學(xué)知識(shí)準(zhǔn)備
LDA之所以很難懂怎棱,跟其涉及大量的數(shù)學(xué)統(tǒng)計(jì)知識(shí)有關(guān)哩俭,因此,為了更好的理解LDA拳恋,還是先鋪墊一些數(shù)學(xué)知識(shí)凡资。本段力求少擺公式,用更通俗的話來闡述其背后的數(shù)學(xué)思想~
1.1.1 Gamma函數(shù)
認(rèn)真學(xué)過高數(shù)的應(yīng)該都對(duì)這個(gè)函數(shù)有印象,其基本公式如下:
再貼一張Gamma函數(shù)圖隙赁,方便大家對(duì)其有一個(gè)概覽性的認(rèn)識(shí):
該函數(shù)有一個(gè)很好的遞歸性質(zhì)(利用分步積分法可證)如下:
當(dāng)然該函數(shù)還有更重要的一點(diǎn)垦藏,即其可以表述為階乘在實(shí)數(shù)集上的延拓:
(PS.至于為何不定義一個(gè)函數(shù)滿足,大家可以移步LDA數(shù)學(xué)八卦第一章伞访,看完還蠻有趣的掂骏,順便感嘆一下偉大數(shù)學(xué)家們對(duì)完美數(shù)學(xué)公式的追求~)
1.1.2 二項(xiàng)分布
高中學(xué)概率論的時(shí)候,還記得拋硬幣的例子么厚掷?每一次拋硬幣都會(huì)有倆個(gè)結(jié)果弟灼,正面OR背面,那么拋一次硬幣就滿足伯努利分布(又叫0-1分布)冒黑,是一個(gè)離散型的隨機(jī)分布田绑。二項(xiàng)分布無非就是重復(fù)N次的伯努利實(shí)驗(yàn),其概率密度函數(shù)可以表示為:
其中
看到C(n,k)大部分人應(yīng)該都能想起這個(gè)在高中就學(xué)過的式子的意思抡爹,最簡(jiǎn)單的排列組合掩驱,從n個(gè)事件中挑出k個(gè)事件的組合方式,因此上面的式子應(yīng)該不難理解了冬竟。
1.1.3 多項(xiàng)分布
高中學(xué)習(xí)概率論的時(shí)候欧穴,我們除了仍硬幣還仍什么?還會(huì)仍骰子哈哈~但這個(gè)時(shí)候仍一次骰子就不滿足伯努利分布了泵殴,因?yàn)槿砸淮西蛔訒?huì)有6或更多種結(jié)果苔可。因此,多項(xiàng)分布就是二項(xiàng)分布擴(kuò)展到高維的情況袋狞,其概率密度函數(shù)可以表示為:
想細(xì)究該公式怎么來的焚辅,可以先移步這篇博文多項(xiàng)式分布的理解概率公式的理解,本質(zhì)思想跟二項(xiàng)分布幾乎沒差苟鸯,只不過涉及到了一些多項(xiàng)式定理同蜻。
1.1.4 Beta分布
通俗理解,當(dāng)我們不知道一個(gè)概率是什么早处,但又有一些合理的猜測(cè)時(shí)湾蔓,Beta分布能很好的作為一個(gè)表示概率的概率分布。舉個(gè)例子砌梆,我們要統(tǒng)計(jì)預(yù)測(cè)一下窩火琦琦新賽季的三分投籃命中率默责,假如琦琦上賽季投了一個(gè)三分,命中一個(gè)咸包,則按照我們熟悉的思路桃序,我們可以預(yù)測(cè)琦琦新賽季命中率100%(想想美滋滋)!但仔細(xì)一想不對(duì)啊烂瘫,就算是頂級(jí)的三分手(比如湯神)也就40%超一點(diǎn)媒熊,難道我大琦琦比湯神還牛了?顯然這里大家的思考就會(huì)出現(xiàn)分歧,于是就引申出了一個(gè)統(tǒng)計(jì)學(xué)知識(shí)點(diǎn)芦鳍,或者說是倆個(gè)學(xué)派 - 頻率學(xué)派和貝葉斯學(xué)派嚷往!這倆個(gè)學(xué)派的思路差異體現(xiàn)在:
- 頻率學(xué)派:他們把需要推斷的參數(shù)(本例就是琦琦的三分命中率)看做是固定的未知常數(shù),即雖然這個(gè)概率是未知的柠衅,但卻是確定的一個(gè)值皮仁,同時(shí),樣本是隨機(jī)的菲宴,因此頻率學(xué)派重點(diǎn)研究樣本空間贷祈,大部分的概率計(jì)算都是針對(duì)樣本的分布!
- 貝葉斯學(xué)派:他們與頻率學(xué)派認(rèn)知?jiǎng)偤孟喾慈雇纾麄冋J(rèn)為參數(shù)都不是固定值付燥,而是服從一個(gè)概率分布宣谈,樣本卻是固定的愈犹,因此他們重點(diǎn)研究的是參數(shù)的分布。
因此闻丑,回到琦琦的例子上來漩怎,用傳統(tǒng)頻率學(xué)派的觀點(diǎn),那琦琦的命中率確實(shí)就是100%嗦嗡,而用貝葉斯學(xué)派的觀點(diǎn)勋锤,首先琦琦的命中率有一個(gè)先驗(yàn)分布,而根據(jù)樣本信息侥祭,我們可以對(duì)其進(jìn)行更新叁执,得到后驗(yàn)分布。而數(shù)學(xué)家們?yōu)槎?xiàng)分布選取的先驗(yàn)分布就是Beta分布矮冬!
Beta分布在概率論中指一組分布在區(qū)間的連續(xù)概率分布谈宛,其中參數(shù)為, ,概率密度函數(shù)為:
其中胎署,
至于代表的物理意義吆录,可以簡(jiǎn)單理解這倆一起控制著Beta分布的形狀,貼一張圖方便理解:
當(dāng)然如果這個(gè)時(shí)候新賽季已經(jīng)開打琼牧,那我們又會(huì)多得到一點(diǎn)信息恢筝,比如琦琦在揭幕戰(zhàn)怒投5三分,并且命中2個(gè)巨坊,錯(cuò)失3個(gè)撬槽,那這個(gè)時(shí)候,揭幕戰(zhàn)中投出的5個(gè)三分趾撵,肯定能為我所用(樣本信息為二項(xiàng)分布)恢氯,用于更新我對(duì)琦琦一開始命中率預(yù)測(cè)的分布。而這個(gè)時(shí)候就要用到Beta分布另一個(gè)重要的性質(zhì)了,即Beta-Binomial共軛,對(duì)琦琦的預(yù)測(cè)分布可更新為勾缭。
先講明狂男,“共軛分布” 援引wiki的定義即為:在貝葉斯統(tǒng)計(jì)中,如果后驗(yàn)分布與先驗(yàn)分布屬于同類挂滓,則先驗(yàn)分布與后驗(yàn)分布被稱為共軛分布,而先驗(yàn)分布被稱為似然函數(shù)的共軛先驗(yàn)【1】啸胧。參照定義赶站,Beta-Binomial 共軛意味著,如果我們?yōu)槎?xiàng)分布的參數(shù)p選取的先驗(yàn)分布是Beta分布纺念,那么以p為參數(shù)的二項(xiàng)分布用貝葉斯估計(jì)得到的后驗(yàn)分布仍然服從Beta分布贝椿,那么Beta分布就是二項(xiàng)分布的共軛先驗(yàn)分布,用數(shù)學(xué)公式表述就是:
這種形式不變的好處是陷谱,我們能夠在先驗(yàn)分布中賦予參數(shù)很明確的物理意義烙博,這個(gè)物理意義可以延續(xù)到后續(xù)分布中進(jìn)行解釋,同時(shí)從先驗(yàn)變換到后驗(yàn)過程中從數(shù)據(jù)中補(bǔ)充的知識(shí)也容易有物理解釋【2】烟逊。另外再多說一點(diǎn)渣窜,關(guān)于Beta分布的期望可推導(dǎo)表示為:
不知大家能否一眼看出這倆個(gè)參數(shù)的物理意義,實(shí)際上就是琦琦三分投籃時(shí)候宪躯,命中與未命中的次數(shù)G撬蕖(居然與頻率學(xué)派對(duì)P值的估計(jì)統(tǒng)一起來了~妙!)
1.1.5 Dirichlet分布
終于涉及到本文的主角访雪,Dirichlet分布了~靈光的讀者研究到這應(yīng)該大致能猜到該分布是干嘛的了详瑞。類比于多項(xiàng)分布是二項(xiàng)分布的推廣,Dirichlet分布也確實(shí)是Beta分布的推廣臣缀,其概率密度函數(shù)為:
其中
且類比于Beta分布坝橡,Dirichlet也是多項(xiàng)分布的共軛先驗(yàn)分布:
相對(duì)應(yīng)于Beta的期望,Dirichlet分布的期望也可以如下:(其物理意義也就是每個(gè)參數(shù)的估計(jì)值是其對(duì)應(yīng)事件的先驗(yàn)的參數(shù)(也叫偽計(jì)數(shù))和數(shù)據(jù)中的計(jì)數(shù)的和在整體計(jì)數(shù)中的比例):
對(duì)以上倆個(gè)分布的推導(dǎo)過程感興趣的可以移步LDA數(shù)學(xué)八卦肝陪。
1.2 文本模型 - Unigram Model
假設(shè)一篇文檔由若干個(gè)詞語構(gòu)成驳庭,可以不考慮順序,就你像看這句話的時(shí)候也沒現(xiàn)發(fā)他序順亂了~因此我們不妨就把一篇文章看作是一些詞的集合氯窍。那么最簡(jiǎn)單的文本生成模型就是饲常,確定文本的長度為N,然后選出N個(gè)詞來狼讨。選詞的過程與我們?nèi)憎蛔右荒R粯颖从伲瑹o非就是這個(gè)骰子的面比較多,但其仍然服從多項(xiàng)分布政供。這個(gè)簡(jiǎn)單的文本生成模型就叫做Unigram Model播聪。當(dāng)然少不了貝葉斯估計(jì)朽基,每一個(gè)面朝上的概率也會(huì)有一個(gè)先驗(yàn)分布為Dirichlet分布,表示為离陶,而我們也可以根據(jù)樣本信息來估計(jì)后驗(yàn)分布稼虎,其概率圖模型可以表示為:
該記圖方式為plate notation,有興趣的可以了解一下招刨。此時(shí)該文本的生成概率就等于:
我們推導(dǎo)可以計(jì)算得到:
1.3 主題模型 - PLSA Model
上面講的文本生成模型足夠簡(jiǎn)單霎俩,但是對(duì)文本的表達(dá)能力還是不夠,且不太符合我們?nèi)粘5膶懽髁?xí)慣沉眶!試想打却,我們寫一篇文章的時(shí)候,肯定都會(huì)事先擬定一個(gè)主題谎倔,然后再從這個(gè)主題中去尋找相應(yīng)的詞匯柳击,因此這么來看,只扔一個(gè)有N面的骰子似乎還不夠片习,我們似乎應(yīng)該提前再準(zhǔn)備m個(gè)不同類型的骰子捌肴,作為我們的主題,然后確定了主題以后毯侦,再選中那個(gè)骰子哭靖,來決定詞匯具垫。由此侈离,便引申出了我們的主題模型!別急筝蚕,還沒輪到LDA登場(chǎng)卦碾,我們先介紹一個(gè)簡(jiǎn)單的PLSA模型!
簡(jiǎn)單來說PLSA是用一個(gè)生成模型(生成模型與判別式模型的區(qū)別大家還是要懂的)來建模文章的生成過程起宽!它有幾個(gè)前提假設(shè)【3】如下:
- 一篇文章可以由多個(gè)主題構(gòu)成
- 每一個(gè)主題由一組詞的概率分布來表示
- 一篇文章中的每一個(gè)具體的詞都來自于一個(gè)固定的主題
其概率圖模型【4】可以表示為:
用自己的話翻譯一下上述過程就是:
- 按照概率選中一篇文檔
- 從主題分布中按照概率選中一個(gè)主題
- 從詞分布中按照概率選中一個(gè)詞
則整個(gè)語料庫中的文本生成概率可以用似然函數(shù)表示為:
其中表示單詞在文檔中出現(xiàn)的次數(shù)洲胖。
其對(duì)數(shù)似然函數(shù)可以寫成:
其中主題分布和定義在主題上的詞分布就是待估計(jì)的參數(shù),一般會(huì)用EM算法(值得另開一篇來單獨(dú)講的機(jī)器學(xué)習(xí)基礎(chǔ)算法)來求解坯沪。有興趣考究推導(dǎo)細(xì)節(jié)的讀者請(qǐng)移步July老師的博客
1.3 主題模型 - LDA Model
堅(jiān)持看到這里的讀者绿映,其實(shí)內(nèi)心應(yīng)該對(duì)LDA也有了自己的猜想,看看PLSA漏了什么腐晾?沒錯(cuò)叉弦,就是一個(gè)貝葉斯框架!如果我們給主題分布加一個(gè)Dirichlet分布藻糖,再給主題上的詞分布再加一個(gè)Dirichlet分布淹冰,那就是LDA!因此實(shí)際上LDA就是PLSA的貝葉斯版本巨柒。我們直接來看模型圖【4】:
用自己的話翻譯一下上述過程就是:
- 按照概率選中一篇文檔
- 從Dirichlet分布中抽樣生成文檔的主題分布
- 從主題分布中抽取文檔第j個(gè)詞的主題
- 從Dirichlet分布中抽樣生成主題對(duì)應(yīng)的詞分布
- 從詞分布中抽樣生成詞
為了方便求解樱拴,我們通常會(huì)將上述過程順序交換一下柠衍,即我們先生成完全部的主題,再由這些主題去生成完每一個(gè)詞晶乔。這樣珍坊,第一,二個(gè)過程的推導(dǎo)就可以用到Unigram Model的結(jié)論正罢,即我們整個(gè)語料庫下所有詞的主題編號(hào)的生成概率為:
對(duì)于詞的生成過程(主題編號(hào)的選擇并不會(huì)改變K個(gè)主題下的詞分布)垫蛆,即可表示為:
因此,LDA模型的語料庫的生成概率可以表述為:
至此腺怯,整個(gè)LDA模型的文檔生成過程介紹完了袱饭,而實(shí)際我們運(yùn)用求解的時(shí)候,我們的任務(wù)也就是去估計(jì)隱含變量主題分布和詞分布的值了呛占。實(shí)際求解的時(shí)候虑乖,一般會(huì)采用Gibbis Sampleing (又是可以單獨(dú)寫一篇的MCMC采樣的其中一種,詳情可見我的另一篇文章)晾虑。這里簡(jiǎn)單介紹一下疹味,就是首先隨機(jī)給定每個(gè)單詞的主題,然后在其他變量保持不變的情況下帜篇,根據(jù)轉(zhuǎn)移概率抽樣生成每個(gè)單詞的新主題糙捺,反復(fù)迭代以后,收斂后的結(jié)果就是主題分布和詞分布的期望笙隙。
寫到這里洪灯,基本上整個(gè)LDA模型算是從最簡(jiǎn)單的二項(xiàng)分布到Dirichlet分布梳理明白了,對(duì)于不追求數(shù)學(xué)細(xì)節(jié)的讀者來說竟痰,至少可以在實(shí)際運(yùn)用中不像無頭蒼蠅一樣當(dāng)個(gè)“調(diào)包俠”签钩,當(dāng)然這些都還只是個(gè)入門基礎(chǔ),研究人員對(duì)LDA做了非常多的擴(kuò)展應(yīng)用(這里推薦一篇文章是專門講當(dāng)初三位大佬LDA論文的坏快,看完也是收獲頗多铅檩,推薦一波),而我們只有打好了扎實(shí)的基礎(chǔ)莽鸿,才能在實(shí)際應(yīng)用中面對(duì)各種不同的變化得心應(yīng)手昧旨!接下來,我就舉幾個(gè)實(shí)際的實(shí)戰(zhàn)案例祥得,讓大家體驗(yàn)一把其實(shí)際的應(yīng)用兔沃。
------------------第二菇 - LDA的應(yīng)用與擴(kuò)展------------------
2.1 LDA的Python實(shí)現(xiàn)
在實(shí)際的運(yùn)用中,LDA可以直接從gensim調(diào)啃沪,主要的一些參數(shù)有如下幾個(gè):
- corpus:語料數(shù)據(jù)粘拾,需要包含單詞id與詞頻
- num_topics:我們需要生成的主題個(gè)數(shù)(重點(diǎn)調(diào)節(jié))
- id2word:是一種id到單詞的映射(gensim也有包生成)
- passes:遍歷文本的次數(shù),遍歷越多越準(zhǔn)備
- alpha:主題分布的先驗(yàn)
- eta:詞分布的先驗(yàn)
接下來创千,我們實(shí)戰(zhàn)一把缰雇,直接用其官方的示例
from gensim.test.utils import common_texts
from gensim.corpora.dictionary import Dictionary
# Create a corpus from a list of texts
common_dictionary = Dictionary(common_texts)
common_corpus = [common_dictionary.doc2bow(text) for text in common_texts]
# Train the model on the corpus.
lda = LdaModel(common_corpus, num_topics=10)
一步步拆解來看入偷,首先common_texts是list形式,里面的每一個(gè)元素都可以認(rèn)為是一篇文檔也是list結(jié)構(gòu):
>>> print type(common_texts)
<type 'list'>
>>> common_texts[0]
['human', 'interface', 'computer']
第二步械哟,doc2bow這個(gè)方法用于將文本轉(zhuǎn)化為詞袋形式疏之,看一個(gè)官方的示例大家應(yīng)該就能明白了,
>>> from gensim.corpora import Dictionary
>>> dct = Dictionary(["máma mele maso".split(), "ema má máma".split()])
>>> dct.doc2bow(["this", "is", "máma"])
[(2, 1)]
>>> dct.doc2bow(["this", "is", "máma"], return_missing=True)
([(2, 1)], {u'this': 1, u'is': 1})
初始化的時(shí)候?qū)γ恳粋€(gè)詞都會(huì)生成一個(gè)id暇咆,新的文本進(jìn)去的時(shí)候锋爪,返回該文本每一個(gè)詞的id,和對(duì)應(yīng)的頻數(shù)爸业,對(duì)于那些不存在原詞典的其骄,可以控制是否返回。此時(shí)生成的corpus就相當(dāng)于是LDA訓(xùn)練模型的輸入了扯旷,讓我們檢查一下:
>>>common_corpus[0]
[(0, 1), (1, 1), (2, 1)]
# human單詞的id為0拯爽,且在第一個(gè)文檔中只出現(xiàn)了一次
最后一步,我們只需調(diào)用LDA模型即可钧忽,這里指定了10個(gè)主題毯炮。
from gensim.models import LdaModel
lda = LdaModel(common_corpus, num_topics=10)
讓我們檢查一下結(jié)果(還有很多種方法大家可以看文檔),比如我們想看第一個(gè)主題由哪些單詞構(gòu)成:
>>>lda.print_topic(1, topn=2)
'0.500*"9" + 0.045*"10"
可以看出第一個(gè)模型的詞分布耸黑,9號(hào)10號(hào)占比較大(這里topn控制了輸出的單詞個(gè)數(shù)桃煎,對(duì)應(yīng)的單詞可以通過之前生成dict找出)
我們還可以對(duì)剛才生成的lda模型用新語料去進(jìn)行更新,
# 能更新全部參數(shù)
lda.update(other_corpus)
#還能單獨(dú)更新主題分布大刊, 輸入為之前的參數(shù)为迈,其中rho指學(xué)習(xí)率
lda.update_alpha(gammat, rho)
#還能單獨(dú)更新詞分布
lda.update_eta(lambdat, rho)
大家可以根據(jù)自己的實(shí)際業(yè)務(wù)需求,來具體查驗(yàn)所需函數(shù)奈揍,這里就不一一展開了曲尸,官方文檔上也寫的比較細(xì)赋续,總的來說男翰,感謝大神們把輪子都造好了,我們只要會(huì)用即可纽乱,最好還能參透一點(diǎn)其背后的原理蛾绎。
2.2 LDA模型中的主題個(gè)數(shù)
這里擴(kuò)展開來談一點(diǎn),我們?nèi)绾未_定LDA模型中的主題個(gè)數(shù)鸦列,因?yàn)檫@也是我們調(diào)參的重點(diǎn)租冠,該參數(shù)選取的恰當(dāng),那我們模型的效果往往會(huì)變好薯嗤。首先還是熟悉的套路顽爹,交叉驗(yàn)證,28骆姐,37分看數(shù)據(jù)量镜粤,而我們的評(píng)估指標(biāo)捏题,我翻了一圈,大家都是用的困惑度(perplexity)肉渴,其定義為:
其中為文檔的總數(shù)公荧,為文檔中單詞所組成的詞袋向量,為模型所預(yù)測(cè)的文檔的生成概率同规,為文檔中單詞的總數(shù)循狰。簡(jiǎn)單理解一下就是,對(duì)于一篇文章券勺,我們的模型有多不確定它是屬于哪一個(gè)主題的绪钥。很自然,主題越多关炼,肯定困惑度越小昧识,但是不要忘了,計(jì)算性能也扛不住啊盗扒,因此跪楞,一般也是會(huì)在合理的主題范圍內(nèi)去挑選一個(gè)最佳的主題個(gè)數(shù),比如畫topic_number-perplexity曲線(跟K-means)去找最佳的K一樣的理念吧侣灶。還有其他大佬甸祭,融入了分層狄利克雷過程(HDP),構(gòu)成一種非參數(shù)主題模型褥影,好處就是不需要預(yù)先指定個(gè)數(shù)池户,模型可以隨著文檔的變化而自動(dòng)的對(duì)主題個(gè)數(shù)進(jìn)行調(diào)整(復(fù)雜程度有點(diǎn)高,本菇還未深入涉足這一塊)凡怎。這里還要再提醒一點(diǎn)校焦,也是看知乎上小伙伴上提醒的,千萬不要用gensim中的log_perplexity()計(jì)算的perplexity指標(biāo)來比較topic數(shù)量的好壞统倒!因?yàn)檫@個(gè)函數(shù)沒有對(duì)主題數(shù)目做歸一化寨典,因此不同的topic數(shù)目不能直接比較!【5】(然后發(fā)現(xiàn)一票人最后說房匆,都是自己拍的一個(gè)主題個(gè)數(shù)哈哈哈)
至此運(yùn)用這一塊也算是簡(jiǎn)單的耸成,大家還是需要根據(jù)自己的業(yè)務(wù)再做調(diào)整~畢竟也是一門實(shí)驗(yàn)學(xué)科,大家多做實(shí)驗(yàn)浴鸿,多試驗(yàn)試驗(yàn)自然經(jīng)驗(yàn)就有了井氢。
簡(jiǎn)單總結(jié)一下本文,先是介紹了一些LDA背后的統(tǒng)計(jì)分布岳链,重點(diǎn)有Beta分布花竞,及Beta-Binomial 共軛,然后引出了Dirichlet分布掸哑,最后引出了LDA模型约急,雖然省略了一些數(shù)學(xué)推導(dǎo)細(xì)節(jié)寇仓,但基本不影響讀者理解。最后還附上了一些Python的實(shí)戰(zhàn)應(yīng)用烤宙,并重點(diǎn)討論了一下如何選取合適的主題數(shù)目遍烦。希望大家讀完本文后對(duì)機(jī)器學(xué)習(xí)主題模型這一塊有全新的認(rèn)識(shí)。有說的不對(duì)的地方也請(qǐng)大家指出躺枕,多多交流服猪,大家一起進(jìn)步~??
參考文獻(xiàn):
【1】https://zh.wikipedia.org/wiki/%E5%85%B1%E8%BD%AD%E5%85%88%E9%AA%8C
【2】https://zhuanlan.zhihu.com/p/31470216
【3】http://aroslin.com/2017/11/07/LDA-From-Zero/
【4】https://clyyuanzi.gitbooks.io/julymlnotes/content/lda.html
【5】https://www.zhihu.com/question/32286630