在LDA中,如何解释主题的含义?

机器算法验证 主题模型 潜类
2022-03-29 05:37:42

我正在研究潜在狄利克雷分配(LDA)模型,我在网上找到了一些解释(例如在Quora.com上)。在链接示例中,我可以清楚地看到作者在谈论哪些主题(食物和可爱的动物)。当您对主题的含义有所了解时,我就理解了该模型的工作原理。但是,当您不知道主题的含义时会发生什么?

LDA 模型如何告诉您主题是什么?

LDA 模型如何告诉您有多少主题?

例如,如果您正在运行 LDA 算法来分析基因的出现及其功能,那么模型如何告诉您主题是关于疾病、代谢途径、遗传疾病或任何其他与基因和功能相关的概念?

2个回答

LDA 做什么,它可以回答什么

考虑一下介绍监督 LDA的论文中的这个片段:

大多数主题模型,例如潜在狄利克雷分配 (LDA),都是无监督的:仅对文档中的单词进行建模。目标是推断使集合的可能性(或后验概率)最大化的主题。

换句话说,对于给定的语料库和经过训练的固定 LDA 模型k,这就是你得到的全部:使观察到的语料库的后验概率最大化的潜在主题。

现在,这并不是说领域主题专家无法在正确的方向上做出一些直观的猜测。从受过训练的 LDA 模型中查看这些主题k=16在随附的手写数字数据上sklearn

来自 k = 16 的数字数据的 LDA 主题

有些完全可以识别为数字;有些我们需要推测或进一步分析,可能是“半个九”或“写一个七的一种常见方式”。(请参阅下面的代码以生成此图和其他一些不同主题的图。)

多少个主题,通过分层主题模型

以上,我们的选择k快速浏览可能参数的任意空间。这很简单,因为我们更希望有意义的主题的数量不会与十位数相差太远。

在您的情况下,没有提及可以证明选择的任何一个的先验知识k,甚至是要搜索的子空间。分层主题模型可以通过使用狄利克雷过程以有原则的方式处理这个问题(粗略地说,DPs 可以被认为是 Dirichlet 分布的无限维推广。)经验表明,它可以选择k类似于最小化困惑度的 LDA 模型。从论文中:

在此处输入图像描述

尽管分层主题模型可以处理单个分层层次结构,但它们的动机是更精细的组内和组间依赖模型,您可能会感兴趣:

我们假设数据被细分为一组组,并且在每个组中我们希望找到能够捕获分配给该组的数据中潜在结构的集群。每个组内的集群数量是未知的,有待推断。此外,从某种意义上说,我们希望允许集群在组之间共享。

他们进一步详细介绍了一个可能感兴趣的示例:

在遗传学中可以找到激励我们的问题的一个例子。考虑人类基因组局部区域中的一组 k 个二元标记(例如,单核苷酸多态性或“SNP”)。虽然一个人可以在一条染色体上表现出 2k 种不同的标记模式中的任何一种,但在实际人群中,实际上只观察到了这种模式的一小部分——单倍型(Gabriel et al. 2002)。[...] 现在考虑这个问题的扩展,将人口分为一组;例如,非洲、亚洲和欧洲的亚群。我们可能不仅想发现每个亚群中的单倍型集,而且我们可能还希望发现哪些单倍型在亚群之间共享。

因此,您可以简单地使用层次模型来选择主题的数量,或者对更复杂的组关系进行建模。(我没有丝毫的生物信息学专业知识,所以我什至无法开始建议什么是有用或合适的,但我希望论文中的细节可以帮助指导你。)

主题的含义,通过 sLDA

最后,如果您的数据包含您想要预测的响应变量,例如您提到的疾病或遗传疾病,那么有监督的 LDA 可能就是您要寻找的。从上面链接的论文中,强调我的:

在有监督的潜在狄利克雷分配 (sLDA) 中,我们向 LDA 添加了与每个文档相关的响应变量。如前所述,这个变量可能是给电影的星数、在线社区中标记文章感兴趣的用户的数量或文档的类别。我们联合对文档和响应进行建模,以便找到最能预测未来未标记文档的响应变量的潜在主题

一个简短的旁白:在 sLDA 论文中引用的是这个,这可能是有趣的:

P. Flaherty、G. Giaever、J. Kumm、M. Jordan 和 A. Arkin。化学基因组分析的潜在变量模型。生物信息学,21(15):3286-3293,2005。

代码

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 18 18:24:41 2016

@author: SeanEaster
"""

from sklearn.decomposition import LatentDirichletAllocation as LDA
from sklearn.datasets import load_digits

import matplotlib.pyplot as plt, numpy as np

def untick(sub):
    sub.tick_params(which='both', bottom='off', top='off',  labelbottom='off', labelleft='off', left='off', right='off')

digits = load_digits()



images = digits['images']
images = [image.reshape((1,-1)) for image in images]
images = np.concatenate(tuple(images), axis = 0)

topicsRange = [i + 4 for i in range(22)]

ldaModels = [LDA(n_topics = numTopics) for numTopics in topicsRange]

for lda in ldaModels:
    lda.fit(images)

scores = [lda.score(images) for lda in ldaModels]

plt.plot(topicsRange, scores)
plt.show()

maxLogLikelihoodTopicsNumber = np.argmax(scores)
plotNumbers = [4, 9, 16, 25]

if maxLogLikelihoodTopicsNumber not in plotNumbers:
    plotNumbers.append(maxLogLikelihoodTopicsNumber)

for numberOfTopics in plotNumbers:
    plt.figure()
    modelIdx = topicsRange.index(numberOfTopics)
    lda = ldaModels[modelIdx]
    sideLen = int(np.ceil(np.sqrt(numberOfTopics)))
    for topicIdx, topic in enumerate(lda.components_):
        ax = plt.subplot(sideLen, sideLen, topicIdx + 1)
        ax.imshow(topic.reshape((8,8)), cmap = plt.cm.gray_r)
        untick(ax)
    plt.show()

LDA 是一种无监督学习方法,可以最大化将单词分配到 K 个固定主题之一的概率。主题含义是通过解释给定主题的前N个概率词来提取的,即LDA不会输出主题的含义,而是按主题组织词以供用户解释。

在某些情况下,我们可以访问主题的含义,例如在20 个新闻组数据集中,我们知道新闻组的标题(例如 sci.med、sci.crypt、comp.graphics)。因此,我们希望学习到的主题与新闻组标题密切相关。然而,一般而言,主题含义由用户解释。

另一方面,对于主题模型的定量评估,困惑度通过计算测试集的平均对数似然度来衡量主题模型与数据的拟合程度。