使用 DCP 规则集编写 Dirichlet Log Likelihood

Write Dirichlet Log Likelihood with DCP ruleset

我想写出 Dirichlet density as a disciplined convex programming (DCP) 优化问题关于 Dirichlet 分布 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中是凹函数,但由于涉及到np.log(gamma(alpha.sum()))np.log(gamma(alpha)).sum()两个凹函数的差异,所以没有被表述为DCP。如果可能的话,我想制定 alpha 的这个函数,使其遵循 DCP ruleset, so that maximum-likelihood estimation of alpha can be performed with cvxpy.

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

正如你所注意到的,np.log(gamma(alpha.sum()))-np.log(gamma(alpha)).sum()有不同的曲率,所以你需要将它们合并为

np.log(gamma(alpha.sum()) / gamma(alpha).sum())

有机会在 DCP 规则集下对它们进行建模。上面的组合表达式可以被识别为多元 beta 函数的对数,并且由于多元 beta 函数可以写成双变量 beta 函数的乘积(参见 here),您可以将对数积展开为sum-log 表达式,其中每个项的形式为

np.log(beta(x,y))

这是您在 DCP 规则集中需要的凸原子。为了在实践中使用它,您剩下的就是将此原子的近似值输入到 cvxpy 中。 np.log(gamma(x)) 近似 here 将作为一个很好的起点。

详情请见math.stackexchange.com