在上一篇文章的最后,我们生成了15个模型(主题数分别从1到15),然鹅,问题来了,到底多少个主题,才是最好的主题模型呢?到底有没有可以评价一个模型好坏的标准呢?答案肯定是有的,而且还不止一个呢!
先说一个,我最开始做实验的时候用的,肉眼观察法。即通过经验来判断选择几个主题(靠猜),显然这是一个不错的方法。我当时和老大说完,老大一直夸我聪明,并打了我一顿,不说了,医院的WiFi不大好用。
目前比较成熟的判断一个LDA模型是否合理的标准一般有两个,一个是一致性,另一个是困惑度。(因为咱们这篇文章是应用向的,所以一致性和困惑度的计算公式,就不列出来了。有想了解的同学,可以去网上查相关资料或者关注并私信我们。)通俗一点解释下就是,困惑度表示的对于一篇文章来说,我们有多不确定它是属于某个主题的。即主题的个数越多,模型的困惑度就越低,但是注意一点,当主题数很多的时候,生成的模型往往会过拟合,所以不能单纯依靠困惑度来判断一个模型的好坏。这时候我们的另一个判断标准就有作用了。biubiu~一致性!当我们从困惑度了解一个主题数目大致的范围的时候,我们就可以用一致性从这个范围内选择更合适的主题了。


主题个数的选择

有了上面的简单的介绍。我们就可以~~苦逼~~快乐的做实验了。实验思路如下,计算每个模型的困惑度,根据困惑度的实验结果,在合理的范围内进行一致性实验。最后得出效果最好主题个数。
话不多说,计算困惑度也好,计算一致性也罢。我们首先得有模型呀,巧妇难为无米之炊,(如果有的同学不知道怎么生成模型的话,可以去看上一篇文章,那里介绍怎么生成模型,几乎每一行代码都有解释,一定可以看懂的。)所以,我们首先读取上一次训练好的的模型 : lda = models.ldamodel.LdaModel.load(model_name)
接下来就是重点了。计算困惑度和一致性。perplexity = lda.log_perplexity(corpus)cv_tmp = CoherenceModel(model=lda, texts=texts, dictionary=dictionary, coherence='c_v')
好了这篇文章结束了,大家散了吧!!没错,我就是这么短
为了看起来更炫酷一点,我们计算出来15个模型的困惑度并将其可视化表示。这里几乎没有难点,就一个for循环就可以搞定,然后就又到了python时刻(调包),以主题数为横坐标,以困惑度为纵坐标,画图。接下来是代码时间!

def perplexity_visible_model(self, topic_num, data_num):'''@description: 绘制困惑度-主题数目曲线@param {type} @return: '''# texts = self.fenci_data()_, corpus = self.weibo_lda()x_list = []y_list = []for i in range(1,topic_num):model_name = './lda_{}_{}.model'.format(i, data_num)try:lda = models.ldamodel.LdaModel.load(model_name)-perplexity = lda.log_perplexity(corpus)print(perplexity)x_list.append(i)y_list.append(perplexity)except Exception as e:print(e)plt.xlabel('num topics')plt.ylabel('perplexity score')plt.legend(('perplexity_values'), loc='best')plt.show()

我把代码跑出来的图贴在这里:

得到这个结果后,我们便可以分析数据了。由前面的分析,我们知道,困惑度是越低越好的,那么我们应该选择主题越多越好,但是,显然这是不对的。因为当主题太多时,我们的模型已经过拟合了。我们发现当主题个数超过8时,模型的困惑度就会一直下降。所以,我们在1-7的主题个数中考虑最终的主题个数。
在已经计算过困惑度后,我们在之前实验的基础上计算一致性并绘制图像,选择最合适的主题。又到了快乐的代码时间:

def visible_model(self, topic_num, data_num):'''@description: 可视化模型@param :topic_num:主题的数量@param :data_num:数据的量@return: 可视化lda模型'''dictionary, _ = self.weibo_lda()texts = self.fenci_data()x_list = []y_list = []for i in range(1,topic_num):model_name = './lda_{}_{}.model'.format(i, data_num)try:lda = models.ldamodel.LdaModel.load(model_name)cv_tmp = CoherenceModel(model=lda, texts=texts, dictionary=dictionary, coherence='c_v')x_list.append(i)y_list.append(cv_tmp.get_coherence())except:print('没有这个模型:{}'.format(model_name))plt.plot(x_list, y_list)plt.xlabel('num topics')plt.ylabel('coherence score')plt.legend(('coherence_values'), loc='best')plt.show()

在上面的图像中,我们可以发现,当主题选择4时,模型的得分最高,所以,正常来说,我们应该选择4个主题的模型,那么选择4个主题到底对不对呢。它生成的模型又是什么样子的呢?有没有办法知道呢?


可视化模型

为了回答上面的问题。我们又开始了快乐的调包生活(没错,只有你想不到,没有python做不到!),生成模型的重点代码,我先给大家单独写出来vis_data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)pyLDAvis.show(vis_data, open_browser=False)
这两行代码就是生成可视化模型的核心代码了。也很简单吧。完整的函数以及生成的模型如下:

def visibel(self, topic_num, data_num):'''@description: 可视化模型@param {type} @return: '''dictionary, corpus = self.weibo_lda()model_name = './lda_{}_{}.model'.format(topic_num, data_num)lda = models.ldamodel.LdaModel.load(model_name)vis_data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)pyLDAvis.show(vis_data, open_browser=False)

代码中的变量,都是之前提过的,哈哈哈哈,我猜你忘记了,我再写一遍,dictionary和corpus分别是生成的字典和词袋。lda是读出来的模型。这样依赖,可视化的模型就绘制好了。

正常来说,我们就可以分析数据了,但是我知道你可能有几个问题,首先,这个图花里花哨的,每个部分都是啥意思呀? 其次,我怎么知道这个主题个数就是最好的,我要看7个主题的,8个主题的!


数据分析

我们先解释上面的图的含义,首先,图的左侧表示的是主题。有几个泡泡就有几个主题。上面我们就有4个主题。图的右侧表示的是每个主题中常出现的单词,就是我们计算一致性和困惑度时用到的。一个好的模型,上面的圈圈(圈圈圆圆圈圈,天天年年天天的我,看着你的脸~ 咦?为什么我可以发语音)之间应该是不重叠的。即表示各个主题之间可以完美的分隔开。从图中可以看出。我们的模型还算不错,为了对比,我又跑了个七个主题的可视化模型。

大家可以看到,7个主题的效果确实没有4个主题的好!


接下来就到了最后一步了。我们需要知道,这几个主题想表达的是什么呢?每个主题都该有自己核心意义吧。这就到了大家小学就学过的看图说话了。我作为5年4班的体育委员,先给大家说下我自己的看法,大家自己训练好模型后,就可以自由发挥了。
主题一的内容是,住院患者对治愈的渴望,对医院外面世界的向往。在这场灾难中亲情的体现。是个人角度
主题二的内容是,则是从国家角度出发。在这场战疫中。国家的作用。全民抗疫,无数的物资流入疫情严重地区
主题三的内容是,这场疫情中,确诊病例,疑似病例的变化情况
主题四的内容是,受灾严重的一些地区相关微博

lda主题模型困惑度_主题模型(三):LDA主题个数选择相关推荐

  1. lda主题模型困惑度_机器学习-LDA主题模型笔记

    LDA常见的应用方向: 信息提取和搜索(语义分析):文档分类/聚类.文章摘要.社区挖掘:基于内容的图像聚类.目标识别(以及其他计算机视觉应用):生物信息数据的应用; 对于朴素贝叶斯模型来说,可以胜任许 ...

  2. LDA主题模型困惑度计算

    对于LDA模型,最常用的两个评价方法困惑度(Perplexity).相似度(Corre). 其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度 ...

  3. lda主题模型困惑度_Perplexity(困惑度)详解

    引子: 今年上半年,我报名参加了julyEdu的三月份机器学习班,在班上我自告奋勇地分享了下自己对LDA模型中几个重要问题,比如perplexity,likelihood和fold-in query的 ...

  4. lda主题模型困惑度_r语言lda主题模型代码 lda主题模型 案例分析

    r语言做灰色预测模型代码为什么会出错? 我正在MATLAB下编写一个Grey system的函数库, 我想其他的网友也做过类似的工作吧. 灰色模型的MATLAB求解代码应该很容易找到吧.如果不想用MA ...

  5. 机器学习模型 知乎_机器学习-模型选择与评价

    交叉验证 首先选择模型最简单的方法就是,利用每一种机器学习算法(逻辑回归.SVM.线性回归等)计算训练集的损失值,然后选择其中损失值最小的模型,但是这样是不合理的,因为当训练集不够.特征过多时容易过拟 ...

  6. arima模型 白噪声检验_白噪声模型

    arima模型 白噪声检验 White noise are variations in your data that cannot be explained by any regression mod ...

  7. kmeans及模型评估指标_机器学习模型评估指标总结

    常用机器学习算法包括分类.回归.聚类等几大类型,以下针对不同模型总结其评估指标 一.分类模型 常见的分类模型包括:逻辑回归.决策树.朴素贝叶斯.SVM.神经网络等,模型评估指标包括以下几种: (1)二 ...

  8. 数仓主题表怎么设计_陶瓷企业展厅设计主题风格怎么确定?

    陶瓷是文化的结晶,艺术的精华.陶瓷的发明,是人类社会发展史上划时代的标志.当前,越来越多的陶瓷企业开始通过打造数字展厅来树立品牌形象,这一便捷的宣传推广形式,向消费者传达着陶瓷品牌个性.那么,在陶瓷企 ...

  9. python时间序列模型有哪些_时间序列模型(ARIMA)

    时间序列简介 时间序列 是指将同一统计指标的数值按其先后发生的时间顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测. 常用的时间序列模型 常用的时间序列模型有四种:自回归模 ...

最新文章

  1. Ubuntu 安装mysql和简单操作
  2. 【PAT乙】1085 PAT单位排行 (25分) map排序
  3. 国外的程序员都是什么样的状态?硅谷程序员:不加班,不穿女装
  4. arcobjects java开发_ArcGIS Engine SDK for Java 最小示例学习
  5. stm32是以c语言来编程吗,stm32用什么语言编程
  6. Unity URP/SRP可编程渲染管线
  7. n6 tenda 固件_腾达 Tenda N6 刷 TTDW 说明
  8. 关于CS1.6中模型导出到3dsmax
  9. 【游戏】LOL只能攻击英雄,点不了小兵解决办法
  10. 天龙 - Terrain
  11. docker build 18.04 镜像出现 Configuring tzdata - Please select the geographic area in which you live
  12. CentOS 命令使用
  13. C语言ctime函数
  14. BGD 通信15-1 150206102 王嘉良 DDS信号发生器
  15. 小学计算机集体备课活动记录,小学科学集体备课活动记录
  16. 全国计算机四级之网络工程师知识点(一)
  17. mybatis的CUID
  18. 英语发音技巧,让你的发音更地道!!!
  19. python自动截图保存(网课利器)
  20. 程序员课余知识的补给站

热门文章

  1. 详解之-js闭包的用途
  2. 【Lintcode】076.Longest Increasing Subsequence
  3. hbm配置文件 hibernate中
  4. hdu 3592 差分约束
  5. HDU1286 找新朋友【欧拉函数】
  6. 第二届太原理工大学程序设计新生赛预赛(公开赛)题解
  7. Bailian2973 Skew数【进制】
  8. POJ3292 UVA11105 Semi-prime H-numbers【筛法打表】
  9. 【辨异】—— 可见 vs. 不可见
  10. 各地特色美食与点菜的艺术