当前位置:   article > 正文

聚类算法之LDA_lda困惑度一直上升

lda困惑度一直上升

        因工作需要,对2000多篇文件进行聚类,由于文本长度较短,所以聚类效果不好,随着主题数量的增加,困惑度一直增加,并未出现困惑度减少的现象,让我一直怀疑自己的做法是否正确。后来通过对通过标题+文本的拼接,才出现较好的收敛;

  1. perplexity(困惑度)
  2. 在对文本的主题特征进行研究时,要指定LDA生成的主题的数目,而一般的解决方法是使用perplexity来计算其中z是主题,w是文档,gamma是训练集学出来的文本-主题分布,所以perplexity的上半部分就是生成整个文档的似然估计(表示训练集训练出的参数的生成能力)的负值,由于概率取值范围为【0,1】,按照对数函数的定义,分子值是一个大数,而分母是整个测试集的单词数目。
  3. 也就是说模型生成能力越强,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)
  1. if sub_sampling:
  2. word_cnt = X.sum() * (float(self.total_samples) / current_samples)
  3. else:
  4. word_cnt = X.sum()
  5. perword_bound = bound / word_cnt
return np.exp(-1.0 * perword_bound)

相关代码:

  1. lda_cv = LatentDirichletAllocation(n_components=i, max_iter=200, learning_offset=50., learning_method='online',
  2. random_state=0).fit(cv_features)
  3. print('--------------Lda-cv_features 主题--------------------------------')
  4. result_list = display_topics(lda_cv, cv_feature_names, no_top_words)
  5. perplexity = lda_cv.perplexity(cv_features)
  6. print(perplexity)
  1. topic_dist = lda_cv.transform(cv_features)
  2. topic_dist = topic_dist.tolist()
  3. print(topic_dist[:3])
  4. old_df["聚类类别"] = [num_list.index(max(num_list)) for num_list in topic_dist]

 

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号