Как использовать функцию минимизации в scipy с ограничениями
Мне нужна помощь относительно функций оптимизации в python (scipy)
проблема заключается в оптимизации f(x)
где x=[a,b,c...n]
. ограничения состоят в том, что значения a, b и т.д. должны быть между 0 и 1 и sum(x)==1
. Функция scipy.optimise.minimize кажется лучшей, поскольку она не требует дифференциала. Как передать аргументы?
Создание ndarray с использованием перестановки слишком велико. Мой настоящий код, как показано ниже: -
import itertools as iter
all=iter.permutations([0.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0],6) if sum==1
all_legal=[]
for i in all:
if np.sum(i)==1:
#print np.sum(i)
all_legal.append(i)
print len(all_legal)
lmax=0
sharpeMax=0
for i in all_legal:
if sharpeMax<getSharpe(i):
sharpeMax=getSharpe(i)
lmax=i
Ответы
Ответ 1
Вы можете сделать ограниченную оптимизацию с помощью COBYLA
или SLSQP
, как сказано в docs.
from scipy.optimize import minimize
start_pos = np.ones(6)*(1/6.) #or whatever
#Says one minus the sum of all variables must be zero
cons = ({'type': 'eq', 'fun': lambda x: 1 - sum(x)})
#Required to have non negative values
bnds = tuple((0,1) for x in start_pos)
Объедините их в функцию минимизации.
res = minimize(getSharpe, start_pos, method='SLSQP', bounds=bnds ,constraints=cons)
Ответ 2
Проверьте .minimize
docstring:
scipy.optimize.minimize(fun, x0, args=(), method='BFGS', jac=None, hess=None, hessp=None, \
bounds=None, constraints=(), tol=None, callback=None, options=None)
Самое главное в вашем случае будет bounds
. Если вы хотите ограничить свой параметр в [0,1] (или (0,1)?), Вам нужно определить его для каждой переменной, например:
bounds=((0,1), (0,1).....)
Теперь, другая часть, sum(x)==1
. Могут быть более элегантные способы сделать это, но рассмотрите это: вместо минимизации f(x)
вы минимизируете h=lambda x: f(x)+g(x)
, новую важную функцию f(x)+g(x)
, где g(x)
- это функция, которая достигает минимального значения при sum(x)=1
. Например, g=lambda x: (sum(x)-1)**2
.
Минимальный h(x)
достигается, когда оба f(x)
и g(x)
находятся на их минимуме. Вид случая метода множителя Лагранжа http://en.wikipedia.org/wiki/Lagrange_multiplier