gensim库_LDA主题模型困惑度Perplexity计算

文章介绍了如何利用gensim库计算LDA主题模型的困惑度。困惑度是评估概率模型的一种方法,文中提到虽然gensim源码中已有计算过程,但需要通过修改源代码来显示结果。

LDA主题模型困惑度Perplexity计算

perplexity是一种信息理论的测量方法,b的perplexity值定义为基于b的熵的能量(b可以是一个概率分布,或者概率模型),通常用于概率模型的比较。
该部分内容可参考Perplexity(困惑度)python下进行lda主题挖掘(三)——计算困惑度perplexitypython gensim里的log_perplexity得出的结果是困惑度吗?
可搜索到的资料都通过编程实现了困惑度的计算,不过gensim库其实自带了perplexity的计算模块,稍作修改即可返回模型困惑度。
对于困惑度的理解还十分有限,有待日后更新。

导入gensim库

from gensim.models import LdaModel

首先,导入gensim库的LdaModel模块。
然后,查看gensim\models\ldamodel.py源码。搜索perplexity。

    def log_perplexity(self, chunk, total_docs=None):
        """Calculate and return per-word likelihood bound, using a chunk of documents as evaluation corpus.

        Also output the calculated statistics, including the perplexity=2^(-bound), to log at INF
### Gensim LDA 中的困惑计算 Gensim 的 `LdaModel` 提供了一个用于评估模型性能的方法——`log_perplexity`,它返回的是每词困惑 (per-word perplexity) 的对数值。该指标衡量了模型对于未见数据的概率分布预测能力[^1]。 #### 困惑定义 真实的困惑(True Perplexity)通常被定义为: \[ PPL = \exp\left(-\frac{1}{N} \sum_{i=1}^{N} \log p(w_i)\right) \] 其中 \( N \) 是测试集中单词总数,\( w_i \) 表示第 \( i \) 个单词,而 \( p(w_i) \) 则表示由主题模型估计得到的单词概率[^3]。 然而,在实际实现中,由于直接计算上述公式的复杂性和效率问题,gensim 使用了一种近似方法来估算困惑。具体来说,`log_perplexity` 方法通过以下方式计算: \[ -\text{log\_perplexity}(corpus) = \frac{\sum_{d=1}^D \sum_{w=1}^W n_d(w) \cdot \log(p(w|d))}{\sum_{d=1}^D \sum_{w=1}^W n_d(w)} \] 这里 \( D \) 是文档数量,\( W \) 是词汇表大小,\( n_d(w) \) 是文档 \( d \) 中单词 \( w \) 出现的次数,\( p(w|d) \) 是基于当前模型的主题分布和词语条件概率所推导出的概率。 因此,`log_perplexity` 返回的结果是一个经过优化后的近似值而非严格意义上的真实困惑。 #### 参数影响 在构建 LDA 模型时,某些超参数的选择会对最终输出困惑产生显著的影响。例如,alpha 和 beta 值分别控制着文档-主题先验以及主题-词项先验的平滑程。当设置较低的 alpha 或者较高的 eta (即 beta),可以使得生成的主题更加稀疏化,从而可能降低整体的困惑得分[^2]。 另外需要注意的一点是,尽管 gensim 实现中的 log_perplexity 能够很好地反映训练过程的变化趋势,但它并不总是能够精确匹配理论上的真值 PPL 。这是因为其内部采用了变分推理技术以及其他简化假设来进行快速逼近运算。 ```python from gensim.models import LdaModel from gensim.corpora import Dictionary import numpy as np docs = [["a", "a", "b"], ["a", "c", "g"], ["c"], ["a", "c", "g"]] dct = Dictionary(docs) corpus = [dct.doc2bow(doc) for doc in docs] c_train, c_test = corpus[:2], corpus[2:] ldamodel = LdaModel(corpus=c_train, num_topics=2, id2word=dct) # 输出 per-word perplexity 对数值 print(ldamodel.log_perplexity(c_test)) ``` 以上代码展示了如何利用 gensim 创建并评估一个简单的 LDA 模型实例,并打印对应的每字困惑对数形式作为评价标准之一。
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伙伴lqs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值