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

如何求解预测向量非负权重线性组合最优拟合目标,基于Python quadprog实现

带约束的预测权重求解实现方法

问题转化为二次规划形式

你要解决的是带约束的最小均方误差问题,约束条件为:

  • 所有权重非负:w_j ≥ 0, j=1,2,...,n
  • 权重和为1:Σw_j = 1

该问题属于典型的带约束二次规划问题,quadprog库求解的标准二次规划形式为:

最小化:0.5 * x^T G x + a^T x
约束:C^T x ≥ b
其中meq参数指定前meq个约束为等式约束,剩余为不等式约束。

对应参数映射

对应你的权重求解需求,各参数映射关系如下:

  1. 设预测矩阵F维度为[n, N],n为预测源数量,N为样本数量,目标向量t维度为[N]
  2. 目标函数中的G:2 * (F @ F.T) + ε * I,加ε=1e-8的单位矩阵是为了避免数值计算时矩阵奇异
  3. 目标函数中的a:-2 * (F @ t)
  4. 约束矩阵C:第一列为全1向量(对应权重和为1的等式约束),后续列是单位矩阵(对应每个权重非负的不等式约束)
  5. 约束值向量b:第一个元素为1,其余元素为0
  6. meq=1:指定第一个约束为等式约束

完整代码示例

import numpy as np
import quadprog

# 示例数据
target = np.array([1.0, 1.02, 1.01, 1.04])
forecasts = np.array([
    [0.9, 0.91, 0.92, 0.91],
    [1.1, 1.11, 1.13, 1.11],
    [1.21, 1.23, 1.21, 1.23]
])

n_pred = forecasts.shape[0]

# 构造二次规划参数
G = forecasts @ forecasts.T
G = G + 1e-8 * np.eye(n_pred)  # 正则化避免矩阵奇异
a = -2 * forecasts @ target

# 构造约束条件
C = np.hstack([np.ones((n_pred, 1)), np.eye(n_pred)])
b = np.zeros(n_pred + 1)
b[0] = 1

# 求解权重
weights, *other_outputs = quadprog.solve_qp(G, a, C, b, meq=1)

print("求解得到的权重:", weights.round(4))
# 输出结果近似为 [0.5, 0.5, 0.],符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:21:01