Scipy最大限度地减少语法问题



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

如何使用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],…).

最新更新