<p>对于这样的问题,我总是使用<a href="http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.minimize.html" rel="nofollow">^{<cd1>}</a>和我自己的最小二乘函数。优化算法不能很好地处理不同输入之间的巨大差异,因此在函数中缩放参数是一个好主意,这样暴露给scipy的参数都是按1的顺序排列的,正如我在下面所做的那样。</p>
<pre><code>import numpy as np
baskets = np.array([475, 108, 2, 38, 320])
scaling_factor = np.array([95.5, 57.7, 1.4, 21.9, 88.8])
def lsq(arg):
a = arg[0]*100
b = arg[1]*100
c = arg[2]*0.1
now = a - (b*np.exp(c * baskets)) - scaling_factor
return np.sum(now**2)
guesses = [1, 1, -0.9]
res = scipy.optimize.minimize(lsq, guesses)
print(res.message)
# 'Optimization terminated successfully.'
print(res.x)
# [ 0.97336709 0.98685365 -0.07998282]
print([lsq(guesses), lsq(res.x)])
# [7761.0093358076601, 13.055053196410928]
</code></pre>
<p>当然,和所有最小化问题一样,重要的是使用良好的初始猜测,因为所有算法都可能陷入局部极小值。优化方法可以通过使用<code>method</code>关键字进行更改;其中一些可能性是</p>
<ul>
<li>“内尔德·米德”</li>
<li>“鲍威尔”</li>
<li>'重心'</li>
<li>'BFGS'</li>
<li>“牛顿重心”</li>
</ul>
<p>根据<a href="http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.minimize.html" rel="nofollow">the documentation</a>,默认为BFGS。</p>