使用 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 将作为一个很好的起点。
我想写出 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 将作为一个很好的起点。