我有一个相对简单的优化问题,但不是特别精通 scipy,无法弄清楚如何应用必要的约束。我的目标函数是最小化 10 元素向量y和x之间的绝对距离,其中x是 10x3 参数矩阵p的加权行和
x = p[:,0] + 2 * p[:,1] + 3 * p[:,2]
我需要将以下约束添加到参数矩阵p:
- p的每个元素,但是 >=0 和 <=1
- p的每一列之和必须为 1
- p的每一行之和不得超过1
我试图根据其他 SO 问题来实施约束,尽管我承认我并不完全理解它,也不完全理解它产生的错误。
# import packages
import numpy as np
from scipy.optimize import minimize
# create objective function
def objective(p, y):
x = p[:,0] + 2*p[:,1] + 3*p[:,2]
return np.sum(np.abs(y-x))
# define constraints
cons = [{'type':'ineq', 'fun': lambda x: x},
{'type':'ineq', 'fun': lambda x: np.sum(x, 0)}, # row sum >= 0
{'type':'ineq', 'fun': lambda x: 1 - np.sum(x, 0)}, # row sum <= 1
{'type':'ineq', 'fun': lambda x: np.sum(x, 1) - 1}, # row sum >= 1
{'type':'ineq', 'fun': lambda x: 1 - np.sum(x, 1)}] # row sum <= 1
# generate target data (y)
y = np.array([2.48, 1.75, 1.13, 0.20, 0.20, 0.20, 0.0, 0.0, 0.0, 0.0])
# initialise starting param values
p0 = np.zeros((44,3))
p0[:,:] = 1/44
# solve
sol = minimize(objective, p0, method='SLSQP', constraints=cons)
运行此代码后,我收到以下错误消息:
AxisError:轴 1 超出维度 1 数组的范围
任何帮助深表感谢。