Scipy最小化fmin - 语法问题

时间:2013-01-17 16:46:54

标签: python optimization scipy minimize

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

如何使用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。

2 个答案:

答案 0 :(得分:5)

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

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

并使用optimize.fmin最小化它:

optimize.fmin(helper, np.array([x0, y0]), ...)

答案 1 :(得分:3)

我在SciPy的documentation中找到了答案!我只是不习惯文档的编程“术语”......(尽管文档对于像我这样的新手非常有用)。

所以,这样做的方法如下:

  • 不应像我的问题那样定义函数(最小化),而应将其定义为

    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],...和data1=args[0],{{ 1}},...)。