1

我在 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() 调用有什么问题,请帮助我

4

3 回答 3

2

leastsq与向量一起使用,因此残差函数func需要返回长度至少为 2 的向量。因此,如果您替换return eqnreturn [eqn, 0.],您的示例将起作用。运行它给出:

optimized parameters:  (array([10., 10.]), 2)

这是绝对差异最小值的许多正确答案之一。

如果你想最小化一个标量函数,fmin是要走的路,optimize.fmin(func, Init).

这里的问题是这两个函数,尽管它们对于标量看起来相同,但它们针对不同的目标。 leastsq通常从一组理想化曲线中找到最小二乘误差,并且只是进行“最佳拟合”的一种方法。另一方面,fmin找到标量函数的最小值。

显然,你的例子是一个玩具例子,对于这两个例子都没有真正的意义,所以你走哪条路将取决于你的最终目标是什么。

于 2009-09-28T19:24:23.387 回答
1

仅查看最小二乘法文档,可能是您的函数func定义不正确。您假设您总是收到一个长度至少为 2 的数组,但是优化函数对于您将收到的数组的长度非常模糊。你可以试着写到屏幕apar上,看看你实际得到了什么。

如果你使用类似ipythonPython shell 的东西,你应该得到堆栈跟踪,准确地显示错误发生在哪一行,所以从那里开始。如果您无法从那里弄清楚,发布堆栈跟踪可能会对我们有所帮助。

于 2009-09-28T18:10:54.943 回答
1

由于您要最小化一个简单的标量函数(func()返回单个值,而不是值列表),scipy.optimize.leastsq()因此应替换为对其中一个fmin函数的调用(使用适当的参数):

x = optimize.fmin(func, Init)

正确工作!

实际上,leastsq()最小化值列表的平方和。它似乎不适用于(包含一个)单个值的列表,如您的示例(即使理论上可以)。

于 2009-09-28T20:26:18.567 回答