先把問題描述一下:
如果我們已知了topic內的每個詞的詞頻,比如中topic1 中money 2 次,loan 3次...那麼任意給一個文檔我們可以對裡面每一個詞算一個產生這個詞的機率即 P(w=wi|t=tj)
如,doc1 中的money 百分之百的來自於topic1 。doc2 中的詞用topic1 無法全部解釋,必須藉助topic2 。
但現在問題是,如果我們只有一堆文檔,Doc1,Doc2,Doc3,且拍腦袋的大概知道會有2個topic,那麼怎麼產生著兩個topic才能最好的解釋這三個文檔呢?
因此我們要計算一個機率,即文檔中的這個詞活脫脫的呈現在我們面前的機率P(wi),我們儘可能想辦法讓這個機率最大。就好像XX廠長成功了,我們要羅織功勞,讓XX廠長成功這件事,最可信。
那麼這個機率計算的方法如,簡單來說就是 P(wi) = P(wi|topic) * P(topic|doc)*p(doc),我們省略p(doc)【求解沒有意義】於是得到下面公式。
現在問題又來了,如果給定一個文檔di的一個詞wi,他最大可能是來自哪個topic呢?
即 求解P(topic|(di,wi))?
我們知道,P(topic|(wi,di))和P((wi,di)|topic)有關係,那麼P((wi,di)|topic)=P(wi|topic)P(doc|topic),即我們要使得P(wi|topic)P(doc|topic) 這兩個東東的liklyhood最大。
也就是論文中的CWT和CDT,而公式左邊 (CWT+β)/(∑CWT+Wβ) 表示的含義就是P(wi|topic),即topic產生wi的能力。後面一個是P(doc|topici)。
為了驗證有效性,我對論文中的這個例子做了實驗,很遺憾沒有做到他的結果,但我感覺應該是對的,其中α,大家可以調大調小了試試看,調大了的結果是每個文檔接近同一個topic,即讓p(wi|topici)發揮的作用小,這樣p(di|topici)發揮的作用就大。 其中的β,調大的結果是讓p(di|topici)發揮的作用變下,而讓p(wi|topici)發揮的作用變大,體現在每個topic更集中在幾個詞彙上面,或者而每個詞彙都儘可能的百分百機率轉移到一個topic上。
大家可以看下論文,用My Code實際感覺下資料的變化。
以下to @老師木 @王威廉 @李沐mu @等高手:
我覺得論文中的結果也很奇怪,如果在更新wi的類標號的時候,比如更新第一個doc的第二詞,money,money出現了6次(2黑,4白),如果第一個更新為白,後面怎麼可能更新為黑呢?如果不可能,為什麼論文作者在64次迭代後,會有一些文檔同一個word會打上不同的類標籤,比如doc2,的bank,打了4黑1白?
我嘗試過update放在每個更新之後,發現也做不到,很神奇,也許論文作者原始文檔的term出現順序不是我寫的那樣。
代碼和論文地址:
https://github.com/pennyliang/MachineLearning-C---code/tree/master/gibbs_sampling