Scipy 按元素最小化 objective

Scipy minimize objective element-wise

我正在尝试将 scipy 最小化器应用于将多个 np.arrays 作为参数的矢量化 objective 函数。在这个例子中,我想相对于 x 按元素最小化 obj(x,p),同时将 p 固定。对于 p = np.array([2,3,4]),最小值应为 2、3 和 4。

但是

import numpy as np
from numba import vectorize, float64
from scipy.optimize import minimize
xinit = np.array([1,1,1])
p = np.array([2,3,4])

@vectorize([float64(float64,float64)])
def obj(x,p):
    return((x-p)**2)

minimize(obj, x0 = xinit,args = p, method='Nelder-Mead')

returns一个ValueError: setting an array element with a sequence.

谁能帮忙?

提前致谢!

目前尚不清楚您要实现的目标:(x-p)**2 是一个数组,因此将其用作 objective 不是明确定义的操作(因为没有合理的顺序使用)。也许您真的想要两个参数之间的平方距离? IE。相当于

def obj(x, p):
    return np.linalg.norm(x-p)**2

这会起作用并找到合适的最小值,但此时 vectorize 签名不再有效;如果您愿意,可调用对象仍然可以使用 Numba 进行 JIT 编译。