我有一个对数似然函数,该函数是很长的客户列表中某些对数似然函数的总和,我想使用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 list的各种算法,但是每次算法都会迷失自我。谁能给我关于如何解决这类问题的一般建议,即最大限度地减少我无法真正理解的功能?
最佳答案
一个普遍的问题引起一个普遍的回答;)
我的大多数拟合尝试都因条件初始值较差而失败(即不收敛)。问你自己:params0 = np.array([1., 1., 1., 1.])
真的是一个很好的初始猜测吗?
您是否也尝试过params0 = np.array([0., 0., 0., 0.])
或任何其他组合(强力)
您是否可以创建一个示例集,以了解参数的理想值?你试过适合吗?
如果以上方法均无法解决,则问题似乎更为复杂,但是可以通过回答上述问题来解决90%的拟合问题。