2301_81457169 2024-02-07 12:15 采纳率: 0%
浏览 115

求!!困惑度曲线一直下降,这是正常现象吗?[LDA模型]

img


如图,下面代码运行结束后就出现了这种图像,一直是下降的,而且数值还很小,这种结果正常吗?还是说是因为代码出现了问题?

这是代码:

import gensim
from gensim import corpora, models
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
from nltk.tokenize import RegexpTokenizer
from nltk.stem.porter import PorterStemmer
import math
# 准备数据
PATH = "分词文本.txt"  # 已经进行了分词的文档(如何分词前面的文章有介绍)

file_object2 = open(PATH, encoding='utf-8', errors='ignore').read().split('\n')
data_set = []  # 建立存储分词的列表
for i in range(len(file_object2)):
    result = []
    seg_list = file_object2[i].split()  # 读取没一行文本
    for w in seg_list:  # 读取每一行分词
        result.append(w)
    data_set.append(result)
print(data_set)  # 输出所有分词列表

dictionary = corpora.Dictionary(data_set)  # 构建 document-term matrix
corpus = [dictionary.doc2bow(text) for text in data_set]
Lda = gensim.models.ldamodel.LdaModel  # 创建LDA对象


# 计算困惑度
def perplexity(num_topics):
    ldamodel = Lda(corpus, num_topics=num_topics, id2word=dictionary, passes=50)  # passes为迭代次数,次数越多越精准
    print(ldamodel.print_topics(num_topics=num_topics, num_words=20))  # num_words为每个主题下的词语数量
    print(ldamodel.log_perplexity(corpus))
    return ldamodel.log_perplexity(corpus)


# 绘制困惑度折线图
x = range(1, 20)  # 主题范围数量
y = [math.e**perplexity(i) for i in x]
plt.plot(x, y)
plt.xlabel('主题数目')
plt.ylabel('困惑度大小')
plt.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
plt.title('主题-困惑度变化情况')
plt.show()

```

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-07 12:16
    关注

    引自免费微信小程序:皆我百晓生

    在LDA(Latent Dirichlet Allocation)模型中,困惑度(Perplexity)是一个常用的评估模型性能的指标。它衡量的是模型对于未见过的数据集的预测能力,或者说是模型对数据的拟合程度。简单来说,困惑度越低通常意味着模型对数据的描述越好。

    在你的代码中,你绘制了随着主题数量变化的困惑度曲线。当你观察到困惑度一直下降时,这并不一定意味着这是正常现象。理想情况下,在某个主题数量下,困惑度会达到一个最低点,之后如果继续增加主题数量,由于过拟合等问题,困惑度可能会开始上升或不再显著下降。

    根据你的代码,perplexity函数计算并返回给定主题数量下的模型困惑度。然后通过遍历1到20的主题数量,并计算每个数量下的困惑度,最后绘制出困惑度随主题数量变化的曲线。

    对于困惑度持续下降的现象:

    1. 模型选择与优化不足: 如果困惑度持续下降,可能是因为模型在当前参数设置下没有达到最优状态。例如,尽管增加了主题数量,但迭代次数(passes)并未相应增加以确保模型充分训练和收敛。

    2. 过拟合风险: 当主题数量过多时,模型可能过于复杂,以至于过度解释数据,即出现过拟合问题。然而,如果你的数据集较小或者文档-词汇矩阵较为稀疏,这种过拟合可能不会立即体现在困惑度上,反而表现为困惑度继续下降。

    3. 数据特性: 数据本身的特性也可能导致这种情况,例如数据集中的文档间差异很小,或者潜在的主题结构本身就非常丰富,以至于增加主题数可以不断降低困惑度。

    为了更好地理解这个现象,你可以尝试以下改进措施:

    • 增大passes参数:让模型进行更多次迭代,看是否能在某个主题数下找到困惑度的拐点。
    • 交叉验证:使用交叉验证方法来评估不同主题数量下的模型性能,而不是只依赖于困惑度这一单一指标。
    • 结合其他评估指标:除了困惑度外,还可以考虑使用主题一致性、互信息等其他指标来综合评价模型效果。

    模拟图示例(文字描述):

    主题数量 -> | 1 | 2 | 3 | ... | 15 | 16 | 17 | ... | 20 |
    困惑度    -> | H | G | F | ... | D  | C  | B  | ... | A  |
    
    注:A < B < C < D ... < G < H,表示困惑度逐渐减小
    

    请注意,上述内容为纯文字模拟图,实际操作中请根据实际情况调整模型参数及观察结果。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月7日