其他章节答案请参考我的汇总统计学习方法答案汇总,都是自己写的。
1、证明生成模型和共享模型是等价的。
证明:
1.1生成模型
首先,生成模型基于假设:假设在话题
z
z
z给定条件下,单词
w
w
w和文本
d
d
d条件独立,即:
P
(
w
,
z
∣
d
)
=
P
(
z
∣
d
)
P
(
w
∣
z
,
d
)
=
P
(
z
∣
d
)
P
(
w
∣
z
)
(1)
P(w,z|d) = P(z|d)P(w|z,d) = P(z|d)P(w|z)\tag{1}
P(w,z∣d)=P(z∣d)P(w∣z,d)=P(z∣d)P(w∣z)(1)
公式(1)的第二个等号成立是因为当随机变量
x
1
,
x
2
x_{1},x_{2}
x1,x2独立时有
P
(
x
1
∣
x
2
)
=
P
(
x
1
)
P(x_{1}|x_{2})=P(x_{1})
P(x1∣x2)=P(x1)
因此有
P
(
w
,
d
)
=
P
(
d
)
P
(
w
∣
d
)
=
P
(
d
)
P
(
w
∣
d
)
=
p
(
d
)
∑
z
P
(
w
,
z
∣
d
)
=
P
(
d
)
∑
z
P
(
z
∣
d
)
P
(
w
∣
z
)
(2)
P(w,d)=P(d)P(w|d)\\=P(d)P(w|d)\\=p(d)\sum_{z}P(w,z|d)\\=P(d)\sum_{z}P(z|d)P(w|z) \tag{2}
P(w,d)=P(d)P(w∣d)=P(d)P(w∣d)=p(d)z∑P(w,z∣d)=P(d)z∑P(z∣d)P(w∣z)(2)
1.2共现模型
同样的假设:话题
z
z
z给定条件下,单词
w
w
w和文本
d
d
d是条件独立的
P
(
w
,
d
∣
z
)
=
P
(
w
∣
d
)
P
(
d
∣
z
)
(3)
P(w,d|z)=P(w|d)P(d|z)\tag{3}
P(w,d∣z)=P(w∣d)P(d∣z)(3)
将(3)带入(4)的第二个等就可以得到,因而有
P
(
w
,
d
)
=
∑
z
P
(
w
,
d
,
z
)
=
∑
z
P
(
z
)
P
(
w
,
d
∣
z
)
=
∑
z
P
(
z
)
P
(
w
∣
z
)
P
(
d
∣
z
)
(4)
P(w,d)=\sum_{z}P(w,d,z)\\=\sum_{z}P(z)P(w,d|z)\\=\sum_{z}P(z)P(w|z)P(d|z)\tag{4}
P(w,d)=z∑P(w,d,z)=z∑P(z)P(w,d∣z)=z∑P(z)P(w∣z)P(d∣z)(4)
1.3、总结
可以看到,两种模型基于同一个假设,但是推导的步骤不一样,就导致了不同形式的模型。
下面两个图记得在学习贝叶斯网络的时候见过,和贝叶斯网络也是有关系,两种不同的形式,用来描述条件独立。
2、推导共现模型的EM算法。
EM算法其实最重要的是如何计算Q函数,其他的都是很方便的,李航老师的这本书上一些公式给的太粗暴了,直接就给出一个结果没有详细的推导过程,下面我先对生成模型的Q函数进行推导,接着类似写出共现模型的Q函数。其他的求导过程就比较的简单。个人感觉李航老师书上公式(18.9)是错误的,括号的次序错误。
2.1、我们先看书上的公式(18.9)生成模型的Q函数计算问题。
首先是有N篇文章
D
=
{
d
1
,
.
.
.
,
d
N
}
D = \{d_{1},...,d_{N}\}
D={d1,...,dN}
设第
j
j
j篇文章
d
j
d_{j}
dj的按照顺序的单词分别是
W
j
=
{
w
j
1
,
.
.
.
,
w
j
m
j
}
W_{j} = \{w_{j1},...,w_{jm_{j}}\}
Wj={wj1,...,wjmj}
其中
m
j
m_{j}
mj是该篇文章
d
j
d_{j}
dj的总的单词的个数,所以有
m
j
≤
M
m_{j}\le M
mj≤M
我们将三元组
(
d
j
,
w
j
i
,
z
k
)
(d_{j},w_{ji},z_{k})
(dj,wji,zk)看作是来自文章
d
j
d_{j}
dj一个完全数据
那么根据生成模型就有
P
(
d
j
,
w
j
i
,
z
k
)
=
P
(
d
j
)
P
(
z
k
∣
d
j
)
P
(
w
j
i
∣
z
k
)
(1)
P(d_{j},w_{ji},z_{k}) = P(d_{j})P(z_{k}|d_{j})P(w_{ji}|z_{k})\tag{1}
P(dj,wji,zk)=P(dj)P(zk∣dj)P(wji∣zk)(1)
因为对于公式(1)中的隐变量
z
k
z_{k}
zk,
k
k
k的取值是1到
K
K
K,那么该三元组关于隐变量的对数似然期望就是
∑
k
=
1
K
P
(
z
k
∣
d
j
,
w
j
i
)
l
o
g
P
(
d
j
,
w
j
i
,
z
k
)
(2)
\sum_{k=1}^{K}P(z_{k}|d_{j},w_{ji})log\ P(d_{j},w_{ji},z_{k}) \tag{2}
k=1∑KP(zk∣dj,wji)log P(dj,wji,zk)(2)
因而所有的
(
d
j
,
w
j
i
,
z
k
)
;
j
=
1
,
.
.
.
,
N
;
i
=
1
,
.
.
.
,
m
j
;
k
=
1
,
.
.
.
,
K
(d_{j},w_{ji},z_{k});\\j = 1,...,N; \\i = 1,...,m_{j};\\k=1,...,K
(dj,wji,zk);j=1,...,N;i=1,...,mj;k=1,...,K构成的完全数据的Q函数就是分别对公式(2)的
j
=
1
,
.
.
.
,
N
,
i
=
1
,
.
.
.
.
,
m
j
j=1,...,N,i=1,....,m_{j}
j=1,...,N,i=1,....,mj进行累加得到。
所以有
Q
=
∑
j
=
1
N
∑
i
=
1
m
j
∑
k
=
1
K
P
(
z
k
∣
d
j
,
w
j
i
)
l
o
g
P
(
d
j
,
w
j
i
,
z
k
)
(3)
Q=\sum_{j=1}^{N}\sum_{i=1}^{m_{j}} \sum_{k=1}^{K}P(z_{k}|d_{j},w_{ji})log\ P(d_{j},w_{ji},z_{k}) \tag{3}
Q=j=1∑Ni=1∑mjk=1∑KP(zk∣dj,wji)log P(dj,wji,zk)(3)
下面我们利用生成模型满足的前提条件以及利用给的的词典
W
=
{
w
1
,
.
.
.
,
w
M
}
W=\{w_{1},...,w_{M}\}
W={w1,...,wM}对公式(3)进行整理。
值得注意的是,同一篇文章里面可能会有重复的单词,因而我们设
n
(
w
i
,
d
j
)
n(w_{i},d_{j})
n(wi,dj)为词典中的单词
w
i
w_{i}
wi在文章
d
j
d_{j}
dj中出现的次数,并且取
n
(
d
j
)
=
∑
i
=
1
M
n
(
w
i
,
d
j
)
n(d_{j})=\sum_{i=1}^{M}n(w_{i},d_{j})
n(dj)=∑i=1Mn(wi,dj)因而:
Q
=
∑
j
=
1
N
∑
i
=
1
m
j
∑
k
=
1
K
P
s
(
z
k
∣
d
j
,
w
j
i
)
l
o
g
P
(
d
j
,
w
j
i
,
z
k
)
=
∑
k
=
1
K
∑
j
=
1
N
∑
i
=
1
m
j
P
s
(
z
k
∣
d
j
,
w
j
i
)
(
l
o
g
P
(
d
j
)
+
l
o
g
P
(
z
k
∣
d
j
)
P
(
w
j
i
∣
z
k
)
)
=
∑
k
=
1
K
∑
j
=
1
N
∑
i
=
1
M
n
(
w
i
,
d
j
)
(
l
o
g
P
(
d
j
)
+
l
o
g
P
(
z
k
∣
d
j
)
P
(
w
j
i
∣
z
k
)
)
P
s
(
z
k
∣
d
j
,
w
j
i
)
=
∑
k
=
1
K
∑
j
=
1
N
n
(
d
j
)
P
s
(
z
k
∣
w
i
,
d
j
)
l
o
g
P
(
d
j
)
+
∑
i
=
1
M
n
(
w
i
,
d
j
)
P
s
(
z
k
∣
w
i
,
d
j
)
l
o
g
P
(
w
i
∣
z
k
)
P
(
z
k
∣
d
j
)
(4)
Q=\sum_{j=1}^{N}\sum_{i=1}^{m_{j}} \sum_{k=1}^{K}P_{s}(z_{k}|d_{j},w_{ji})log\ P(d_{j},w_{ji},z_{k})\\=\sum_{k=1}^{K}\sum_{j=1}^{N}\sum_{i=1}^{m_{j}}P_{s}(z_{k}|d_{j},w_{ji})(log\ P(d_{j}) + log\ P(z_{k}|d_{j})P(w_{ji}|z_{k}))\\=\sum_{k=1}^{K}\sum_{j=1}^{N}\sum_{i=1}^{M}n(w_{i},d_{j})(log\ P(d_{j}) + log\ P(z_{k}|d_{j})P(w_{ji}|z_{k}))P_{s}(z_{k}|d_{j},w_{ji})\\=\sum_{k=1}^{K}\sum_{j=1}^{N}n(d_{j})P_{s}(z_{k}|w_{i},d_{j})log\ P(d_{j}) + \sum_{i=1}^{M}n(w_{i},d_{j})P_{s}(z_{k}|w_{i},d_{j})logP(w_{i}|z_{k})P(z_{k}|d_{j})\tag{4}
Q=j=1∑Ni=1∑mjk=1∑KPs(zk∣dj,wji)log P(dj,wji,zk)=k=1∑Kj=1∑Ni=1∑mjPs(zk∣dj,wji)(log P(dj)+log P(zk∣dj)P(wji∣zk))=k=1∑Kj=1∑Ni=1∑Mn(wi,dj)(log P(dj)+log P(zk∣dj)P(wji∣zk))Ps(zk∣dj,wji)=k=1∑Kj=1∑Nn(dj)Ps(zk∣wi,dj)log P(dj)+i=1∑Mn(wi,dj)Ps(zk∣wi,dj)logP(wi∣zk)P(zk∣dj)(4)
公式(4)的一些参数的解释:
P
s
(
z
k
∣
w
i
,
d
j
)
P_{s}(z_{k}|w_{i},d_{j})
Ps(zk∣wi,dj)是EM算法迭代过程中第s步的参数计算得到的,然后再更新到第s+1步,得到新的参数。
根据书上所说的,我们可以直接根据数据集得到
P
(
d
j
)
P(d_{j})
P(dj)的估计,因而将公式(4)里面和
P
(
d
j
)
P(d_{j})
P(dj)有关的全部删掉,于是就得到下面的公式(5):
Q
=
∑
k
=
1
K
∑
j
=
1
N
∑
i
=
1
M
n
(
w
i
,
d
j
)
P
s
(
z
k
∣
w
i
,
d
j
)
l
o
g
P
(
w
i
∣
z
k
)
P
(
z
k
∣
d
j
)
=
∑
j
=
1
N
∑
i
=
1
M
n
(
w
i
,
d
j
)
∑
k
=
1
K
P
s
(
z
k
∣
w
i
,
d
j
)
l
o
g
P
(
w
i
∣
z
k
)
P
(
z
k
∣
d
j
)
(5)
Q=\sum_{k=1}^{K}\sum_{j=1}^{N} \sum_{i=1}^{M}n(w_{i},d_{j})P_{s}(z_{k}|w_{i},d_{j})logP(w_{i}|z_{k})P(z_{k}|d_{j})\\=\sum_{j=1}^{N} \sum_{i=1}^{M}n(w_{i},d_{j})\sum_{k=1}^{K}P_{s}(z_{k}|w_{i},d_{j})logP(w_{i}|z_{k})P(z_{k}|d_{j})\tag{5}
Q=k=1∑Kj=1∑Ni=1∑Mn(wi,dj)Ps(zk∣wi,dj)logP(wi∣zk)P(zk∣dj)=j=1∑Ni=1∑Mn(wi,dj)k=1∑KPs(zk∣wi,dj)logP(wi∣zk)P(zk∣dj)(5)
可见,由公式(4)得到公式(5)是很显然直接的,但是如果根据李航老师书上的公式(18.9)来推导的话就比较不容易理解,书上的公式可能是有点错误的。
2.2、共现模型的Q函数推导
根据上面的生成模型的推导过程,我们只需要替代其中的一些公式和符号就可以。
共现模型基于假设
P
(
w
,
d
,
z
)
=
P
(
z
)
P
(
w
∣
z
)
P
(
d
∣
z
)
(6)
P(w,d,z)=P(z)P(w|z)P(d|z)\tag{6}
P(w,d,z)=P(z)P(w∣z)P(d∣z)(6)
于是
Q
=
∑
j
=
1
N
∑
i
=
1
m
j
∑
k
=
1
K
P
s
(
z
k
∣
d
j
,
w
j
i
)
l
o
g
P
(
d
j
,
w
j
i
,
z
k
)
=
∑
k
=
1
K
∑
j
=
1
N
∑
i
=
1
m
j
P
s
(
z
k
∣
d
j
,
w
j
i
)
(
l
o
g
P
(
z
k
)
+
l
o
g
P
(
d
j
∣
z
k
)
P
(
w
j
i
∣
z
k
)
)
=
∑
k
=
1
K
∑
j
=
1
N
∑
i
=
1
M
n
(
w
i
,
d
j
)
(
l
o
g
P
(
z
k
)
+
l
o
g
P
(
d
j
∣
z
k
)
P
(
w
j
i
∣
z
k
)
)
P
s
(
z
k
∣
d
j
,
w
j
i
)
=
∑
k
=
1
K
∑
j
=
1
N
n
(
d
j
)
P
s
(
z
k
∣
w
i
,
d
j
)
l
o
g
P
(
z
k
)
+
∑
i
=
1
M
n
(
w
i
,
d
j
)
P
s
(
z
k
∣
w
i
,
d
j
)
l
o
g
P
(
w
i
∣
z
k
)
P
(
d
j
∣
z
k
)
(7)
Q=\sum_{j=1}^{N}\sum_{i=1}^{m_{j}} \sum_{k=1}^{K}P_{s}(z_{k}|d_{j},w_{ji})log\ P(d_{j},w_{ji},z_{k})\\=\sum_{k=1}^{K}\sum_{j=1}^{N}\sum_{i=1}^{m_{j}}P_{s}(z_{k}|d_{j},w_{ji})(log\ P(z_{k}) + log\ P(d_{j}|z_{k})P(w_{ji}|z_{k}))\\=\sum_{k=1}^{K}\sum_{j=1}^{N}\sum_{i=1}^{M}n(w_{i},d_{j})(log\ P(z_{k}) + log\ P(d_{j}|z_{k})P(w_{ji}|z_{k}))P_{s}(z_{k}|d_{j},w_{ji})\\=\sum_{k=1}^{K}\sum_{j=1}^{N}n(d_{j})P_{s}(z_{k}|w_{i},d_{j})log\ P(z_{k}) + \sum_{i=1}^{M}n(w_{i},d_{j})P_{s}(z_{k}|w_{i},d_{j})logP(w_{i}|z_{k})P(d_{j}|z_{k})\tag{7}
Q=j=1∑Ni=1∑mjk=1∑KPs(zk∣dj,wji)log P(dj,wji,zk)=k=1∑Kj=1∑Ni=1∑mjPs(zk∣dj,wji)(log P(zk)+log P(dj∣zk)P(wji∣zk))=k=1∑Kj=1∑Ni=1∑Mn(wi,dj)(log P(zk)+log P(dj∣zk)P(wji∣zk))Ps(zk∣dj,wji)=k=1∑Kj=1∑Nn(dj)Ps(zk∣wi,dj)log P(zk)+i=1∑Mn(wi,dj)Ps(zk∣wi,dj)logP(wi∣zk)P(dj∣zk)(7)
然后还有几个约束条件:
∑
k
=
1
K
p
(
z
k
)
=
1
(8)
\sum_{k=1}^{K}p(z_{k})=1 \tag{8}
k=1∑Kp(zk)=1(8)
∑
i
=
1
M
P
(
w
i
∣
z
k
)
=
1
,
k
=
1
,
.
.
.
,
K
(9)
\sum_{i=1}^{M}P(w_{i}|z_{k})=1,k=1,...,K \tag{9}
i=1∑MP(wi∣zk)=1,k=1,...,K(9)
∑
j
=
1
N
P
(
d
j
∣
z
k
)
=
1
,
k
=
1
,
.
.
.
,
K
(10)
\sum_{j=1}^{N} P(d_{j}|z_{k})= 1,k=1,...,K\tag{10}
j=1∑NP(dj∣zk)=1,k=1,...,K(10)
然后利用拉格朗日函数法求导即可得到更新公式。
点到为止,不再赘述!!!
3、对以下文本数据进行概率潜在语义分析。
证:
写的是书上给的生成模型的代码,因为迭代更新的公式已经给出了,所以写起来比较简单,输出三个矩阵。因为EM算法不是全局最优算法,迭代之后的解和初始值有关,不同的初始值会收敛到不同的解。
import numpy as np
def PLSA(WD, K):
#首先先从给定的数据计算一个(N,N)的矩阵P(d),因为生成模型是可以直接从数据里面直接估计P(d)的
#观察数据可以看到,这九篇文章都不一样,因而P(d)的估计如下
s = np.shape(WD)
P_d = np.identity(s[1])/9
#下面开始初始化P_w_z,P_z_d
P_w_z = np.ones(shape = (s[0], K)) / s[0]
P_z_d = np.ones(shape = (K, s[1])) / K
for i in range(1000):#迭代1000次结束
#下面开始E步
P_z_w_d = np.zeros(shape = (K, s[0], s[1]), dtype=np.float32)
for k in range(K):
for i in range(s[0]):
for j in range(s[1]):
P_z_w_d[k, i, j] = P_w_z[i, k] * P_z_d[k,j] / np.matmul(P_w_z, P_z_d)[i, j]
for i in range(s[0]):
for k in range(K):
Denominator = 0.0
for m in range(s[0]):
for j in range(s[1]):
Denominator += WD[m, j] * P_z_w_d[k, m, j]
molecule = 0.0
for j in range(s[1]):
molecule += WD[i, j] * P_z_w_d[k, i, j]
P_w_z[i, k] = molecule / Denominator
for k in range(K):
for j in range(s[1]):
Denominator = sum(WD[:, j])
molecule = 0.0
for i in range(s[0]):
molecule += WD[i, j] * P_z_w_d[k, i, j]
P_z_d[k, j] = molecule / Denominator
return P_d, P_w_z, P_z_d
if __name__ == '__main__':
WD = np.array([[0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 2, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 1, 0, 0, 0, 0]])
P_d, P_w_z, P_z_d = PLSA(WD, K = 2)
输出如下:
P_d is : [[0.11111111 0. 0. 0. 0. 0.
0. 0. 0. ]
[0. 0.11111111 0. 0. 0. 0.
0. 0. 0. ]
[0. 0. 0.11111111 0. 0. 0.
0. 0. 0. ]
[0. 0. 0. 0.11111111 0. 0.
0. 0. 0. ]
[0. 0. 0. 0. 0.11111111 0.
0. 0. 0. ]
[0. 0. 0. 0. 0. 0.11111111
0. 0. 0. ]
[0. 0. 0. 0. 0. 0.
0.11111111 0. 0. ]
[0. 0. 0. 0. 0. 0.
0. 0.11111111 0. ]
[0. 0. 0. 0. 0. 0.
0. 0. 0.11111111]]
P_w_z is : [[0.06451613 0.06451613]
[0.06451613 0.06451613]
[0.06451613 0.06451613]
[0.06451613 0.06451613]
[0.06451613 0.06451613]
[0.29032258 0.29032258]
[0.06451613 0.06451613]
[0.06451613 0.06451613]
[0.09677419 0.09677419]
[0.09677419 0.09677419]
[0.06451613 0.06451613]]
P_z_d is : [[0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5]
[0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5]]