***********************示例**************************
LDA要乾的事情簡單來說就是爲一堆文檔進行聚類(所以是非監督學習),一種topic就是一類,要聚成的topic數目是事先指定的。聚類的結果是一個概率,而不是布爾型的100%屬於某個類。國外有個博客[1]上有一個清晰的例子,直接引用:
Suppose you have the following set of sentences:
- I like to eat broccoli and bananas.
- I ate a banana and spinach smoothie for breakfast.
- Chinchillas and kittens are cute.
- My sister adopted a kitten yesterday.
- Look at this cute hamster munching on a piece of broccoli.
What is latent Dirichlet allocation? It’s a way of automatically discovering topics that these sentences contain. For example, given these sentences and asked for 2 topics, LDA might produce something like
- Sentences 1 and 2: 100% Topic A
- Sentences 3 and 4: 100% Topic B
- Sentence 5: 60% Topic A, 40% Topic B
- Topic A: 30% broccoli, 15% bananas, 10% breakfast, 10% munching, … (at which point, you could interpret topic A to be about food)
- Topic B: 20% chinchillas, 20% kittens, 20% cute, 15% hamster, … (at which point, you could interpret topic B to be about cute animals)
上面關於sentence 5的結果,可以看出來是一個明顯的概率類型的聚類結果(sentence 1和2正好都是100%的確定性結果)。
再看例子裏的結果,除了爲每句話得出了一個概率的聚類結果,而且對每個Topic,都有代表性的詞以及一個比例。以Topic A爲例,就是說所有對應到Topic A的詞裏面,有30%的詞是broccoli。在LDA算法中,會把每一個文檔中的每一個詞對應到一個Topic,所以能算出上面這個比例。這些詞爲描述這個Topic起了一個很好的指導意義,我想這就是LDA區別於傳統文本聚類的優勢吧。
*******************LDA整體流程******************
先定義一些字母的含義:
- 文檔集合D,topic集合T
- D中每個文檔d看作一個單詞序列< w1,w2,...,wn >,wi表示第i個單詞,設d有n個單詞。(LDA裏面稱之爲word bag,實際上每個單詞的出現位置對LDA算法無影響)
- D中涉及的所有不同單詞組成一個大集合VOCABULARY(簡稱VOC)
LDA以文檔集合D作爲輸入(會有切詞,去停用詞,取詞幹等常見的預處理,略去不表),希望訓練出的兩個結果向量(設聚成k個Topic,VOC中共包含m個詞):
- 對每個D中的文檔d,對應到不同topic的概率θd < pt1,..., ptk >,其中,pti表示d對應T中第i個topic的概率。計算方法是直觀的,pti=nti/n,其中nti表示d中對應第i個topic的詞的數目,n是d中所有詞的總數。
- 對每個T中的topic t,生成不同單詞的概率φt < pw1,..., pwm >,其中,pwi表示t生成VOC中第i個單詞的概率。計算方法同樣很直觀,pwi=Nwi/N,其中Nwi表示對應到topic t的VOC中第i個單詞的數目,N表示所有對應到topic t的單詞總數。
LDA的核心公式如下:
p(w|d) = p(w|t)*p(t|d)
直觀的看這個公式,就是以Topic作爲中間層,可以通過當前的θd和φt給出了文檔d中出現單詞w的概率。其中p(t|d)利用θd計算得到,p(w|t)利用φt計算得到。
實際上,利用當前的θd和φt,我們可以爲一個文檔中的一個單詞計算它對應任意一個Topic時的p(w|d),然後根據這些結果來更新這個詞應該對應的topic。然後,如果這個更新改變了這個單詞所對應的Topic,就會反過來影響θd和φt。
LDA算法開始時,先隨機地給θd和φt賦值(對所有的d和t)。然後上述過程不斷重複,最終收斂到的結果就是LDA的輸出。
***************TOPIC數目的確定*******************
- 選取初始K值,得到初始模型,計算各topic之間的相似度
- 增加或減少K的值,重新訓練得到模型,再次計算topic之間的相似度
- 重複第二步直到得到最優的K