【问题标题】:Minimizing a function using scipy使用 scipy 最小化函数
【发布时间】:2015-02-18 04:25:10
【问题描述】:

我有一个对数似然函数,它是一个很长的客户列表、一些单独的对数似然函数的总和,我想使用 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 列表的各种算法,但每次算法都会丢失。谁能给我一个关于如何解决这类问题的一般建议,即最小化我无法真正理解的功能?

【问题讨论】:

    标签: python optimization scipy minimization


    【解决方案1】:

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

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

    • params0 = np.array([1., 1., 1., 1.]) 真的是一个好的初步猜测吗?
    • 您是否也尝试过params0 = np.array([0., 0., 0., 0.]) 或任何其他组合(蛮力)
    • 您能否创建一个示例集,其中您知道参数的理想值?你尝试过适合它吗?

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

    【讨论】:

    • 感谢您的建议,确实参数并不理想,我对其进行了一些修改,但我仍然没有得到任何结果,因为我的猜测完全是凭经验的。我目前最好的猜测是:[2.5,10,0.001,10]
    • 那么测试子集怎么样?
    • 创建一组可能有 10 个客户,您知道结果应该是什么。它是否收敛,如果是,拟合参数是否接近您已知的最佳拟合?
    • 谢谢你的建议,我会试试的。
    • 如果解决方案适合您,请mark the answer as accepted 让其他用户看到有解决方案。谢谢!
    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 2021-10-25
    • 2016-05-27
    • 2019-03-21
    • 1970-01-01
    • 2020-03-08
    • 2020-11-25
    相关资源
    最近更新 更多