##偽**
#輸入:文章集合(分詞處理後),k(類的個數)
輸出:已經隨機分派了一次的lda模型
begin
申請幾個統計量:
p 概率向量 維度:k
nwsum 每個類上的詞的總數 維度:k
phi 類->詞的概率分布 維度:k*m
#初始化隨機分配類
for x in
統計ndsum[文章id][詞的個數]
for y in
給所有詞隨機分派乙個類
詞在此類上的分布數目+1此文章中此類的詞的個數+1此類的總詞數 +1end
##實現**片段,更詳細看github專案
#class
ldamodel(object):
def__init__
(self,dpre):
self.dpre = dpre #
獲取預處理引數##
模型引數
#聚類個數k,迭代次數iter_times,每個類特徵詞個數top_words_num,超引數α(alpha) β(beta)
# self.k =k
self.beta =beta
self.alpha =alpha
self.iter_times =iter_times
self.top_words_num =top_words_num
##檔案變數
#分好詞的檔案trainfile
#詞對應id檔案wordidmapfile
#文章-主題分布檔案thetafile
#詞-主題分布檔案phifile
#每個主題topn詞檔案topnfile
#最後分派結果檔案tassginfile
#模型訓練選擇的引數檔案paramfile
# self.wordidmapfile =wordidmapfile
self.trainfile =trainfile
self.thetafile =thetafile
self.phifile =phifile
self.topnfile =topnfile
self.tassginfile =tassginfile
self.paramfile =paramfile
#p,概率向量 double型別,儲存取樣的臨時變數
#nw,詞word在主題topic上的分布
#nwsum,每各topic的詞的總數
#nd,每個doc中各個topic的詞的總數
#ndsum,每各doc中詞的總數
self.p =np.zeros(self.k)
self.nw = np.zeros((self.dpre.words_count,self.k),dtype="
int"
)
self.nwsum = np.zeros(self.k,dtype="
int"
)
self.nd = np.zeros((self.dpre.docs_count,self.k),dtype="
int"
)
self.ndsum = np.zeros(dpre.docs_count,dtype="
int"
)
self.z = np.array([ [0 for y in xrange(dpre.docs[x].length)] for x in xrange(dpre.docs_count)]) #
m*doc.size(),文件中詞的主題分布
#隨機先分配型別
for x in
xrange(len(self.z)):
self.ndsum[x] =self.dpre.docs[x].length
for y in
xrange(self.dpre.docs[x].length):
topic = random.randint(0,self.k-1)
self.z[x][y] =topic
self.nw[self.dpre.docs[x].words[y]][topic] += 1self.nd[x][topic] += 1self.nwsum[topic] += 1self.theta = np.array([ [0.0 for y in xrange(self.k)] for x in
xrange(self.dpre.docs_count) ])
self.phi = np.array([ [ 0.0 for y in xrange(self.dpre.words_count) ] for x in xrange(self.k)])
##偽**
#輸入:初始化後的lda_model,迭代次數iter_times,超引數α、β,聚類個數k
begin
for i in
迭代次數:
for m in
for v in
取topic =z[m][v]
令nw[v][topic]、nwsum[topic]、nd[m][topic]的統計量均-1計算概率p
#p為此詞屬於每個topic的概率
for k in (1,類的個數-1):
p[k] += p[k-1]
再隨機分派一次,記錄被分派的新的topic
令nw[v][new_topic]、nwsum[new_topic]、nd[m][new_topic]的統計量均+1
#迭代完成後
輸出模型
end
#**片段
defsampling(self,i,j):
topic =self.z[i][j]
word =self.dpre.docs[i].words[j]
self.nw[word][topic] -= 1self.nd[i][topic] -= 1self.nwsum[topic] -= 1self.ndsum[i] -= 1vbeta = self.dpre.words_count *self.beta
kalpha = self.k *self.alpha
self.p = (self.nw[word] + self.beta)/(self.nwsum + vbeta) *\
(self.nd[i] + self.alpha) / (self.ndsum[i] +kalpha)
for k in xrange(1,self.k):
self.p[k] += self.p[k-1]
u = random.uniform(0,self.p[self.k-1])
for topic in
xrange(self.k):
if self.p[topic]>u:
break
self.nw[word][topic] +=1self.nwsum[topic] +=1self.nd[i][topic] +=1self.ndsum[i] +=1
return topic
此實現為最基礎的lda模型實現,聚類個數k,和超引數的設定要靠人工輸入,自動計算的版本會在以後研究。
主題分析模型LDA的spark實現
主體分析模型主要有plsa probabilistic latent semantic anlysis,概率引語義分析 和lda latent dirichlet allocation,隱含狄利克雷分布 在此暫時介紹lda的spark實現。主題分析模型自動分析每個文件,統計文件內的詞語,根據統計的資...
lda 協方差矩陣 LDA模型
lda是一種文件主題生成模型,也稱為乙個三層貝葉斯概率模型,包含詞 主題和文件三層結構。作為一種非監督機器學習技術,可以用來識別大規模文件集或語料庫中潛藏的主題資訊。它採用了詞袋的方法,這種方法將每一篇文件視為乙個詞頻向量,從而將文字資訊轉化為了易於建模的數字資訊。但是詞袋方法沒有考慮詞與詞之間的順...
LDA主題模型
先定義一些字母的含義 lda以文件集合d作為輸入 會有切詞,去停用詞,取詞幹等常見的預處理,略去不表 希望訓練出的兩個結果向量 設聚成k個topic,voc中共包含m個詞 lda的核心公式如下 p w d p w t p t d 直觀的看這個公式,就是以topic作為中間層,可以通過當前的 d和 t...