我有一个函数,它接受几个参数(一个数组和两个浮点数)并返回一个标量(浮点数)。现在我想通过改变两个参数来最小化这个函数:两个浮点数。在函数内部对数组进行"解包",然后使用其内容(数组和浮点数)。
如何使用SciPy的fmin函数来完成?我有一个非常困难的时间找出正确的语法…
函数类似于:
def func(x, y, data)
data1=data[0]
data2=data[...]
...
...
result = ...x...y...data1...data2... #result is a scalar (float)
return result
在这种情况下scipy.optimize.fmin
应该是什么样子?
optimize.fmin(func, ???)
提前感谢!
祝你一切顺利。p.p。scipy
假定参数位于数组中。您可以定义一个辅助函数:
def helper(xy):
return func(xy[0], xy[1], data)
用optimize.fmin
:
optimize.fmin(helper, np.array([x0, y0]), ...)
我在SciPy的文档中找到了答案!我只是不习惯文档中的编程"行话"……(尽管文档对我这样的新手来说非常有用)。
那么,这样做的方法如下:
-
不像我的问题那样定义函数(要最小化),它应该定义为
def func(x, *args) #it is literally "*args"! y=x[0] z=x[1] data1=data[0] data2=data[...] ... result = ...y...z...data1...data2... #result is a scalar (float) return result
-
现在,
optimize.fmin
函数应该是optimize.fmin(func, x0=[y_estimate, z_estimate], args=(data))
显然(也许我错了)当你提供数组x0
(初始猜测)给optimize.fmin
函数时,它就知道它必须用x0
的"大小"来优化数组。函数中需要的所有其他数据都必须在元组args
中给出(在本例中,元组args
中只有一个数组,但它可以是args=(data1, data2, ...)
,在这种情况下,您不需要在函数中解包它)。
总结:最初的猜测x0
只是一个数组;额外的参数args
只是一个元组;函数应该定义为(字面上!)def func(x, *args)
;数组x
和元组args
然后可以在函数内"解包"(与y=x[0]
, z=x[1]
,…and data1=args[0]
, data2=args[1]
,…).