1. Latent Dirichlet Allocation(LDA)
- 隐式狄利克雷分布是一个生成概率模型,用于离散的数据集比如文本语料库
- 同时它也是一个主题模型,用来从一堆文件s中发现抽象的主题s
LDA 的图形模型是一个三级生成模型
在图形模型中显示的关于符号s的说明,可在Hoffman等人(2013年)中找到
- 语料库是 D D D 篇文档s的集合
- 一篇文档是一序列的 N N N 个词s
- 在我们的语料库中有 K K K个主题s
- 这些框表示重复采样
在图形模型中,每一个节点都是一个随机变量并且在生成过程中发挥着作用。
-
阴影节点表示观察到的变量(显而易见,给我们一篇文章,我们只能看见词 w d , n w_{d,n} wd,n )
【在这种情况下,语料库中的词语s(多篇文章中的词语)是我们唯一能够观察到的数据。】 -
未遮盖的节点表示隐藏的(潜在的)变量。
【潜在的变量决定语料库中主题s的随机混合以及文档s中的词语s的分布】
LDA的目标是使用观察到的词语s去推断隐藏的主题结构。
在建模文本语料库时,模型假设如下的生成过程:
一个语料库有
D
D
D 篇文档s,
K
K
K个主题s,注意这个
K
K
K与API中的n_components
相关
-
对于每一个主题 k ∈ K k\in K k∈K,绘制出 β k ∼ D i r i c h l e t ( η ) \beta_k \sim \mathrm{Dirichlet}(\eta) βk∼Dirichlet(η)
这提供了词语的分布,即一个词出现在主题 k k k中的概率。
η \eta η与topic_word_prior
有关 -
对于每一个文档 d ∈ D d\in D d∈D,绘制出 θ d ∼ D i r i c h l e t ( α ) \theta_d \sim \mathrm{Dirichlet}(\alpha) θd∼Dirichlet(α)
α \alpha α与doc_topic_prior
有关 -
对于在一篇文档 d d d 中的每一个词语 i i i:
第一步:绘制出主题分布 z d i ∼ M u l t i n o m i a l ( θ d ) z_{di} \sim \mathrm{Multinomial} (\theta_d) zdi∼Multinomial(θd)
第二步:绘制出观察到的某一个词语 w i j ∼ M u l t i n o m i a l ( β z d i ) w_{ij} \sim \mathrm{Multinomial} (\beta_{z_{di}}) wij∼Multinomial(βzdi)
对于参数估计,后验分布是:
p
(
z
,
θ
,
β
∣
w
,
α
,
η
)
=
p
(
z
,
θ
,
β
∣
α
,
η
)
p
(
w
∣
α
,
η
)
p(z, \theta, \beta |w, \alpha, \eta) = \frac{p(z, \theta, \beta|\alpha, \eta)}{p(w|\alpha, \eta)}
p(z,θ,β∣w,α,η)=p(w∣α,η)p(z,θ,β∣α,η)
由于后验分布是棘手的,变分贝叶斯方法使用了一个更简单的分布
q
(
z
,
θ
,
β
∣
λ
,
ϕ
,
γ
)
q(z,\theta,\beta | \lambda, \phi, \gamma)
q(z,θ,β∣λ,ϕ,γ) 来估计这个后验分布。
这些变分的参数
λ
\lambda
λ
ϕ
\phi
ϕ
γ
\gamma
γ 都被优化过,以最大限度地提高 证据下界Evidence Lower Bound (ELBO)
log
P
(
w
∣
α
,
η
)
≥
L
(
w
,
ϕ
,
γ
,
λ
)
=
△
E
q
[
log
p
(
w
,
z
,
θ
,
β
∣
α
,
η
)
]
−
E
q
[
log
q
(
z
,
θ
,
β
)
]
\log\: P(w | \alpha, \eta) \geq L(w,\phi,\gamma,\lambda) \overset{\triangle}{=} E_{q}[\log\:p(w,z,\theta,\beta|\alpha,\eta)] - E_{q}[\log\:q(z, \theta, \beta)]
logP(w∣α,η)≥L(w,ϕ,γ,λ)=△Eq[logp(w,z,θ,β∣α,η)]−Eq[logq(z,θ,β)]
最大化 ELBO (证据下届)相当于尽量减少在
q
(
z
,
θ
,
β
)
q(z,\theta,\beta)
q(z,θ,β) 与 真正后验
p
(
z
,
θ
,
β
∣
w
,
α
,
η
)
p(z, \theta, \beta |w, \alpha, \eta)
p(z,θ,β∣w,α,η) 之间的Kullback-Leibler(KL) 分歧
sklearn 里面的 LatentDirichletAllocation 实现了在线的变分贝叶斯算法,并支持在线和批次更新方法。当批次方法每次完全通过数据后更新变异变量时,在线方法会更新来自小批量数据点的变异变量
注意:
注意尽管可以确保在线online方法收敛到局部最优点,但是最优点的质量和收敛速度可能取决于小批量的大小和与学习率设置相关的属性。
当 LatntDirichletAllocation 应用于"document-term"矩阵时,矩阵将被分解为"topic-term"矩阵和"document-topic"矩阵。虽然"topic-term"矩阵存储在模型的 components_
中,但"document-topic"矩阵可以从transform
方法进行计算。
LatentDirichletAllocation 也实现了 partial_fit
method. 当数据可以按顺序提取时, 可以使用此方式。
Examples:
sklearn.decomposition.LatentDirichletAllocation
首先看看这个类
class sklearn.decomposition.LatentDirichletAllocation(n_components=10, ,
doc_topic_prior=None,
topic_word_prior=None,
learning_method=‘batch’,
learning_decay=0.7,
learning_offset=10.0,
max_iter=10,
batch_size=128,
evaluate_every=- 1,
total_samples=1000000.0,
perp_tol=0.1,
mean_change_tol=0.001,
max_doc_update_iter=100,
n_jobs=None,
verbose=0,
random_state=None)
sklearn使用的隐式狄利克雷分布使用的是在线变分贝叶斯算法
参数 | 释义 | 备注 | 再备注 |
---|---|---|---|
n_components | 主题的数量 | int, default=10 | 在 version 0.19之后,n_topics 被重新命名为 n_components |
doc_topic_prior | 文档-主题分布 之前的参数 θ \theta θ | float, default=None | 如果值为"none",则默认为 1/ n_components ,在论文中,它被称为
α
\alpha
α |
topic_word_prior | 主题-词语分布 之前的参数 β \beta β | float, default=None | 如果值为"none",则默认为 1/ n_components ,在论文中,它被称为
η
\eta
η |
learning_method | 用来更新主题_component 的方法 | {‘batch’, ‘online’}, default=’batch’ | 只在fit 方法中使用,总体说来,当数据尺寸特别大的时候,在线online更新会比批处理batch更新快得多,详见下1. |
learning_decay | 在online学习方法中控制学习速率的一个参数 | float, default=0.7 | 这个值需要设置在 (0.5,1.0] 确保渐进收敛。当这个值为 0.0 而 batch_size 为n_samples 时,更新方法与批处理学习一摸一样。在文献中,这称为kappa |
learning_offset | 一个(正)参数,可以减轻online在线学习中的早期迭代的负担。 | float, default=10. | 它应该大于1.0。 在文献中,这称为tau_0 |
max_iter | 迭代的最大次数 | int, default=10 | |
batch_size | 仅用于online学习,每次EM迭代中使用的文档数。 | int, default=128 | |
evaluate_every | 多久评估一次困惑度 (Perplexity) | int, default=-1 | 只在fit 方法中使用, 将其设置为0或负数以在训练中完全不评估的Perplexity。 评估困惑度可以帮助您检查训练过程中的收敛性,但同时也会增加总的训练时间。 在每次迭代中评估困惑度可能会使训练时间增加两倍。 |
total_samples | 文档总数 | int, default=1e6 | 仅在partial_fit 方法中使用。详见下2. |
perp_tol | batch 学习中的困惑度 (Perplexity)的容忍度 | float, default=1e-1 | 仅在evaluate_every大于0时使用 。 |
mean_change_tol | 在E-step中停止更新文档-主题分布的容忍度。 | float, default=1e-3 | |
max_doc_update_iter | E-step中用于更新文档-主题分布的最大迭代次数。 | int, default=100 | |
n_jobs | E-step中要使用的作业job数。 -1表示使用所有处理器。 | int, default=None | |
verbose | 详细程度 | int, default=0 | |
random_state | 在多个函数调用之间传递int以获得可重现的结果。 | int, RandomState instance or None, default=None | 单元格 |
- fit(X,y = None)
一种学习方法,是一种对于数据 X 使用变分贝叶斯方法,当learning_method
是‘online’的时候,使用 小批 mini-batch更新。否则,使用批处理更新
Parameters:
X:形状为(n_samples,n_features)的 {类似数组,稀疏矩阵}
文档-词语矩阵。
y:忽视
returns:
self 他自己
有效选项:
-
’batch 批处理’:批处理可变贝叶斯方法。 在每次EM更新时使用所有训练数据
旧的components_
在每次迭代中都会被覆盖。 -
“online 在线”:在线可变贝叶斯方法。 在每个EM更新中,使用 迷你批处理 训练数据以逐步变更新
components_
学习率由learning_decay
和learning_offset
参数控制。 -
在0.20版中进行了更改:现在默认的学习方法是“Batch 批处理”。
困惑度 (Perplexity)-评价语言模型的好坏
- partial_fit(X,y = None)
Mini-Batch更新的在线VB。
Parameters:
X:形状为(n_samples,n_features)的 {类似数组,稀疏矩阵}
文档词矩阵。
y:忽视
returns:
self 他自己
属性 | 释义 | 备注 | 再备注 |
---|---|---|---|
components_ | 主题-词语分布的变体参数。 | 形状为(n_components,n_features)的 n 维数组 | 由于主题-词语分布的完整条件是 Dirichlet,因此components_[i,j] 可以将其视为表示单词
j
j
j 被分配到主题
i
i
i 的次数的伪计数。它也可以被视为正规化后每个主题的单词分布,model.components_ / model.components_.sum(axis=1)[:, np.newaxis]. |
exp_dirichlet_component_ | log 主题-词语分布 的期望值的指数值,在文献中,它是exp(E[log(beta)]) | 形状为(n_components,n_features)的 n 维数组 | 单元格 |
n_batch_iter_ | EM 步骤的迭代次数 | int | |
n_iter_ | 数据集的传递次数。 | int | |
bound_ | 训练集的最终困惑度得分 | float | |
doc_topic_prior_ | 文档-主题分布 之前的参数 θ \theta θ | float | 如果值为"none",则默认为 1/ n_components |
random_state_ | RandomState实例由生成 从种子,随机数生成器或通过np.random | RandomState instance | 单元格 |
topic_word_prior_ | 主题-词语分布 之前的参数 β \beta β | float | |
`` | 单元格 | 单元格 | 单元格 |
`` | 单元格 | 单元格 | 单元格 |
Topic extraction with Non-negative Matrix Factorization and Latent Dirichlet Allocation非负矩阵分解和潜在狄利克雷分配的主题提取
这是将NMF和LatentDirichletAllocation应用于文档语料库并提取该语料库主题结构的附加模型的示例。 输出为主题图,每个主题均使用基于权重的前几个单词表示为条形图。
NMF 非负矩阵分解(Non-negative Matrix Factorization) 应用于两个不同的目标函数:Frobenius范数和广义Kullback-Leibler发散。 后者等效于概率潜在语义索引。
默认参数(n_samples / n_features / n_components)应可使示例在几十秒内可运行。 您可以尝试增加问题的范围,但要注意,时间复杂度是NMF中的多项式。 在LDA中,时间复杂度与(n_samples *迭代)成正比。