You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy.optimize.minimize时输入权重向量形状异常问题求助

问题定位与修复方案
  • 核心错误:目标函数参数顺序不匹配
    scipy.optimize.minimize的执行逻辑是:将优化变量(即x0传入的权重向量)作为第一个参数传递给目标函数,之后才是args中指定的额外参数。你当前的ES_calc_sum函数把pi_bad放在第一个参数位,导致参数传递完全错位:

    • 原本的权重向量被传给了pi_bad参数
    • 原本的pi_bad标量被传给了weights参数
      这就是为什么打印weights时显示单个数值,后续矩阵乘法x @ cov_good_matrix因输入维度不匹配报错。
  • 修复步骤

  1. 调整目标函数ES_calc_sum的参数顺序,将weights放在第一位:
def ES_calc_sum(weights, pi_bad, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha):
    print(weights)  # 现在会正确打印权重向量
    sum_val = np.sum(risk_contribution(pi_bad, weights, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha))
    return sum_val

注意:避免使用sum作为变量名,它是Python内置函数,容易引发冲突

  1. 同步修正minimize调用中的args参数顺序,确保和目标函数的参数对应:
res = minimize(ES_calc_sum, 
               x0=weights, 
               args=(pi_bad, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha), 
               method="SLSQP", 
               bounds=bnds, 
               constraints=cont, 
               tol=0.0001)
  1. 修复约束条件中的语法错误(多余的嵌套括号):
    原约束中第二个等式的fun存在多余括号,修正后:
cont = ({"type": "eq", "fun": lambda x: np.sum(x) - 1},
        {"type": "eq", "fun": lambda x: (1 - pi_bad) * np.sqrt(x @ cov_good_matrix @ x) + pi_bad * np.sqrt(x @ cov_bad_matrix @ x) - target_vol})
  • 完整修正后的代码
def ES_calc_sum(weights, pi_bad, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha):
    print(weights)
    sum_val = np.sum(risk_contribution(pi_bad, weights, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha))
    return sum_val

weights = np.array([0.5,0.25,0.25])

def RC_minimizer(target_vol, weights, pi_bad, mu_good_vector, 
    mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha):

     bnds = Bounds(0, 1)
     cont = ({"type": "eq", "fun": lambda x: np.sum(x) - 1},
            {"type": "eq", "fun": lambda x: (1 - pi_bad) * np.sqrt(x @ cov_good_matrix @ x) + pi_bad * np.sqrt(x @ cov_bad_matrix @ x) - target_vol})

     res = minimize(ES_calc_sum, x0=weights, args=(pi_bad, mu_good_vector, mu_bad_vector, cov_good_matrix, cov_bad_matrix, alpha), method="SLSQP", bounds=bnds, constraints=cont, tol=0.0001)

     w_opt = res.x

     return w_opt

内容的提问来源于stack exchange,提问作者Ginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:14:55