我需要基于两个损耗变量L1和L2来最小化损耗。所以我的目标函数是
z=a*L1+(1-a)*L2,subject to constraint
L2-L1<=G1
我有大约一百万行csv格式的记录。每行包含1个L1,1的L2值和1个G1的值以及a的1个值。考虑到数据大小,我认为可以使用信任区域内部点优化。 首先,我从数据集中提取了12行的小数据,并编写了以下代码。
from scipy.optimize import LinearConstraint
from scipy.optimize import minimize
from scipy.optimize import SR1
df=pd.read_csv('subset.csv')
linear_constraint = LinearConstraint([[-1, 1], [-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1],[-1, 1]],
[-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf,-np.inf], [0.0313,0.7153,0.1341,0.338,0,0.0182,0.2188,0.3234,0.5558,0,0.1382,0.7191])
L1=df.iloc[:,19].values
L2=df.iloc[:,18].values
x=np.concatenate([L1,L2])
a=df.iloc[:,17]
def loss(x):
return sum(a*x[0:12]+(1-a)*x[12:24])
def jacobian_const(x):
L=len(x)
Lo2=int(L/2)
def row_i(l,N):
No2 = int(N/2)
col_i =[0.0]*N
col_i[l-1] =-1
col_i[l-1+No2] = 1
return col_i
J = row_i(1,L)
Jacobian=[]
Jacobian.append(J)
type(J)
for l in range(1,Lo2):
Jacobian.append(row_i(2,L))
return Jacobian
res = minimize(loss, x, method='trust-constr',jac=jacobian_const,hess=SR1(),
constraints=[linear_constraint],
options={'verbose': 1})
运行此代码后,我收到错误消息
ValueError:形状(12,2)和(24,)不对齐:2(dim 1)!= 24(dim 0)
您能建议我为消除此错误而需要做哪些更改?很抱歉,我无法共享数据。这是客户数据