李航老师《统计学习方法》第二版第十八章概率潜在语义分析课后习题答案

其他章节答案请参考我的汇总统计学习方法答案汇总,都是自己写的。

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,zd)=P(zd)P(wz,d)=P(zd)P(wz)(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(x1x2)=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(wd)=P(d)P(wd)=p(d)zP(w,zd)=P(d)zP(zd)P(wz)(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,dz)=P(wd)P(dz)(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)=zP(w,d,z)=zP(z)P(w,dz)=zP(z)P(wz)P(dz)(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 mjM
我们将三元组 ( 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(zkdj)P(wjizk)(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=1KP(zkdj,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=1Ni=1mjk=1KP(zkdj,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=1Ni=1mjk=1KPs(zkdj,wji)log P(dj,wji,zk)=k=1Kj=1Ni=1mjPs(zkdj,wji)(log P(dj)+log P(zkdj)P(wjizk))=k=1Kj=1Ni=1Mn(wi,dj)(log P(dj)+log P(zkdj)P(wjizk))Ps(zkdj,wji)=k=1Kj=1Nn(dj)Ps(zkwi,dj)log P(dj)+i=1Mn(wi,dj)Ps(zkwi,dj)logP(wizk)P(zkdj)(4)
公式(4)的一些参数的解释: P s ( z k ∣ w i , d j ) P_{s}(z_{k}|w_{i},d_{j}) Ps(zkwi,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=1Kj=1Ni=1Mn(wi,dj)Ps(zkwi,dj)logP(wizk)P(zkdj)=j=1Ni=1Mn(wi,dj)k=1KPs(zkwi,dj)logP(wizk)P(zkdj)(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(wz)P(dz)(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=1Ni=1mjk=1KPs(zkdj,wji)log P(dj,wji,zk)=k=1Kj=1Ni=1mjPs(zkdj,wji)(log P(zk)+log P(djzk)P(wjizk))=k=1Kj=1Ni=1Mn(wi,dj)(log P(zk)+log P(djzk)P(wjizk))Ps(zkdj,wji)=k=1Kj=1Nn(dj)Ps(zkwi,dj)log P(zk)+i=1Mn(wi,dj)Ps(zkwi,dj)logP(wizk)P(djzk)(7)

然后还有几个约束条件:
∑ k = 1 K p ( z k ) = 1 (8) \sum_{k=1}^{K}p(z_{k})=1 \tag{8} k=1Kp(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=1MP(wizk)=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=1NP(djzk)=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]]
  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值