cvxpy - 使用 DCP 规则集编写 Dirichlet 对数似然
问题描述
我想将Dirichlet 密度的对数似然写成关于 Dirichlet 分布参数的有纪律的凸规划(DCP) 优化问题alpha
。然而,对数似然
def dirichlet_log_likelihood(p, alpha):
"""Log of Dirichlet density.
p: Numpy array of shape (K,) that sums to 1.
alpha: Numpy array of shape (K, ) with positive elements.
"""
L = np.log(scipy.special.gamma(alpha.sum()))
L -= np.log(scipy.special.gamma(alpha)).sum()
L += np.sum((alpha - 1) * np.log(p))
return L
尽管是凹入的,但alpha
没有公式化为 DCP,因为它涉及两个凹函数np.log(gamma(alpha.sum()))
和的差异np.log(gamma(alpha)).sum()
。如果可能的话,我想制定这个函数alpha
,使其遵循DCP 规则集,以便alpha
可以使用cvxpy执行最大似然估计。
这可能吗,如果可以,我该怎么做?
解决方案
正如您所注意到的,np.log(gamma(alpha.sum()))
并且-np.log(gamma(alpha)).sum()
具有不同的曲率,因此您需要将它们组合为
np.log(gamma(alpha.sum()) / gamma(alpha).sum())
有机会在 DCP 规则集下对它们进行建模。上面的组合表达式可以被识别为多元 beta 函数的对数,并且由于多元 beta 函数可以写成二元 beta 函数的乘积(参见此处),您可以将 log-product 扩展为 sum-log 表达式其中每个术语的形式为
np.log(beta(x,y))
这是您在 DCP 规则集中需要的凸原子。剩下的,要在实践中使用它,就是将这个原子的近似值输入到 cvxpy 中。这里的np.log(gamma(x))
近似值将作为一个很好的起点。
有关详细信息,请参阅math.stackexchange.com。