2.7.5 有限制条件的优化

2.7.5.1 箱边界

2.7.5 有限制条件的优化 - 图1

箱边界是指限制优化的每个函数。注意一些最初不是写成箱边界的问题可以通过改变变量重写。

In [8]:

  1. def f(x):
  2. return np.sqrt((x[0] - 3)**2 + (x[1] - 2)**2)
  3. optimize.fmin_l_bfgs_b(f, np.array([0, 0]), approx_grad=1, bounds=((-1.5, 1.5), (-1.5, 1.5)))

Out[8]:

  1. (array([ 1.5, 1.5]),
  2. 1.5811388300841898,
  3. {'funcalls': 12,
  4. 'grad': array([-0.94868331, -0.31622778]),
  5. 'nit': 2,
  6. 'task': 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL',
  7. 'warnflag': 0})

2.7.5.2 通用限制

相等和不相等限制特定函数: f(x) = 0 and g(x)< 0。

2.7.5 有限制条件的优化 - 图2

In [10]:

  1. def f(x):
  2. return np.sqrt((x[0] - 3)**2 + (x[1] - 2)**2)
  3. def constraint(x):
  4. return np.atleast_1d(1.5 - np.sum(np.abs(x)))
  5. optimize.fmin_slsqp(f, np.array([0, 0]), ieqcons=[constraint, ])
  1. Optimization terminated successfully. (Exit mode 0)
  2. Current function value: 2.47487373504
  3. Iterations: 5
  4. Function evaluations: 20
  5. Gradient evaluations: 5

Out[10]:

  1. array([ 1.25004696, 0.24995304])

In [11]:

  1. optimize.fmin_cobyla(f, np.array([0, 0]), cons=constraint)

Out[11]:

  1. array([ 1.25009622, 0.24990378])

上面这个问题在统计中被称为Lasso#LASSO_method)问题, 有许多解决它的高效方法 (比如在scikit-learn中)。一般来说,当特定求解器存在时不需要使用通用求解器。

拉格朗日乘子法

如果你有足够的数学知识,许多限定优化问题可以被转化为非限定性优化问题,使用被称为拉格朗日乘子法的数学技巧。