多变量优化(scipy.optimize.minimize)
Optimization (with scipy.optimize.minimize) with multiple variables
我想对一个方程实施 Nelder-Mead 优化。但它不只包含一个变量,它包含多个变量(其中一个是未知的,其他是已知的。)
例如在这个例子中:
http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html
如果我的 rosen(x) 是
def rosen(x,y):
... """The Rosenbrock function"""
... return sum(100.0*(x[1:]-x[:-1]**2.0)**y + (1-x[:-1])**2.0)
而不是示例中提到的这个,我该如何优化它?
如果我打电话给
res = minimize(rosen, x0, method='nelder-mead',
... options={'xtol': 1e-8, 'disp': True})
它说需要两个参数
如果我打电话
res = minimize(rosen(y), x0, method='nelder-mead',
... options={'xtol': 1e-8, 'disp': True})
之前已经在代码中定义了 y,我得到了同样的错误。而如果我调用它
res = minimize(rosen(x,y), x0, method='nelder-mead',
... options={'xtol': 1e-8, 'disp': True})
我收到 x 未定义的错误。
向对象传递参数是通过参数 args
完成的。优化 rosen(x,2)
:
import numpy as np
from scipy.optimize import minimize
def rosen(x, y):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**y + (1-x[:-1])**2.0)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, args=(2,), method='nelder-mead',
options={'xtol': 1e-8, 'disp': True})
注意变量x
是一个5维向量,正如你在起点x0
的定义中看到的那样,因此rosen(x,2)
有五个变量。如果你想最小化 rosen(x,y)
,定义一个 objective 函数
def rosen2(zz):
return rosen(zz[:5], zz[5])
我想对一个方程实施 Nelder-Mead 优化。但它不只包含一个变量,它包含多个变量(其中一个是未知的,其他是已知的。)
例如在这个例子中: http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html
如果我的 rosen(x) 是
def rosen(x,y):
... """The Rosenbrock function"""
... return sum(100.0*(x[1:]-x[:-1]**2.0)**y + (1-x[:-1])**2.0)
而不是示例中提到的这个,我该如何优化它? 如果我打电话给
res = minimize(rosen, x0, method='nelder-mead',
... options={'xtol': 1e-8, 'disp': True})
它说需要两个参数 如果我打电话
res = minimize(rosen(y), x0, method='nelder-mead',
... options={'xtol': 1e-8, 'disp': True})
之前已经在代码中定义了 y,我得到了同样的错误。而如果我调用它
res = minimize(rosen(x,y), x0, method='nelder-mead',
... options={'xtol': 1e-8, 'disp': True})
我收到 x 未定义的错误。
向对象传递参数是通过参数 args
完成的。优化 rosen(x,2)
:
import numpy as np
from scipy.optimize import minimize
def rosen(x, y):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**y + (1-x[:-1])**2.0)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, args=(2,), method='nelder-mead',
options={'xtol': 1e-8, 'disp': True})
注意变量x
是一个5维向量,正如你在起点x0
的定义中看到的那样,因此rosen(x,2)
有五个变量。如果你想最小化 rosen(x,y)
,定义一个 objective 函数
def rosen2(zz):
return rosen(zz[:5], zz[5])