有很多关于这个具体问题的帖子,但我无法解决这个问题。我一直在 20newgroup 语料库上使用 Sklearn 和 Gensim 实现来试验 LDA。文献中描述,随着主题数量的增加,困惑度通常会降低,但我得到了不同的结果。
我已经尝试过不同的参数,但总的来说,当主题数量增加时,测试集的困惑度会增加,训练集的困惑度会减少。这可能表明模型在训练集上过度拟合。但使用其他文本数据集时也会出现类似的模式。此外,专门使用该数据集的研究也减少了困惑。(例如ng20 困惑度)
我已经尝试过 SkLearn、Gensim 和 Gensim Mallet 包装器,所有包确实显示出不同的困惑度值(这是可以预期的,因为 LDA 是随机初始化 + 不同的推理算法),但常见的模式是每个包的困惑度确实增加,这与文献中的许多论文相矛盾。
# imports for code sample
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.decomposition import LatentDirichletAllocation
Run Code Online (Sandbox Code Playgroud)
小示例代码
# retrieve the data
newsgroups_all = datasets.fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'), shuffle = True)
print("Extracting tf features for LDA...")
tf_vectorizer_train = CountVectorizer(max_df=0.95, min_df=2,stop_words='english')
X = tf_vectorizer_train.fit_transform(newsgroups_all.data)
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42)
Run Code Online (Sandbox Code Playgroud)
k = N
lda = …Run Code Online (Sandbox Code Playgroud)