聚類算法之LDA

        因工作需要,對2000多篇文件進行聚類,由於文本長度較短,所以聚類效果不好,隨着主題數量的增加,困惑度一直增加,並未出現困惑度減少的現象,讓我一直懷疑自己的做法是否正確。後來通過對通過標題+文本的拼接,纔出現較好的收斂;

perplexity(困惑度)
在對文本的主題特徵進行研究時,要指定LDA生成的主題的數目,而一般的解決方法是使用perplexity來計算其中z是主題,w是文檔,gamma是訓練集學出來的文本-主題分佈,所以perplexity的上半部分就是生成整個文檔的似然估計(表示訓練集訓練出的參數的生成能力)的負值,由於概率取值範圍爲【0,1】,按照對數函數的定義,分子值是一個大數,而分母是整個測試集的單詞數目。
也就是說模型生成能力越強,perplexity值越小。perplexity=exp^{ - (∑log(p(w))) / (N) }
其中,P(W)是指的測試集中出現的每一個詞的概率,具體到LDA的模型中就是P(w)=∑z p(z|d)*p(w|z)【z,d分別指訓練過的主題和測試集的各篇文檔】。p(z|d)表示的是一個文檔中每個主題出現的概率,p(w|z)表示的是詞典中的每一個單詞在某個主題下出現的概率。分母的N是測試集中出現的所有詞,或者說是測試集的總長度,不排重。

sklearn中關於perplexity的計算:

Perplexity is defined as exp(-1. * log-likelihood per word)
if sub_sampling:
    word_cnt = X.sum() * (float(self.total_samples) / current_samples)
else:
    word_cnt = X.sum()
perword_bound = bound / word_cnt
return np.exp(-1.0 * perword_bound)

相關代碼:

lda_cv = LatentDirichletAllocation(n_components=i, max_iter=200, learning_offset=50., learning_method='online',
                                   random_state=0).fit(cv_features)
print('--------------Lda-cv_features 主題--------------------------------')

result_list = display_topics(lda_cv, cv_feature_names, no_top_words)
perplexity = lda_cv.perplexity(cv_features)
print(perplexity)
topic_dist = lda_cv.transform(cv_features)
topic_dist = topic_dist.tolist()
print(topic_dist[:3])
old_df["聚類類別"] = [num_list.index(max(num_list)) for num_list in topic_dist]

 

 

發佈了21 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章