题
我面对SciPy的“leastsq”优化例程一个问题,如果我执行下面的程序,它说
raise errors[info][1], errors[info][0]
TypeError: Improper input parameters.
和有时index out of range for an array
...
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
,需要返回长度的至少两个的向量。所以,如果你更换return eqn
return [eqn, 0.]
,你的例子会工作。运行它给出:
optimized parameters: (array([10., 10.]), 2)
这是最小的绝对差的许多正确答案中的一个。
如果你想以最小化标量函数,fmin
是要走的路,optimize.fmin(func, Init)
。
这里的问题是,这两个功能,虽然它们看起来一样的标量是针对不同的目标。 leastsq
发现最小二乘误差,通常从一组理想的曲线,而且是做一个“最适合”只是其中一种方法。在另一方面fmin
找到一个标量函数的最小值。
显然,你是一个玩具例如,对于没有这些真的是有道理的,所以哪种方式你去将取决于你的最终目标是什么。
其他提示
由于要最大限度地减少一个简单的标量函数(func()
返回一个值,而不是值的列表),scipy.optimize.leastsq()
应当通过调用替换到的fmin
功能之一(使用适当的参数):
x = optimize.fmin(func, Init)
正常工作!
在事实上,最小化leastsq()
值的列表的平方的总和。它不会出现单一值(包含列表)上的工作,因为在你的例子(尽管它在理论上)。
只要在看最小二乘文档一>,它可能是你的函数func
定义不正确。你假设你总是收到至少长度为2的数组,但优化功能是出奇的含糊其辞,您将收到该数组的长度。您可以尝试写到屏幕的任何apar
是,看看你实际上得到。
如果你正在使用类似ipython
或Python Shell中,你应该会得到堆栈跟踪,告诉你到底是哪行的错误发生,所以从这里开始。如果你不能从那里弄明白,张贴堆栈跟踪可能会帮助我们的。