Как объединить инициализацию ограничений при оптимизации с помощью scipy?
У меня есть несколько предикторов X1...Xk и зависимая переменная Y с одинаковой размерностью N. Мне необходимо инициализировать ограничения в следующем формате:
a + X1*b+...Xk*b + (p + X1*q+...Xk*q) - Y
-a + -X1*b-...Xk*b + (p - X1*q-...Xk*q) + Y
Для оптимизации я использую библиотеку scipy в Python. Для небольшой выборки и одного предиктора инициализация ограничений выглядела так:
def constraint1(x):
return x[0] + 2.0*x[1] + (x[2] + 2.0*x[3]) - 14.0
def constraint2(x):
return x[0] + 4.0*x[1] + (x[2] + 4.0*x[3]) - 11.0
def constraint3(x):
return x[0] + 6.0*x[1] + (x[2] + 6.0*x[3]) - 17.0
def constraint4(x):
return -x[0] - 2.0*x[1] + (x[2] - 2*x[3]) + 14.0
def constraint5(x):
return -x[0] - 4.0*x[1] + (x[2] - 4.0*x[3]) + 11.0
def constraint6(x):
return -x[0] - 6.0*x[1] + (x[2] - 6.0*x[3]) + 17.0
здесь численные значения это как раз предиктор X и зависимая переменная Y Далее, каждое ограничение приводилось к стандартному виду:
con1 = {'type': 'ineq', 'fun': constraint1}
И затем все они объединялись в один массив:
cons = ([con1,con2,con3,con4,con5,con6])
Моя проблема заключается в том, что я не знаю, как можно объединить инициализацию для N ограничений и как указать не один предиктор, а сразу несколько, когда заранее неизвестно какое число их будет.