2.7.5 有限制条件的优化
2.7.5.1 箱边界
箱边界是指限制优化的每个函数。注意一些最初不是写成箱边界的问题可以通过改变变量重写。
- scipy.optimize.fminbound()进行一维优化
- scipy.optimize.fmin_l_bfgs_b()带有边界限制的quasi-Newton方法:
In [8]:
def f(x):
return np.sqrt((x[0] - 3)**2 + (x[1] - 2)**2)
optimize.fmin_l_bfgs_b(f, np.array([0, 0]), approx_grad=1, bounds=((-1.5, 1.5), (-1.5, 1.5)))
Out[8]:
(array([ 1.5, 1.5]),
1.5811388300841898,
{'funcalls': 12,
'grad': array([-0.94868331, -0.31622778]),
'nit': 2,
'task': 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL',
'warnflag': 0})
2.7.5.2 通用限制
相等和不相等限制特定函数: f(x) = 0 and g(x)< 0。
- scipy.optimize.fmin_slsqp() 序列最小二乘程序: 相等和不相等限制:
In [10]:
def f(x):
return np.sqrt((x[0] - 3)**2 + (x[1] - 2)**2)
def constraint(x):
return np.atleast_1d(1.5 - np.sum(np.abs(x)))
optimize.fmin_slsqp(f, np.array([0, 0]), ieqcons=[constraint, ])
Optimization terminated successfully. (Exit mode 0)
Current function value: 2.47487373504
Iterations: 5
Function evaluations: 20
Gradient evaluations: 5
Out[10]:
array([ 1.25004696, 0.24995304])
- scipy.optimize.fmin_cobyla()通过线性估计的限定优化:只有不相等限制:
In [11]:
optimize.fmin_cobyla(f, np.array([0, 0]), cons=constraint)
Out[11]:
array([ 1.25009622, 0.24990378])
上面这个问题在统计中被称为Lasso#LASSO_method)问题, 有许多解决它的高效方法 (比如在scikit-learn中)。一般来说,当特定求解器存在时不需要使用通用求解器。
拉格朗日乘子法
如果你有足够的数学知识,许多限定优化问题可以被转化为非限定性优化问题,使用被称为拉格朗日乘子法的数学技巧。