【问题标题】:Scipy minimize objective element-wiseScipy 最小化目标元素
【发布时间】:2019-05-17 04:22:20
【问题描述】:

我正在尝试将 scipy 最小化器应用于以多个 np.arrays 作为参数的矢量化目标函数。在这个例子中,我想将obj(x,p) 相对于x 最小化,同时将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')

返回ValueError: setting an array element with a sequence.

谁能帮忙?

提前非常感谢!

【问题讨论】:

  • @vectorize 的用途是什么?未装饰的obj 对您有什么作用(或打算做什么)?它是否返回不同的值?
  • 你是对的!这里不需要装饰器..

标签: python scipy vectorization minimize


【解决方案1】:

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

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

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

【讨论】:

  • 我想为obj 数组中的每个元素找到最小的x。理想情况下没有循环......
  • 听起来像循环是很自然的事情;在这种情况下,您想重新初始化所有内容(包括 NM 单纯形)。它也应该相当不痛,因为您要做的事情归结为np.array([minimize(obj, x0 = xi, args = pi, method='Nelder-Mead').x[0] for xi, pi in zip(xinit, p)])
  • 当然,numba.vectorize 装饰完全可以正常工作,但它最终确实是多余的(因为 NM 的实现独立评估每个顶点)。
  • 非常感谢!你的绝招彻底解决了我的问题!而且速度很快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2013-12-03
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多