我在 scipy 'leastsq' 优化例程中遇到问题,如果我执行下面的程序,它说
raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.
有时 索引超出数组范围
...
from scipy import *
import numpy
from scipy import optimize
from numpy import asarray
from math import *
def func(apar):
apar = numpy.asarray(apar)
x = apar[0]
y = apar[1]
eqn = abs(x-y)
return eqn
Init = numpy.asarray([20.0, 10.0])
x = optimize.leastsq(func, Init, full_output=0, col_deriv=0, factor=100, diag=None, warning=True)
print 'optimized parameters: ',x
print '******* The End ******'
我不知道我的 func optimize.leastsq() 调用有什么问题,请帮助我
leastsq
使用向量,因此残差函数 func
需要返回长度至少为 2 的向量。因此,如果您将 return eqn
替换为 return [eqn, 0.]
,您的示例将起作用。运行它给出:
optimized parameters: (array([10., 10.]), 2)
这是绝对差的最小值的众多正确答案之一。
如果你想最小化一个标量函数,fmin
是可行的方法,optimize.fmin(func, Init)
。
这里的问题是,尽管这两个函数对于标量来说看起来相同,但它们针对的是不同的目标。 leastsq
找到最小平方误差,通常来自一组理想化曲线,并且只是进行“最佳拟合”的一种方法。另一方面,fmin
找到标量函数的最小值。
很明显,您的示例只是一个玩具示例,这些都没有真正意义,因此您采用哪种方式将取决于您的最终目标。
我是一名优秀的程序员,十分优秀!