找到最适合目标向量的向量线性组合

Mat*_*dge 3 python linear-programming quadprog quadratic-programming

我试图找到多个预测的权重,以给出尽可能接近已知目标的结果(例如均方误差)。

以下是一个简化示例,显示了四个数据点的三种不同类型的预测:

target = [1.0, 1.02, 1.01, 1.04]  # all approx 1.0
forecasts = [
    [0.9, 0.91, 0.92, 0.91],  # all approx 0.9
    [1.1, 1.11, 1.13, 1.11],  # all approx 1.1
    [1.21, 1.23, 1.21, 1.23]  # all approx 1.2
]
Run Code Online (Sandbox Code Playgroud)

其中,一个预测值始终约为 0.9,一个预测值始终约为 1.1,一个预测值始终约为 1.2。

我想要一种自动找到[0.5, 0.5, 0.0]三个预测的权重的方法,因为对前两个预测进行平均并忽略第三个预测非常接近目标。理想情况下,权重应限制为非负数且总和为 1。

我需要使用某种形式的线性规划或二次规划来做到这一点。我已经安装了 Python fourprog 库,但我不确定如何将此问题转换为此类求解器所需的形式。有人能指出我正确的方向吗?

Roi*_*oim 5

如果我理解正确的话,您想要对一些优化问题进行建模并解决它。如果您对一般情况(没有任何约束)感兴趣,您的问题似乎非常接近常规最小二乘误差问题(scikit-learn例如,您可以用它来解决)。

我建议使用cvxpy库来建模优化问题。这是对凸优化问题进行建模的便捷方法,您可以选择要在后台运行的求解器。

通过添加您提到的约束来扩展cvxpy 最小二乘示例:

# Import packages.
import cvxpy as cp
import numpy as np

# Generate data.
m = 20
n = 15
np.random.seed(1)
A = np.random.randn(m, n)
b = np.random.randn(m)

# Define and solve the CVXPY problem.
x = cp.Variable(n)
cost = cp.sum_squares(A @ x - b)
prob = cp.Problem(cp.Minimize(cost), [x>=0, cp.sum(x)==1])
prob.solve()

# Print result.
print("\nThe optimal value is", prob.value)
print("The optimal x is")
print(x.value)
print("The norm of the residual is ", cp.norm(A @ x - b, p=2).value)
Run Code Online (Sandbox Code Playgroud)

在此示例中,A(矩阵)是所有向量的矩阵,x(变量)是权重,并且b是已知目标。

编辑:您的数据示例:

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]
])

target = np.array([1.0, 1.02, 1.01, 1.04])
x = cp.Variable(forecasts.shape[0])
cost = cp.sum_squares(forecasts.T @ x - target)
prob = cp.Problem(cp.Minimize(cost), [x >= 0, cp.sum(x) == 1])
prob.solve()
print("\nThe optimal value is", prob.value)
print("The optimal x is")
print(x.value)
Run Code Online (Sandbox Code Playgroud)

输出:

The optimal value is 0.0005306233766233817
The optimal x is
[ 6.52207792e-01 -1.45736370e-24  3.47792208e-01]
Run Code Online (Sandbox Code Playgroud)

结果大约[0.65, 0, 0.34]与您提到的不同[0.5, 0.5, 0.0],但这取决于您如何定义问题。这是最小二乘误差的解决方案。