使用scipy最小化函数

时间:2014-12-19 08:57:25

标签: python optimization scipy minimization

我有一个loglikelihood函数,它是一个很长的客户列表,一些单独的loglikelihood函数的总和,我想使用scipy.optimize.minimize()方法对它进行优化。

def log_likelihood_individual(r, alpha, a, b, x, tx, t):
    ln_a1 = gammaln(r + x) - gammaln(r) + r * log(alpha)
    ln_a2 = gammaln(a + b) + gammaln(b + x) - gammaln(b) - gammaln(a + b + x)
    ln_a3 = -(r + x) * log(alpha + t)
    a4 = 0
    if x > 0:
        a4 = exp(log(a) - log(b + x - 1) - (r + x) * log(alpha + tx))
    return ln_a1 + ln_a2 + log(exp(ln_a3) + a4)


def log_likelihood(r, alpha, a, b, customers):
    if r <= 0 or alpha <= 0 or a <= 0 or b <= 0:
        return -np.inf
    c = sum([log_likelihood_individual(r, alpha, a, b, x, tx, t) for x, tx, t in customers])
    return c


def maximize(customers):
    negative_ll = lambda params: -log_likelihood(*params, customers=customers)
    params0 = np.array([1., 1., 1., 1.])
    res = minimize(negative_ll, params0, method='CG')
    return res

我尝试使用scipy列表的各种算法,但每次算法都会丢失。谁能给我一个关于如何解决这类问题的一般性建议,即最小化我能够理解的功能?

1 个答案:

答案 0 :(得分:1)

一般性问题引发了一般性答案;)

由于初始值条件差,我的大多数尝试都失败了(即不会收敛)。问问自己:

  • params0 = np.array([1., 1., 1., 1.])真的是一个很好的初步猜测吗?
  • 您是否也尝试params0 = np.array([0., 0., 0., 0.])或任何其他组合(暴力)
  • 您是否可以创建一个示例集,您可以在其中了解参数的理想值?你有没有尝试过它?

如果以上都没有解决,问题似乎更复杂,但通过回答上述问题可以解决90%的拟合问题。