我们有四个相同维度(m * n * p)的矩阵A,B,C,D。我们需要找到系数 x1、x2、x3,这样我们:
minimize (D - x1 * A - x2 * B - x3 * C)**2
鉴于
x1 + x2 + x3 = 1
和
0<= x1,x2,x3 <=1
有什么有效的方法可以在 Python 中最小化这个的平方和吗?
如果你想要真正的平方和最小化,这在具有线性约束的 Scipy 中是可能的:
import numpy as np
from numpy.random import default_rng
from scipy.optimize import minimize, LinearConstraint
rand = default_rng(seed=0)
D = rand.random(size=(5, 7, 6))
ABC = rand.random(size=(3, *D.shape))
def objective(x: np.ndarray) -> float:
delta = (
D - x[:, np.newaxis, np.newaxis, np.newaxis] * ABC
).ravel()
return delta.dot(delta)
result = minimize(
fun=objective,
x0=[1/3, 1/3, 1/3],
bounds=[[0,1], [0,1], [0,1]],
constraints=LinearConstraint(A=[1, 1, 1], lb=1, ub=1),
)
print(result)
message: Optimization terminated successfully
success: True
status: 0
fun: 146.34193150290096
x: [ 3.660e-01 3.163e-01 3.177e-01]
nit: 4
jac: [-6.803e+01 -6.803e+01 -6.803e+01]
nfev: 20
njev: 4
如果将其更改为最小绝对误差并改用线性规划,它可能会更快(但不会具有相同的数值特征)。