Python 使用scipy最小化函数
我有一个loglikelion函数,它是一个很长的客户列表的和,一些单独的loglikelion函数,我想使用scipy.optimize.minimize()方法对它进行优化Python 使用scipy最小化函数,python,optimization,scipy,minimization,Python,Optimization,Scipy,Minimization,我有一个loglikelion函数,它是一个很长的客户列表的和,一些单独的loglikelion函数,我想使用scipy.optimize.minimize()方法对它进行优化 def log_似然_个体(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)*对数(α+t) a4=0
def log_似然_个体(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)*对数(α+t)
a4=0
如果x>0:
a4=exp(对数(a)-log(b+x-1)-(r+x)*对数(α+tx))
返回ln_a1+ln_a2+日志(exp(ln_a3)+a4)
def记录可能性(r、阿尔法、a、b、客户):
如果r一般性问题引发一般性答案;)
由于条件初始值较差,我的大多数拟合尝试都失败(即不收敛)。问问自己:
params0=np.array([1,1,1,1.])
真的是一个很好的初始猜测吗
- 您是否也尝试过
params0=np.array([0,0,0,0.])
或任何其他组合(暴力)
- 您能否创建一个示例集,让您知道参数的理想值?你试过装它吗
如果上述问题都无法解决,那么问题似乎更复杂,但90%的拟合问题都可以通过回答上述问题来解决。感谢您的建议,确实参数并不理想,我对其进行了一点修改,但我仍然没有得到任何结果,因为我的猜测完全是经验性的。目前我最好的猜测是:[2.5,10,0.001,10]那么,一个测试子集如何?创建一组可能有10个客户的集合,您知道结果应该是什么。它收敛吗?如果收敛,拟合参数是否接近已知的最佳拟合?谢谢你的建议,我会尝试。如果解决方案适合你,请其他用户查看是否存在解决方案。非常感谢。
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