Scipy函数muliple参数

时间:2016-06-11 20:32:09

标签: python arrays numpy scipy

我有这个功能:

def error(w0, w1):
    return sum((data.Height - (w1*data.Weight+w0))**2)

然后我想用res = scipy.optimize.minimize(error, (1, 2), ...

对其进行优化

当我尝试运行它时,我遇到错误:TypeError: error() takes exactly 2 arguments (1 given)

当我将我的功能更改为:

时,我发现这个错误并不适合
def error(w):
    return sum((data.Height - (w[1]*data.Weight+w[0]))**2)

但我想明白为什么我的第一个不起作用。

2 个答案:

答案 0 :(得分:1)

如果你看一下这个函数的文档,那就说

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)[source]

有趣的是你的功能,而args是你发送的参数。现在在您的第一个代码中,您的目标函数有2个参数,但您发送的是元组,这就是根据文档应该做什么。

因此,简而言之,您发送给目标函数的是一个元组,但那里有两个参数,这就是错误弹出的原因。

出于同样的原因,你的第二个代码作为w工作只是一个元组,因此代码可以工作!

答案 1 :(得分:0)

minimize(fun, x0, args=(), method=None,....):
"""
 minimize f(x) subject to
   ...
    where x is a vector of one or more variables.

所以第一个参数是你的函数error,第二个参数是x0,在你的情况下是一个元组,即初始猜测。代码所做的第一件事就是将x0转换为数组x0 = np.asarray(x0)

看一个示例函数:

fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2

我没有使用过这么多,但是如果你这样做,你的功能看起来确实有用:

error(np.array([1,2]))

这与你的第二种形式一致,但不是第一种形式。

换句话说,minimize的工作原理是从初始值np.array(x0)开始,将其插入error,并根据返回值尝试其他2个元素数组,变体在最初的x0上。它不是使用多个参数,而是使用一个包含多个元素的参数。