转载自 https://blog.csdn.net/qq_23926575/article/details/79472742

1.LDA主题模型困惑度 
这部分参照:LDA主题模型评估方法–Perplexity,不过后面发现这篇文章Perplexity(困惑度)感觉写的更好一点,两篇都是翻译的维基百科。 
perplexity是一种信息理论的测量方法,b的perplexity值定义为基于b的熵的能量(b可以是一个概率分布,或者概率模型),通常用于概率模型的比较 
wiki上列举了三种perplexity的计算: 
1.1 概率分布的perplexity 
公式:  
其中H(p)就是该概率分布的熵。当概率P的K平均分布的时候,带入上式可以得到P的perplexity值=K。 
1.2 概率模型的perplexity 
公式: 
公式中的Xi为测试局,可以是句子或者文本,N是测试集的大小(用来归一化),对于未知分布q,perplexity的值越小,说明模型越好。 
指数部分也可以用交叉熵来计算,略过不表。 
1.3单词的perplexity 
perplexity经常用于语言模型的评估,物理意义是单词的编码大小。例如,如果在某个测试语句上,语言模型的perplexity值为2^190,说明该句子的编码需要190bits 
2.困惑度perplexity公式

其中,p(w)是指的测试集中出现的每一个词的概率,具体到LDA的模型中就是 (z,d分别指训练过的主题和测试集的各篇文档)。分母的N是测试集中出现的所有词,或者说是测试集的总长度,不排重。 
3.计算困惑度的代码

下述代码中加载的.dictionary(字典)、.mm(语料)、.model(模型)文件均为在python下进行lda主题挖掘(二)——利用gensim训练LDA模型中得到的结果,如果文件格式与我不同,说明调用的不是同一个包,代码无法直接使用,可参考代码逻辑,若是已按照python下进行lda主题挖掘(二)——利用gensim训练LDA模型中的方法得到上述文件,可直接调用下述代码计算困惑度。 
PS:将语料经过TFIDF训练模型后计算得到的困惑度要远大于直接进行训练的困惑度(在我这边是这样),应该是正常情况,不必惊慌。

#-*-coding:utf-8-*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os
from gensim.corpora import Dictionary
from gensim import corpora, models
from datetime import datetime
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s : ', level=logging.INFO)def perplexity(ldamodel, testset, dictionary, size_dictionary, num_topics):"""calculate the perplexity of a lda-model"""# dictionary : {7822:'deferment', 1841:'circuitry',19202:'fabianism'...]print ('the info of this ldamodel: \n')print ('num of testset: %s; size_dictionary: %s; num of topics: %s'%(len(testset), size_dictionary, num_topics))prep = 0.0prob_doc_sum = 0.0topic_word_list = [] # store the probablity of topic-word:[(u'business', 0.010020942661849608),(u'family', 0.0088027946271537413)...]for topic_id in range(num_topics):topic_word = ldamodel.show_topic(topic_id, size_dictionary)dic = {}for word, probability in topic_word:dic[word] = probabilitytopic_word_list.append(dic)doc_topics_ist = [] #store the doc-topic tuples:[(0, 0.0006211180124223594),(1, 0.0006211180124223594),...]for doc in testset:doc_topics_ist.append(ldamodel.get_document_topics(doc, minimum_probability=0))testset_word_num = 0for i in range(len(testset)):prob_doc = 0.0 # the probablity of the docdoc = testset[i]doc_word_num = 0 # the num of words in the docfor word_id, num in doc:prob_word = 0.0 # the probablity of the word doc_word_num += numword = dictionary[word_id]for topic_id in range(num_topics):# cal p(w) : p(w) = sumz(p(z)*p(w|z))prob_topic = doc_topics_ist[i][topic_id][1]prob_topic_word = topic_word_list[topic_id][word]prob_word += prob_topic*prob_topic_wordprob_doc += math.log(prob_word) # p(d) = sum(log(p(w)))prob_doc_sum += prob_doctestset_word_num += doc_word_numprep = math.exp(-prob_doc_sum/testset_word_num) # perplexity = exp(-sum(p(d)/sum(Nd))print ("the perplexity of this ldamodel is : %s"%prep)return prepif __name__ == '__main__':middatafolder = r'E:\work\lda' + os.sepdictionary_path = middatafolder + 'dictionary.dictionary'corpus_path = middatafolder + 'corpus.mm'ldamodel_path = middatafolder + 'lda.model'dictionary = corpora.Dictionary.load(dictionary_path)corpus = corpora.MmCorpus(corpus_path)lda_multi = models.ldamodel.LdaModel.load(ldamodel_path)num_topics = 50testset = []# sample 1/300for i in range(corpus.num_docs/300):testset.append(corpus[i*300])prep = perplexity(lda_multi, testset, dictionary, len(dictionary.keys()), num_topics)

Python中LDA 计算 perplexity来确定主题数相关推荐

  1. Python中用于计算对数的log()方法

    本文转载至:http://www.jb51.net/article/66130.htm 这篇文章主要介绍了Python中用于计算对数的log()方法,是Python入门基础中的必会的方法,需要的朋友可 ...

  2. LDA计算 perplexity(困惑度)确定主题个数(代码)

    为了计算LDA 的困惑度,费劲千辛万苦,终于有所收获,以此记录. 本篇文章主要介绍perplexity的计算方式,并未涉及过多的困惑度原理,想了解更多原理部分,请移步perplexity介绍 本文主要 ...

  3. python中的计算符号

    1.算数计算符号:+ - * / //(取整) %(取余) **(次方) 1 >>> 6+8 2 14 3 >>> 9-3 4 6 5 >>> 3 ...

  4. python中怎么计算_python中的加减乘除运算

    python中的加减乘除运算,是学习python入门的基础,是以后进行数学计算的关键部分.包括运算表达式的写法,运算规则,加减乘除,求余,求商等等. 工具/原料 python 电脑 方法/步骤 1 1 ...

  5. python做电磁场计算_加速Python中的计算(模拟磁场中的粒子)

    用Python编写的程序速度有问题.该程序是"模拟磁场中的铁磁颗粒",更具体地说是磁惰性液体.该程序可以工作,但与用C ++编写的相同程序相比非常缓慢,但是我用Python编写了一 ...

  6. Python 中 float 计算精度问题

    问题 浮点数不能精确的表示十进制数,并且即使是最简单的数学运算也会产生误差.该错误是由于浮点数的存储方式引起的. 如在Python中,浮点数( float )默认精度为17位,在执行简单的浮点数加法计 ...

  7. python中math计算平方根的函数_Python中利用sqrt()方法进行平方根计算的教程

    Python中利用sqrt()方法进行平方根计算的教程 这篇文章主要介绍了Python中利用sqrt()方法进行平方根计算的教程,是Python学习的基础知识,需要的朋友可以参考下 sqrt()方法返 ...

  8. python指数运算函数_分享Python中用于计算指数的exp()方法实例教程

    exp()方法返回指数x: ex. 语法 以下是exp()方法的语法:import math math.exp( x ) 注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math ...

  9. python中math计算平方根的函数_Python中Numpy和Math常用函数性能对比

    numpy是如今数据分析领域离不开的Python第三方工具库,它和Python自带的math库中都有一些基础的数学函数,比如指数.对数.三角函数等.在需要使用这些函数的时候,到底该用numpy还是ma ...

最新文章

  1. 什么限制了GNN的能力?首篇探究GNN普适性与局限性的论文出炉
  2. [以太坊源代码分析] II. 数据的呈现和组织,缓存和更新
  3. GDCM:gdcm::CodeString的测试程序
  4. 北京供销大数据集团发布SinoBBD Cloud 一体化推动产业云发展
  5. C++学习之路 | PTA乙级—— 1040 有几个PAT (25 分)(精简)
  6. less编译工具koala(考拉)和rem的使用
  7. 串口服务器芯片方案商,串口服务器芯片
  8. WINDOW10初步使用
  9. python 爬虫 美女_Python3爬取美女妹子图片
  10. 进击----Helix QAC自动化静态测试
  11. sql 创建学生表 课程表 成绩表
  12. Excel表格规范录入数据
  13. 开发人员的windows工具箱
  14. U盘安装Win Server 2008
  15. Android优化篇之布局优化
  16. 自动阅读 到底 能不能赚钱
  17. 文件夹同名EXE病毒
  18. 松贷后房价涨跌内幕 吃透楼市12个规律不吃亏
  19. 道通转债,微芯转债,博22转债上市价格预测
  20. [转帖]关于 /dev/urandom 的流言终结 | Linux 中国

热门文章

  1. Scanner使用方法
  2. vmware中linux使用gparted调整磁盘大小并设置swap分区
  3. 各类视频教程--米学网
  4. 使用Java Swing实现QQ管家界面
  5. 极客日报:百度网盘青春版将不限速;Bing在中国内地暂停“搜索自动建议”功能30天;新款iPhone SE将支持5G
  6. 工控安全,纵横网络靶场部分WP(一)
  7. 减一天_减腹部小运动,做完后一天瘦一斤,还你健康还你美丽
  8. 日趋“四低”的智能手环,出路在哪?
  9. python argparse type_python argparse详解
  10. 威马汽车欲曲线上市:沈晖已提前持股并任职,销量垫底、员工降薪