提供雅可比矩阵不会改善优化?

问题描述 投票:0回答:1

对于 Rosenbrock 函数,我尝试在有和没有雅可比矩阵的情况下使用 scipy.optimize.least_squares。我希望雅可比行列式能改进计算,但事实并非如此。结果是一样的:

import numpy as np
from scipy.optimize import least_squares
import pandas as pd

def fun_rosenbrock(x):
    return 10 * (x[1] - x[0]**2)**2 + (1 - x[0])**2
    #return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])

def jac_rosenbrock(x):
    return np.array([
        40 * x[0] ** 3 - 40 * x[0] * x[1] + 2 * x[0] - 2,
        -20 * x[0] ** 2 + 20 * x[1]
        ])

x0_rosenbrock = np.array([20, 20])
res_1 = least_squares(fun_rosenbrock, x0_rosenbrock)
res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock)

print(res_1)
print(res_2)

在这两种情况下,结果如下所示。如果结果相同,提供雅可比矩阵有什么意义?

 active_mask: array([0., 0.])
        cost: 444.17831429066666
         fun: array([29.80531209])
        grad: array([77.13171789, 45.15551332])
         jac: array([[2.58785138, 1.51501562]])
     message: 'The maximum number of function evaluations is exceeded.'
        nfev: 200
        njev: 194
  optimality: 77.13171788839948
      status: 0
     success: False
           x: array([-4.45416634, 19.91534845])
scipy least-squares scipy-optimize-minimize
1个回答
0
投票
  1. 您想将
    minimize
    用于像 Rosenbrock 这样的标量函数,这不是最小二乘问题。
  2. 您可以使用
    optimize.rosen
    optimize.rosen_der
    的功能。
  3. ~~你给出的
    jac_rosenbrock
    函数不是
    rosenbrock
    的导数,应该没有指数大于~~
  4. 此优化提前停止,因为函数评估的最大数量受到限制(请参阅
    max_nfev
    kwd)。优化收敛而不达到函数评估的上限是可取的。
  5. 如果提供梯度/雅可比矩阵,我不一定期望找到更好的解决方案,我只希望优化以更快的方式接近解决方案。

编辑:误认为#3,忘记了 x**4。

回复2

(真的不要用 least_squares 来解决这个问题)下面是当你使用

minimize
时会发生什么。你可以看到函数和梯度评估的数量显着下降。

import numpy as np
from scipy.optimize import rosen, rosen_der, minimize

x0_rosenbrock = np.array([20, 20])
res_1 = minimize(rosen, x0_rosenbrock, method="trust-constr")
res_2 = minimize(rosen, x0_rosenbrock, jac=rosen_der, method="trust-constr")

print(res_1, "\n")
print(res_2)
          message: `gtol` termination condition is satisfied.
          success: True
           status: 1
              fun: 2.005482523286743e-11
                x: [ 1.000e+00  1.000e+00]
              nit: 101
             nfev: 303
             njev: 101
             nhev: 0
         cg_niter: 179
     cg_stop_cond: 1
             grad: [-1.737e-11  1.326e-10]
  lagrangian_grad: [-1.737e-11  1.326e-10]
           constr: []
              jac: []
      constr_nfev: []
      constr_njev: []
      constr_nhev: []
                v: []
           method: equality_constrained_sqp
       optimality: 1.326272425217212e-10
 constr_violation: 0
   execution_time: 0.08397698402404785
        tr_radius: 0.7739754169155908
   constr_penalty: 1.0
            niter: 101 

          message: `gtol` termination condition is satisfied.
          success: True
           status: 1
              fun: 1.4973796385498187e-16
                x: [ 1.000e+00  1.000e+00]
              nit: 72
             nfev: 72
             njev: 72
             nhev: 0
         cg_niter: 115
     cg_stop_cond: 4
             grad: [-6.575e-09 -8.941e-09]
  lagrangian_grad: [-6.575e-09 -8.941e-09]
           constr: []
              jac: []
      constr_nfev: []
      constr_njev: []
      constr_nhev: []
                v: []
           method: equality_constrained_sqp
       optimality: 8.941003493134758e-09
 constr_violation: 0
   execution_time: 0.04044008255004883
        tr_radius: 12.14199033273334
   constr_penalty: 1.0
            niter: 72
© www.soinside.com 2019 - 2024. All rights reserved.