online lda 的dirichlet_expectation函数

起因

看onlineldavb.py的时候看到求E[log(theta)] 期望的函数如下:

def dirichlet_expectation(alpha):
    """
For a vector theta ~ Dir(alpha), computes E[log(theta)] given alpha.
"""
    if (len(alpha.shape) == 1):
        return(psi(alpha) - psi(n.sum(alpha)))
    return(psi(alpha) - psi(n.sum(alpha, 1))[:, n.newaxis])
今天看了半天都不理解为何dirichlet的期望可以由上面的函数来实现,后来看到几个公式之后才明白,这里记录一下过程。

psi函数

psi应该是gamma函数的一阶导数,有以下代码可以理解:

>>> from scipy import special
>>> x = [2, 3, 25.5]
>>> special.polygamma(1, x)
array([ 0.64493407,  0.39493407,  0.03999467])
>>> special.polygamma(0, x) == special.psi(x)
array([ True,  True,  True], dtype=bool)
polygamma是gamma函数的N阶导数。

公式推导

online lda 的dirichlet_expectation函数

\Psi(x) = \frac{d}{dx} \ln(\Gamma(x))

其它细节可参考链接:http://www.hiit.fi/u/ahonkela/dippa/node95.html

(话说osc如何插入公式?)


你可能感兴趣的:(LDA,dirichlet,expectation)