У меня есть проблема максимизации, которую я хотел бы решить:
Для этого я с нетерпением жду возможности использовать функцию minimize
из библиотеки scipy
.
Прежде чем перейти к тому, что я пробовал, я определю каждую из переменных:
mu=[[-0.241035],
[ 0.03557551],
[-0.00410642],
[-0.43985304],
[-0.24741543]]
landa= 42.74650697 # is a scalar
E =[[0.000167,0.000032,0.000082,0.000055,0.000055],
[0.000032,0.000131,0.000019,0.000043,0.000032],
[0.000082,0.000019,0.000273,0.000110,0.000086],
[0.000055,0.000043,0.000110,0.000229,0.000131],
[0.000055,0.000032,0.000086,0.000131,0.000165]]
В funct0
Я устанавливаю функцию максимизации, которая появляется на прикрепленном изображении, и определяю матрицу весов.
def funct0(x):
x0,x1,x2,x3,x4=x
weights= np.array([x0,x1,x2,x3,x4])
return -1*(np.matmul(weights.T , mu) - np.matmul(np.matmul (landa*weights.T, E ),weights) /2)
В funct1
я установил границы и ограничение, потому что хочу, чтобы переменные в весах x0,x1,x2,x3,x4
суммировались до 1.
def funct1():
x0=np.array([1,1,1,1,1])
cons = ({'type': 'eq', 'fun': lambda x: sum(x) - 1})
res=minimize(funct0, x0, bounds=[[0,None] for i in range(len(x0))],options={"disp": False}, constraints=cons)
return res.x
print(funct1())
При выполнении этого скрипта он выводит
[ 0 1 0 0 0]
Я не уверен, что максимизация верна, потому что она присваивает все переменной x1
, тогда как остальным x0
x2
x3
x4
присваивается 0 значений.
Было бы разумно, если бы функция, установленная в funct0
, была линейной функцией w
и mu
, потому что при этом она присваивает все значения x1
, что соответствует ее наибольшему значению в mu
Я думал, что мой вывод будет более "диверсифицированным" назначением значений среди w
переменных в матрице, учитывая нелинейность функции.
Возможно, я неправильно настраивал функцию в funct0
?
Возможно, я использую неправильную оптимизацию?
Ваша помощь высоко ценится.