矩阵的线性组合系数

问题描述 投票:0回答:1

我们有四个相同维度(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 中最小化这个的平方和吗?

python math optimization scipy linear-algebra
1个回答
0
投票

如果你想要真正的平方和最小化,这在具有线性约束的 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

如果将其更改为最小绝对误差并改用线性规划,它可能会更快(但不会具有相同的数值特征)。

© www.soinside.com 2019 - 2024. All rights reserved.