我有一个凸优化案例,我试图求解2组不同的权重。第一个数据帧是(10,3),第二个数据帧是(10,10)和向量(10,1)。我编写了以下伪代码,只是随机选择了值来演示问题。
import pandas as pd
import numpy as np
import cvxpy as cvx
data_E_df = pd.DataFrame({'Series1':[0.2,0,0.2,0,0.2,0,0.2,0,0.2,0],'Series2':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'Series3':[0.3,0.2,0,0,0,0,0,0,0.3,0.2]})
data_S_df = pd.DataFrame({'1':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'2':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'3':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
'4':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'5':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'6':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
'7':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'8':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'9':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
'10':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]})
betas_vec = pd.DataFrame({'BETA':[0,1,0,1,0,1,0,1,0,1]})
cov = np.array([[1,0,0,0,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0,0,0],
[0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,1,0,0,0],
[0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,0,0,1]])
Weights_E_series = cvx.Variable(3,1)
Weights_S_series = cvx.Variable(10,1)
# Works
#constraints =[
#cvx.sum_entries(data_E_df['Series1'].as_matrix()*cvx.mul_elemwise(betas_vec['BETA'].as_matrix(), Weights_E_series[0])
#+ data_S_df.as_matrix()*Weights_S_series) == 1., Weights_E_series >= 0.0, Weights_S_series >= 0.0]
constraints =[
cvx.sum_entries(data_E_df.as_matrix() * betas_vec['BETA'].as_matrix() * Weights_E_series
+ data_S_df.as_matrix()*Weights_S_series) == 1., Weights_E_series >= 0.0, Weights_S_series >= 0.0]
prob = cvx.Problem(cvx.Minimize(cvx.quad_form(data_E_df.as_matrix()*Weights_E_series + data_S_df.as_matrix()*Weights_S_series, cov)), constraints)
prob.solve()
print(Weights_E_series.value)
print(Weights_S_series.value)
有没有办法让我获得data_E_df * Weights_E_series * betas_vec的约束,而无需编码每个Series1,Series2列* betas_vec * Weights_E_series []组合?