2019独角兽企业重金招聘Python工程师标准>>>
起因
看onlineldavb.py的时候看到求E[log(theta)] 期望的函数如下:
今天看了半天都不理解为何dirichlet的期望可以由上面的函数来实现,后来看到几个公式之后才明白,这里记录一下过程。 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])
psi函数
psi应该是gamma函数的一阶导数,有以下代码可以理解:
>>> from scipy import special
polygamma是gamma函数的N阶导数。
>>> 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)
公式推导
\Psi(x) = \frac{d}{dx} \ln(\Gamma(x))
其它细节可参考链接:http://www.hiit.fi/u/ahonkela/dippa/node95.html
(话说osc如何插入公式?)