在寫(xiě)這篇文章之前,先說(shuō)一些題外話(huà)。
許多機(jī)器學(xué)習(xí)算法(如后面將要提到的LDA)涉及的數(shù)學(xué)知識(shí)太多,前前后后一大堆,理解起來(lái)不是那么容易。
面對(duì)復(fù)雜的機(jī)器學(xué)習(xí)模型,尤其是涉及大量數(shù)學(xué)知識(shí)的模型,我們往往要花費(fèi)大量的時(shí)間和精力去推導(dǎo)數(shù)學(xué)算法(公式),如果過(guò)分沉湎于此會(huì)忽略了很多背后也許更重要的東西,正所謂只見(jiàn)樹(shù)木,不見(jiàn)森林,而這是缺乏遠(yuǎn)見(jiàn),是迷茫的。
我們需要深入理解模型背后的邏輯和所蘊(yùn)含的或簡(jiǎn)或繁的思想。某些思想甚至可能是很美的思想,很偉大的思想。這些理解,使得面對(duì)復(fù)雜的問(wèn)題時(shí)候,面對(duì)陌生問(wèn)題時(shí),會(huì)左右我們的選擇。我們會(huì)首先想起誰(shuí),誰(shuí)是我們工具箱里最得心應(yīng)手的工具,就像自己的孩子一樣親切。而有些方法我們注定不喜歡,也用不太懂。畢竟我們不是每個(gè)人都會(huì)去寫(xiě)復(fù)雜的機(jī)器學(xué)習(xí)算法code,尤其是復(fù)雜的分布式code,但也不意味著我們不需要關(guān)注模型的數(shù)學(xué)原理,因?yàn)闆](méi)這些數(shù)學(xué)原理的支撐,也許你永遠(yuǎn)理解不了這個(gè)模型。但是僅僅掌握公式的推導(dǎo)甚至從頭到尾能寫(xiě)出完整代碼,也還是遠(yuǎn)遠(yuǎn)不夠的。比如說(shuō)我們都知道為了控制over-fitting,需要正則化,為什么在看似很精確的公式里面硬生生的多加入一個(gè)正則項(xiàng),就能夠達(dá)到控制over-fitting的目的呢?又如何判斷所選擇的正則化參數(shù)是合理的?不大也不小,剛好合適。公式我們都能完整的推導(dǎo)吧,但也許有些事我們想的還是不那么明白,用的時(shí)候自然也就會(huì)有一些疑慮。
所以呢,要做到深入淺出真的很難,這也是我們學(xué)習(xí)ML需要努力的方向,理解這些ML模型背后的邏輯,所蘊(yùn)含的美,所表達(dá)的的思想,甚至是哲理,也許能助你我成長(zhǎng)到一個(gè)新的高度。
好了,言歸正傳。在Spark2.0版本中(不是基于RDD API的MLlib),共有四種聚類(lèi)方法:
(1)K-means
(2)Latent Dirichlet allocation (LDA)
(3)Bisecting k-means(二分k均值算法)
(4)Gaussian Mixture Model (GMM)。
基于RDD API的MLLib中,共有六種聚類(lèi)方法:
(1)K-means
(2)Gaussian mixture
(3)Power iteration clustering (PIC)
(4)Latent Dirichlet allocation (LDA)**
(5)Bisecting k-means
(6)Streaming k-means
多了Power iteration clustering (PIC)和Streaming k-means兩種。
本文將介紹LDA主題建模,其它方法在我的整個(gè)系列中都會(huì)有介紹。
什么是LDA主題建模?
隱含狄利克雷分配(LDA,Latent Dirichlet Allocation)是一種主題模型(Topic Model,即從所收集的文檔中推測(cè)主題)。 甚至可以說(shuō)LDA模型現(xiàn)在已經(jīng)成為了主題建模中的一個(gè)標(biāo)準(zhǔn),是實(shí)踐中最成功的主題模型之一。那么何謂“主題”呢?,就是諸如一篇文章、一段話(huà)、一個(gè)句子所表達(dá)的中心思想。不過(guò)從統(tǒng)計(jì)模型的角度來(lái)說(shuō), 我們是用一個(gè)特定的詞頻分布來(lái)刻畫(huà)主題的,并認(rèn)為一篇文章、一段話(huà)、一個(gè)句子是從一個(gè)概率模型中生成的。也就是說(shuō) 在主題模型中,主題表現(xiàn)為一系列相關(guān)的單詞,是這些單詞的條件概率。形象來(lái)說(shuō),主題就是一個(gè)桶,里面裝了出現(xiàn)概率較高的單詞(參見(jiàn)下面的圖),這些單詞與這個(gè)主題有很強(qiáng)的相關(guān)性。
LDA可以用來(lái)識(shí)別大規(guī)模文檔集(document collection)或語(yǔ)料庫(kù)(corpus)中潛藏的主題信息。它采用了詞袋(bag of words)的方法,這種方法將每一篇文檔視為一個(gè)詞頻向量,從而將文本信息轉(zhuǎn)化為了易于建模的數(shù)字信息。但是詞袋方法沒(méi)有考慮詞與詞之間的順序,這簡(jiǎn)化了問(wèn)題的復(fù)雜性,同時(shí)也為模型的改進(jìn)提供了契機(jī)。每一篇文檔代表了一些主題所構(gòu)成的一個(gè)概率分布,而每一個(gè)主題又代表了很多單詞所構(gòu)成的一個(gè)概率分布。
LDA可以被認(rèn)為是如下的一個(gè)聚類(lèi)過(guò)程:
(1)各個(gè)主題(Topics)對(duì)應(yīng)于各類(lèi)的“質(zhì)心”,每一篇文檔被視為數(shù)據(jù)集中的一個(gè)樣本。
(2)主題和文檔都被認(rèn)為存在一個(gè)向量空間中,這個(gè)向量空間中的每個(gè)特征向量都是詞頻(詞袋模型)
(3)與采用傳統(tǒng)聚類(lèi)方法中采用距離公式來(lái)衡量不同的是,LDA使用一個(gè)基于統(tǒng)計(jì)模型的方程,而這個(gè)統(tǒng)計(jì)模型揭示出這些文檔都是怎么產(chǎn)生的。
Latent Dirichlet allocation (LDA) is a topic model which infers topics from a collection of text documents. LDA can be thought of as a clustering algorithm as follows:
(1)Topics correspond to cluster centers, and documents correspond to examples (rows) in a dataset.
(2)Topics and documents both exist in a feature space, where feature vectors are vectors of word counts (bag of words).
(3)Rather than estimating a clustering using a traditional distance, LDA uses a function based on a statistical model of how text documents are generated.
下面的幾段文字來(lái)源于:http://www./articles/reaIra6
它基于一個(gè)常識(shí)性假設(shè):文檔集合中的所有文本均共享一定數(shù)量的隱含主題?;谠摷僭O(shè),它將整個(gè)文檔集特征化為隱含主題的集合,而每篇文本被表示為這些隱含主題的特定比例的混合。
LDA的這三位作者在原始論文中給了一個(gè)簡(jiǎn)單的例子。比如給定這幾個(gè)主題:Arts、Budgets、Children、Education,在這幾個(gè)主題下,可以構(gòu)造生成跟主題相關(guān)的詞語(yǔ),如下圖所示:
然后可以根據(jù)這些詞語(yǔ)生成如下圖所示的一篇文章(其中不同顏色的詞語(yǔ)分別對(duì)應(yīng)上圖中不同主題下的詞)
表面上理解LDA比較簡(jiǎn)單,無(wú)非就是:當(dāng)看到一篇文章后,我們往往喜歡推測(cè)這篇文章是如何生成的,我們可能會(huì)認(rèn)為某個(gè)作者先確定這篇文章的幾個(gè)主題,然后圍繞這幾個(gè)主題遣詞造句,表達(dá)成文。
前面說(shuō)了這么多,在推導(dǎo)模型前,總結(jié)幾條核心思想:
(1)隱含主題,形象的說(shuō)就是一個(gè)桶,里面裝了出現(xiàn)概率較高的單詞,從聚類(lèi)的角度來(lái)說(shuō),各個(gè)主題(Topics)對(duì)應(yīng)于各類(lèi)的“質(zhì)心”,主題和文檔都被認(rèn)為存在于同一個(gè)詞頻向量空間中。(2)在文檔集合中的所有文本均共享一定數(shù)量的隱含主題的假設(shè)下,我們將尋找一個(gè)基于統(tǒng)計(jì)模型的方程。
LDA的核心公式如下:
p(w|d)=∑k=1Kp(w|zk)?p(zk|d)
d代表某篇文檔,w代表某個(gè)單詞,zk代表第i主題,共有K個(gè)主題。通俗的理解是:文檔d以一定概率屬于主題zk,即p(zk|d),而主題zk下出現(xiàn)單詞w的先驗(yàn)概率是p(w|zk),因此在主題zk下,文檔出現(xiàn)單詞w的概率是p(w|zk)?p(zk|d),自然把文檔在所有主題下ti:K出現(xiàn)單詞w的概率加起來(lái),就是文檔d中出現(xiàn)單詞w的概率p(w|d)(詞頻)。
上面式子的左邊,就是文檔的詞頻,是很容易統(tǒng)計(jì)得到的。如果一篇文章中有很多個(gè)詞語(yǔ),那么就有很多個(gè)等式了。再如果我們收集了很多的文檔,那么就有更多的等式了。這時(shí)候就是一個(gè)矩陣了,等式左邊的矩陣是已知的,右邊其實(shí)就是我們要求解的目標(biāo)-與隱含主題相關(guān),圖示如下:
LDA建模的過(guò)程及算法優(yōu)化
看一段很概述性的文字:
LDA是一個(gè)層次貝葉斯模型,把模型的參數(shù)也看作隨機(jī)變量,從而可以引入控制參數(shù)的參數(shù),實(shí)現(xiàn)徹底的“概率化”。LDA模型的Dirichlet的先驗(yàn)分布,文檔d上主題的多項(xiàng)式分布。目前,參數(shù)估計(jì)是LDA最重要的任務(wù),主要有兩種方法:Gibbs抽樣法(計(jì)算量大,但相對(duì)簡(jiǎn)單和精確)和變分貝葉斯推斷法(計(jì)算量小,精度度弱)。
看來(lái)關(guān)于LDA的數(shù)學(xué)求解,還有很多知識(shí)要學(xué)習(xí),本文篇幅太長(zhǎng)了,我將再寫(xiě)一篇文章詳細(xì)介紹貝塔分布,多項(xiàng)式、Dirichlet的先驗(yàn)分布、Gibbs抽樣法,參數(shù)估計(jì)等相關(guān)的知識(shí)。更好的建議是閱讀rickjin科普文章《LDA數(shù)學(xué)八卦》,仔細(xì)看完這個(gè),那么就沒(méi)有什么不明白的了。
應(yīng)該說(shuō)掌握了上述概率相關(guān)的知識(shí)以后,不難理解下面:LDA模型中一篇文檔生成的方式:
(1)從狄利克雷分布α中取樣生成文檔i的主題分布θi
(2)從主題的多項(xiàng)式分布θi中取樣生成文檔i第j個(gè)詞的主題zi,j
(3)從狄利克雷分布β中取樣生成主題zi,j的詞語(yǔ)分布?zi,j
(4)從詞語(yǔ)的多項(xiàng)式分布?zi,j中采樣最終生成詞語(yǔ)wi,j
至此為之,我們要去考慮,怎么去計(jì)算這兩個(gè)矩陣,怎么去優(yōu)化的問(wèn)題了。Spark采用的兩種優(yōu)化算法:
(1)EMLDAOptimizer 通過(guò)在likelihood函數(shù)上計(jì)算最大期望EM,提供較全面的結(jié)果。
(2)OnlineLDAOptimizer 通過(guò)在小批量數(shù)據(jù)上迭代采樣實(shí)現(xiàn)online變分推斷,比較節(jié)省內(nèi)存。在線(xiàn)變分預(yù)測(cè)是一種訓(xùn)練LDA模型的技術(shù),它以小批次增量式地處理數(shù)據(jù)。由于每次處理一小批數(shù)據(jù),我們可以輕易地將其擴(kuò)展應(yīng)用到大數(shù)據(jù)集上。MLlib按照 Hoffman論文里最初提出的算法實(shí)現(xiàn)了一種在線(xiàn)變分學(xué)習(xí)算法。
LDA supports different inference algorithms via setOptimizer function. EMLDAOptimizer learns clustering using expectation-maximization on the likelihood function and yields comprehensive results, while OnlineLDAOptimizer uses iterative mini-batch sampling for online variational inference and is generally memory friendly.
一些數(shù)學(xué)鋪墊
參數(shù)估計(jì)(parameter estimation)
用系統(tǒng)理論的語(yǔ)言來(lái)看:在已知系統(tǒng)模型結(jié)構(gòu)時(shí),用系統(tǒng)的輸入和輸出數(shù)據(jù)計(jì)算系統(tǒng)模型參數(shù)的過(guò)程。18世紀(jì)末德國(guó)數(shù)學(xué)家C.F.高斯首先提出參數(shù)估計(jì)的方法,他用最小二乘法計(jì)算天體運(yùn)行的軌道。20世紀(jì)60年代,隨著電子計(jì)算機(jī)的普及,參數(shù)估計(jì)有了飛速的發(fā)展。參數(shù)估計(jì)有多種方法:矩估計(jì)、極大似然法、一致最小方差無(wú)偏估計(jì)、最小風(fēng)險(xiǎn)估計(jì)、同變估計(jì)、最小二乘法、貝葉斯估計(jì)、極大驗(yàn)后法、最小風(fēng)險(xiǎn)法和極小化極大熵法等。最基本的方法是最小二乘法和極大似然法(來(lái)自百度百科,百度百科倒是經(jīng)常貼“高大上”的描述方法,但是有些東西怎么看卻都是前言不接后語(yǔ),連個(gè)公式渲染都沒(méi)有,好歹簡(jiǎn)單學(xué)學(xué)wikipedia,讓中國(guó)人上網(wǎng)查個(gè)數(shù)學(xué)公式賊費(fèi)勁,還亂七八糟的都不標(biāo)準(zhǔn)不統(tǒng)一,吐槽一下,呵呵)。
從系統(tǒng)理論角度出發(fā)比較“高大上”,說(shuō)的也比較抽象,但是考慮到任何機(jī)器學(xué)習(xí)模型也可以理解為一個(gè)系統(tǒng),上面那段話(huà)好好理解一下也挺好,我們可以提取出下面一些理解:
(1)參數(shù)估計(jì)并不是數(shù)理統(tǒng)計(jì)里面一個(gè)特有的術(shù)語(yǔ),一上來(lái)就看數(shù)理統(tǒng)計(jì)里面的參數(shù)估計(jì),就太狹隘了,也就沒(méi)有那么深入的理解。但是也不可否認(rèn),參數(shù)估計(jì)很多方法都是數(shù)理統(tǒng)計(jì)的方法,但也不全是,如著名的最小二乘法(在那里都能見(jiàn)到這哥們的影子)。
(2)既然都開(kāi)始估計(jì)參數(shù)了,那么模型的結(jié)構(gòu)肯定是已知的,也就是說(shuō):機(jī)器學(xué)習(xí)選取什么算法,決策樹(shù)?還是SVM?還是Beyes概率的,深度學(xué)習(xí)的?,你自己其實(shí)已經(jīng)有主意了的,手頭上有一些樣本數(shù)據(jù)(觀(guān)測(cè)值),任務(wù)是怎么去求解(優(yōu)化)系統(tǒng)(模型)的參數(shù)。
正是由于最小二乘法和極大似然法也是ML里面最基本的使用廣泛的參數(shù)估計(jì)方法,我們需要重點(diǎn)掌握。
另外從數(shù)理統(tǒng)計(jì)學(xué)的語(yǔ)言講: 參數(shù)估計(jì)是根據(jù)從總體中抽取的樣本估計(jì)總體分布中包含的未知參數(shù)的方法。人們常常需要根據(jù)手中的數(shù)據(jù),分析或推斷數(shù)據(jù)反映的本質(zhì)規(guī)律。即根據(jù)樣本數(shù)據(jù)如何選擇統(tǒng)計(jì)量去推斷總體的分布或數(shù)字特征等。統(tǒng)計(jì)推斷是數(shù)理統(tǒng)計(jì)研究的核心問(wèn)題。
可以看出:
(1) 正是由于我們往往只能獲得一少部分樣本,卻被要求拿來(lái)估計(jì)復(fù)雜系統(tǒng)的真實(shí)參數(shù),所以數(shù)學(xué)家才會(huì)根據(jù)不同的模型,應(yīng)用于不同的數(shù)據(jù)情況下,設(shè)計(jì)出如此多的巧妙辦法,盡量使估計(jì)“無(wú)偏,一致,有效”。
(2)數(shù)理統(tǒng)計(jì)學(xué)里面的參數(shù)估計(jì)目的更加明確,即推斷總體的分布,如總體概率密度函數(shù)的類(lèi)型及參數(shù),總體樣本的統(tǒng)計(jì)參數(shù)(均值、方差等等)。顯然機(jī)器學(xué)習(xí)的目標(biāo)更加遠(yuǎn)大,我們需要估計(jì)各類(lèi)復(fù)雜模型的參數(shù),當(dāng)然也包括一部分以概率統(tǒng)計(jì)理論為基礎(chǔ)的ML模型(比如本文后面要介紹的GMM和LDA)。
聯(lián)合概率分布 Joint probability distribution
首先推薦一篇博文:zouxy09的CSDN 在里面舉例的幫助下,比較容易看懂很多概念:
從最大似然到EM算法淺解 http://blog.csdn.net/zouxy09/article/details/8537620/
概率方法的很多公式都很長(zhǎng),看起來(lái)挺嚇人,很多時(shí)候其實(shí)都是由于采用的是聯(lián)合概率分布,對(duì)他的形式把握透徹了,這些公式其實(shí)沒(méi)有那么難理解。
很多時(shí)候(比如說(shuō)樸素Beyes分類(lèi)器),會(huì)簡(jiǎn)化問(wèn)題,首先做獨(dú)立性假設(shè),雖然可能并不完全滿(mǎn)足獨(dú)立性假設(shè),也都這樣做,而且發(fā)現(xiàn)有很好的魯棒性。
獨(dú)立性假設(shè)就是:一個(gè)事件發(fā)生概率不受其他事件影響的事件.兩(多)個(gè)獨(dú)立事件同時(shí)發(fā)生的概率等于兩(多)者分別發(fā)生的概率之積.假如A、B互相獨(dú)立,那么A、B同時(shí)發(fā)生的概率是P(AB)=P(A)×P(B)
如果我們抽取了N個(gè)樣本,那么可以認(rèn)為是發(fā)生了N次獨(dú)立事件,所以有下面比較嚴(yán)謹(jǐn)?shù)谋硎觥?
設(shè)x1,x2,...,xN是從概率密度函數(shù)p(x;θ)中隨機(jī)抽取的N個(gè)樣本,從而得到聯(lián)合概率密度函數(shù)p(X;θ),其中X={x1,x2,...,xN}是樣本集。假設(shè)不同樣本之間具有統(tǒng)計(jì)的獨(dú)立性,則有:
p(X;θ)=p(x1,x2,...,xN;θ)=∏k=1k=Np(xk,θ),θ∈Θ
p(xk,θ)代表概率密度函數(shù)的參數(shù)為θ時(shí),xk發(fā)生的概率。這里的參數(shù)θ是一個(gè)向量(參數(shù)向量)。當(dāng)然θ是可以變化(不斷變化θ代表不同的概率密度分布函數(shù),只是具有相同的類(lèi)型),因此θ是參數(shù)向量集合的Θ的一個(gè)元素。
最大似然估計(jì)
未完待續(xù)…
Spark 代碼分析、參數(shù)設(shè)置及結(jié)果評(píng)價(jià)
SPARK中可選參數(shù)
(1)K:主題數(shù)量(或者說(shuō)聚簇中心數(shù)量)
(2)maxIterations:EM算法的最大迭代次數(shù),設(shè)置足夠大的迭代次數(shù)非常重要,在早期的迭代過(guò)程中,EM通常包含無(wú)用的主題,但是隨著迭代次數(shù)的增多這種情況會(huì)得到顯著的改善,至少需要設(shè)置20次的迭代,50-100次是更合理的設(shè)置,取決于你的數(shù)據(jù)集。
(3)docConcentration(Dirichlet分布的參數(shù)α):文檔在主題上分布的先驗(yàn)參數(shù)(超參數(shù)α)。當(dāng)前必須大于1,值越大,推斷出的分布越平滑。默認(rèn)為-1,自動(dòng)設(shè)置。
(4)topicConcentration(Dirichlet分布的參數(shù)β):主題在單詞上的先驗(yàn)分布參數(shù)。當(dāng)前必須大于1,值越大,推斷出的分布越平滑。默認(rèn)為-1,自動(dòng)設(shè)置。
(5)checkpointInterval:檢查點(diǎn)間隔。maxIterations很大的時(shí)候,檢查點(diǎn)可以幫助減少shuffle文件大小并且可以幫助故障恢復(fù)。
SPARK中模型的評(píng)估
(1)perplexity是一種信息理論的測(cè)量方法,b的perplexity值定義為基于b的熵的能量(b可以是一個(gè)概率分布,或者概率模型),通常用于概率模型的比較
LDA takes in a collection of documents as vectors of word counts and the following parameters (set using the builder pattern):
(1)k: Number of topics (i.e., cluster centers)
(2):optimizer: Optimizer to use for learning the LDA model, either EMLDAOptimizer or OnlineLDAOptimizer
(3)docConcentration: Dirichlet parameter for prior over documents’ distributions over topics. Larger values encourage smoother inferred distributions.
(4)topicConcentration: Dirichlet parameter for prior over topics’ distributions over terms (words). Larger values encourage smoother inferred distributions.
(5):maxIterations: Limit on the number of iterations. It is important to do enough iterations. In early iterations, EM often has useless topics, but those topics improve dramatically after more iterations. Using at least 20 and possibly 50-100 iterations is often reasonable, depending on your dataset.
(6)checkpointInterval: If using checkpointing (set in the Spark configuration), this parameter specifies the frequency with which checkpoints will be created. If maxIterations is large, using checkpointing can help reduce shuffle file sizes on disk and help with failure recovery.
All of spark.mllib’s LDA models support:
(1)describeTopics: Returns topics as arrays of most important terms and term weights
(2)topicsMatrix: Returns a vocabSize by k matrix where each column is a topic
詳細(xì)代碼注釋
import org.apache.spark.sql.SparkSession
import org.apache.log4j.{Level, Logger}
import org.apache.spark.ml.clustering.LDA
object myClusters {
def main(args:Array[String]){
//屏蔽日志
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
val warehouseLocation = "/Java/Spark/spark-warehouse"
val spark=SparkSession
.builder()
.appName("myClusters")
.master("local[4]")
.config("spark.sql.warehouse.dir",warehouseLocation)
.getOrCreate();
val dataset_lpa=spark.read.format("libsvm")
.load("/spark-2.0.0-bin-hadoop2.6/data/mllib/sample_lda_libsvm_data.txt")
//------------------------------------1 模型訓(xùn)練-----------------------------------------
/**
* k: 主題數(shù),或者聚類(lèi)中心數(shù)
* DocConcentration:文章分布的超參數(shù)(Dirichlet分布的參數(shù)),必需>1.0,值越大,推斷出的分布越平滑
* TopicConcentration:主題分布的超參數(shù)(Dirichlet分布的參數(shù)),必需>1.0,值越大,推斷出的分布越平滑
* MaxIterations:迭代次數(shù),需充分迭代,至少20次以上
* setSeed:隨機(jī)種子
* CheckpointInterval:迭代計(jì)算時(shí)檢查點(diǎn)的間隔
* Optimizer:優(yōu)化計(jì)算方法,目前支持"em", "online" ,em方法更占內(nèi)存,迭代次數(shù)多內(nèi)存可能不夠會(huì)拋出stack異常
*/
val lda=new LDA()
.setK(3)
.setTopicConcentration(3)
.setDocConcentration(3)
.setOptimizer("online")
.setCheckpointInterval(10)
.setMaxIter(100)
val model=lda.fit(dataset_lpa)
/**生成的model不僅存儲(chǔ)了推斷的主題,還包括模型的評(píng)價(jià)方法。*/
//---------------------------------2 模型評(píng)價(jià)-------------------------------------
//模型的評(píng)價(jià)指標(biāo):ogLikelihood,logPerplexity
//(1)根據(jù)訓(xùn)練集的模型分布計(jì)算的log likelihood,越大越好。
val ll = model.logLikelihood(dataset_lpa)
//(2)Perplexity評(píng)估,越小越好
val lp = model.logPerplexity(dataset_lpa)
println(s"The lower bound on the log likelihood of the entire corpus: $ll")
println(s"The upper bound bound on perplexity: $lp")
//---------------------------------3 模型及描述------------------------------
//模型通過(guò)describeTopics、topicsMatrix來(lái)描述
//(1)描述各個(gè)主題最終的前maxTermsPerTopic個(gè)詞語(yǔ)(最重要的詞向量)及其權(quán)重
val topics=model.describeTopics(maxTermsPerTopic=2)
println("The topics described by their top-weighted terms:")
topics.show(false)
/**主題 主題包含最重要的詞語(yǔ)序號(hào) 各詞語(yǔ)的權(quán)重
+-----+-------------+------------------------------------------+
|topic|termIndices |termWeights |
+-----+-------------+------------------------------------------+
|0 |[5, 4, 0, 1] |[0.21169509638828377, 0.19142090510443274]|
|1 |[5, 6, 1, 2] |[0.12521929515791688, 0.10175547561034966]|
|2 |[3, 10, 6, 9]|[0.19885345685860667, 0.18794498802657686]|
+-----+-------------+------------------------------------------+
*/
//(2) topicsMatrix: 主題-詞分布,相當(dāng)于phi。
val topicsMat=model.topicsMatrix
println("topicsMatrix")
println(topicsMat.toString())
/**topicsMatrix
12.992380082908886 0.5654447550856024 16.438154549631257
10.552480038361052 0.6367807085306598 19.81281695100224
2.204054885551135 0.597153999004713 6.979803589429554
*
*/
//-----------------------------------4 對(duì)語(yǔ)料的主題進(jìn)行聚類(lèi)---------------------
val topicsProb=model.transform(dataset_lpa)
topicsProb.select("label", "topicDistribution")show(false)
/** 文檔序號(hào) 各主題的權(quán)重
+-----+--------------------------------------------------------------+
|label|topicDistribution |
+-----+--------------------------------------------------------------+
|0.0 |[0.523730754859981,0.006564444943344147,0.46970480019667477] |
|1.0 |[0.7825074858166653,0.011001204994496623,0.206491309188838] |
|2.0 |[0.2085069748527087,0.005698459472719417,0.785794565674572] |
*/
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
對(duì)參數(shù)進(jìn)行調(diào)試
//對(duì)迭代次數(shù)進(jìn)行循環(huán)
for(i<-Array(5,10,20,40,60,120,200,500)){
val lda=new LDA()
.setK(3)
.setTopicConcentration(3)
.setDocConcentration(3)
.setOptimizer("online")
.setCheckpointInterval(10)
.setMaxIter(i)
val model=lda.fit(dataset_lpa)
val ll = model.logLikelihood(dataset_lpa)
val lp = model.logPerplexity(dataset_lpa)
println(s"$i $ll")
println(s"$i $lp")
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
可以得到如下的結(jié)果:logPerplexity在減小,LogLikelihood在增加,最大迭代次數(shù)需要設(shè)置50次以上,才能收斂:
參考文獻(xiàn):
(1)Spark document
(2)4 步理解主題模型LDA http://www./articles/reaIra6
(3)LDA主題模型與推薦系統(tǒng) http://www.jianshu.com/p/50295398d802
(4)主題模型-LDA淺析 huagong_adu的CSDN博客
http://blog.csdn.net/huagong_adu/article/details/7937616/
(5)大規(guī)模主題模型:對(duì)Spark LDA算法的改進(jìn)
http://www.csdn.net/article/2015-11-02/2826097
(6)Spark LDA pirage的CSDN博客
http://blog.csdn.net/pirage/article/details/50219323
(7)一篇非常簡(jiǎn)潔的但是清晰明了的概念主題模型簡(jiǎn)記
http://www./view/680260
(8) LDA主題模型評(píng)估方法–Perplexity
http://blog.csdn.net/pirage/article/details/9368535
(9) Spark MLlib LDA 源碼解析
http://blog.csdn.net/sunbow0/article/details/47662603
(10)《模式識(shí)別》 希臘Sergios Theodoridis等著
(11) zouxy09的CSDN 從最大似然到EM算法淺解
http://blog.csdn.net/zouxy09/article/details/8537620/
|