对于 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])
minimize
用于像 Rosenbrock 这样的标量函数,这不是最小二乘问题。optimize.rosen
和optimize.rosen_der
的功能。jac_rosenbrock
函数不是rosenbrock
的导数,应该没有指数大于~~max_nfev
kwd)。优化收敛而不达到函数评估的上限是可取的。编辑:误认为#3,忘记了 x**4。
(真的不要用 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