6

我有一个函数,它接受多个参数(一个数组和两个浮点数)并返回一个标量(浮点数)。现在我想通过改变两个参数来最小化这个函数:两个浮点数。数组在函数内部“解包”,然后使用其内容(数组和浮点数)。

如何使用 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, ???)

提前谢谢了!

万事如意,pp

4

2 回答 2

5

scipy假设参数在一个数组中。您可以定义一个辅助函数:

def helper(xy):
    return func(xy[0], xy[1], data)

并最小化它optimize.fmin

optimize.fmin(helper, np.array([x0, y0]), ...)
于 2013-01-17T16:51:07.747 回答
3

我在 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和元组(使用, , ... 和, , ...)。argsy=x[0]z=x[1]data1=args[0]data2=args[1]

于 2013-01-18T09:44:47.520 回答