首页 > 解决方案 > 使用 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执行最大似然估计。

这可能吗,如果可以,我该怎么做?

标签: cvxpyconvex-optimization

解决方案


正如您所注意到的,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


推荐阅读