mindspore.scipy.optimize.minimize

mindspore.scipy.optimize.minimize(func, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)[源代码]

最小化一个或多个变量的标量函数。

此函数的API与SciPy匹配,但有一些细微的差异:

jac 为None时,会使用MindSpore的自动微分功能计算 func 的反向梯度。 method 参数是必需的。如果不指定求解器,将触发异常。 尚未实现SciPy接口中的如下可选参数:”hess””hessp””bounds””constraints””tol””callback”。 由于线搜索实现的差异,优化结果可能与SciPy不同。

说明

  • minimize 接口当前还不支持多维Tensor输入或求微分,但有支持的计划。

  • Windows平台上还不支持 minimize

  • LAGRANGE 方法仅在 GPU 上支持。

参数:
  • func (Callable) - 要最小化的目标函数 \(fun(x,*args) -> float\),其中 x 是一个一维数组,其shape为 \((n,)\)args 是一个Tuple,用于指定 func 的执行所需的所有参数。 当 jac 为None时,func 必须能支持微分。

  • x0 (Tensor) - 初始猜测。shape为 \((n,)\) 的实数数组,其中 n 是自变量的个数。

  • args (Tuple) - 传递给目标函数的额外参数。默认值:()

  • method (str) - 求解器类型。应为 “BFGS”“LBFGS”“LAGRANGE” 中的一种。

  • jac (Callable, 可选) - 计算梯度向量的函数。 只支持 “BFGS”“LBFGS”。如果为None,则将使用 func 的反向梯度函数进行梯度计算。 如果 jac 是可执行的,则应该是能返回梯度向量的函数:\(jac(x, *args) -> array\_like, shape (n,)\),其中x是一个数组,其shape为 \((n,)\)args 是一个具有固定参数的元组。

  • hess (Callable, 可选) - 计算Hessian矩阵的方法。当前尚未实现。

  • hessp (Callable, 可选) - 目标函数的Hessian乘以任意向量 p 。当前尚未实现。

  • bounds (Sequence, 可选) - x 中的每个元素的 (min, max) 对的序列。当前尚未实现。

  • constraints (Callable, 可选) - 表示不等式的约束,约束中的每个函数都将 function < 0 表示为不等式约束。

  • tol (float, 可选) - 异常终止的容差范围。如需更具体的操控,请使用求解器里专门的选项。默认值:None

  • callback (Callable, 可选) - 每次迭代后调用的可执行函数。当前尚未实现。

  • options (Mapping[str, Any], 可选) - 用于保存求解器可选项的字典。所有求解器方法都能支持下述通用选项。默认值:None

    • "history_size" (int) - 用于更新Hession矩阵的逆的缓冲区大小,仅支持与 method=”LBFGS” 一起使用。默认值:20

    • "maxiter" (int) - 要执行的最大迭代次数。根据方法的不同,每个迭代可能会使用多个函数进行求值。

    以下选项是拉格朗日方法的专有选项:

    • "save_tol" (list) - 保存 tol 的列表,长度与 constrains 相同。

    • "obj_weight" (float) - 目标函数的权重,通常在1.0 - 100000.0之间。

    • "lower" (Tensor) - 变量的下限约束,必须具有与 x0 相同的shape。

    • "upper" (Tensor) - 变量的上限约束,必须具有与 x0 相同的shape。

    • "learning_rate" (float) - 每个Adam步骤的学习率。

    • "coincide_func" (Callable) - 子函数,表示目标函数和约束之间的公共部分,用于避免冗余计算。

    • "rounds" (int) - 更新拉格朗日乘数的次数。

    • "steps" (int) - 每执行 steps 次就执行一次Adam去更新拉格朗日乘数。

    • "log_sw" (bool) - 是否打印每一步的 loss 值。

返回:

优化的结果。

支持平台:

GPU CPU

样例:

>>> import numpy as onp
>>> from mindspore.scipy.optimize import minimize
>>> from mindspore import Tensor
>>> x0 = Tensor(onp.zeros(2).astype(onp.float32))
>>> def func(p):
...     x, y = p
...     return (x ** 2 + y - 11.) ** 2 + (x + y ** 2 - 7.) ** 2
>>> res = minimize(func, x0, method='BFGS', options=dict(maxiter=None, gtol=1e-6))
>>> print(res.x)
[3. 2.]
>>> l_res = minimize(func, x0, method='LBFGS', options=dict(maxiter=None, gtol=1e-6))
>>> print(l_res.x)
[3. 2.]