Mahout算法分析
輸入數據格式
為
算法相關參數的詳細說明(不包括hadoop運行參數)
項目中的所有參數設置與mahout-0.9目錄下examples/bin/cluster-Reuters . sh中的147-172行相同,即
$ SCOUT cv B- I $ { WORK _ DIR }/$ { ROWID _ MATRIX _ DIR }/MATRIX-o $ { WORK _ DIR }/$ { LDA _ DIR }-k 20-ow-x 20-dict $ { WORK _ DIR }/$ { DICTIONARY _ FILES }-dt $ { WORK _ DIR }/$ { LDA _ TOPICS _ DIR }-mt $ { WORK _ DIR }/$ { LDA _ MODEL _ DIR }
Input -輸入數據的hdfs路徑,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-out-matrix-debug/matrix。
Dt -文檔主題輸出路徑,保存每個文檔對應主題的概率,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-LDA-topics。
mt - model的路徑,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-LDA-debug。
K -要學習的主題數量,這裏設置為20。
X -模型的叠代次數,即生成最終模型需要多少次叠代。默認值為20。
Seed - Random seed,生成初始readModel時的種子,默認值為System.nanoTime()% 10000。
Dict - dictionary路徑,這裏是/home/Hadoop-user/scout _ workspace/scout/dataset/Reuters-out-seqdir-sparse-LDA/dictionary . file-*
a-對於文檔/主題分布的平滑,文檔/主題分布的平滑系數,默認為1.0E-4。
E-平滑對於topic/$ TERM分布,默認情況下,topic/$ TERM分布的平滑系數為1.0E-4。
至於A和E,根據描述,A和E的合適值是k/50(k是話題數),但是這個網頁仍然保留了對mahout ldatopics命令的介紹,而Mahout 0.8和Mahout 0.9沒有這個命令,所以應該是老內容了,所以還是基於cluster-reuters.sh中的設置,也就是采用了默認值。
mipd——這個參數非常重要。對於每個文檔程序,RandomSeed用於生成初始readModel,然後執行mipd叠代來計算用於更新的最終模型。這裏的默認值是10次。
LDA算法的程序分析
該算法的壹般流程如下
1.解析參數和配置設置
2.讀取模型(第壹次運行時沒有這個過程)
如果hfds上有壹些模型,程序會讀取最後壹個模型,並將這個模型作為初始readModel繼續算法叠代,也就是說有壹個類似斷電重啟的機制。
3.運行算法叠代(映射器過程)以生成LDA模型。
這個過程是最復雜的階段,很多地方我不太懂。我會盡力解釋。
首先,映射器,CachingCVB0Mapper,顧名思義,是壹個可以緩存的映射器,表現在其readModel的選擇上。如果目錄中沒有模型,readModel用RandomSeed初始化,否則讀取最新的模型。程序將model分為readModel和writeModel,兩者都是TopicModel類,由ModelTrainer調度和管理。
CachingCVB0Mapper的整個過程如下圖所示(清晰大圖見附件)。
在上述總體框架下,mahout程序使用CVB0算法計算LDA模型。在映射過程中,叠代求解向量docTopic和矩陣docTopicModel。計算每個文檔的docTopicModel,並在更新writeModel階段添加docTopicModel矩陣的向量。經過所有的映射過程,得到了整個語料庫的docTopicModel矩陣。最後,主題的索引被用作鍵,矩陣docTopicModel被寫為清除過程中的值。該過程中涉及的算法如下
CVB0算法分析圖(清晰大圖見附件)
4.利用生成的LDA模型推導出話題的概率分布。
算法總結
可以看出,算法的本質是貝葉斯公式和EM算法的結合。
E-process就是假設壹個均勻分布且歸壹化的話題概率分布向量docTopics,用這個值通過貝葉斯公式計算出詞-話題概率分布矩陣docTopicModel(見CVB0算法分析圖第壹步)。
m過程是根據生成的docTopicModel重新計算CVB0算法分析圖中的2、3、4、5步,得到新的docTopics。
然後重復E-M過程n次,得到收斂的docTopics和docTopicModel,其中docTopicModel可以用來更新lda模型,docTopics是我們聚類所需的主題概率分布向量。
算法的後記
有幾個問題沒有解決。
1.在mahout中,docTopicModel是根據下面的公式計算的。
double termTopicLikelihood =
(topictermrow . get(termIndex)+eta)*(topicWeight+alpha)/(topic sum+eta * num terms);
問題是這個公式在貝葉斯公式中增加了幾個平滑系數項,這種寫法的理論依據在哪裏,出自哪本書或哪篇論文,平滑系數eta和alpha分別代表什麽,這兩個系數如何選擇。
2.CVB0算法分析了圖中第二步歸壹化的理論基礎,即為什麽需要歸壹化。
3.3.update writeModel過程中topicTermCounts的計算
也就是為什麽P (topic | $ TERM)要在每壹張地圖上累加,這個還沒有完全理解。
項目運行環境
hadoop-1.2.1
sqoop-1.4.4
看象人-0.9
環境的安裝部署請參考相關文章,這裏就不贅述了。以上三個軟件都部署在/home/Hadoop-user/mahout _ workspace/目錄下。另外,自己寫的scout項目部署在目錄/home/Hadoop-user/scout _ workspace/
項目代碼
項目代碼已經放到Github上了。有興趣的同學可以下載看看,重點是bin目錄下的腳本文件和驅動、導出、解析器等幾個包中的java文件。
整個項目架構的分析
這個項目的初始數據保存在MySQL中。算法分析需要map/reduce進程和hdfs文件系統的參與,最終結果更新到MySQL。整個過程如圖。