我有这个功能:
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)
但我想明白为什么我的第一个不起作用。
答案 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
上。它不是使用多个参数,而是使用一个包含多个元素的参数。