Python 为什么在Scipy优化中缩放向量和矩阵会得到完全不同的结果

Python 为什么在Scipy优化中缩放向量和矩阵会得到完全不同的结果,python,math,numpy,scipy,linear-algebra,Python,Math,Numpy,Scipy,Linear Algebra,我有以下优化方案: import numpy as np from scipy.optimize import minimize #Define problem A = np.array([[60., 90., 120.], [30., 120., 90.]]) b = np.array([6700.5, 699.,]) def f(x): return np.linalg.norm(A.dot(x) - b) cons ={'type': 'eq'

我有以下优化方案:

import numpy as np
from scipy.optimize import minimize

#Define problem
A = np.array([[60., 90., 120.], 
              [30., 120., 90.]])

b = np.array([6700.5, 699.,])

def f(x):
    return np.linalg.norm(A.dot(x) - b)

cons ={'type': 'eq',
       'fun': lambda x: sum(x) - 1}

x0 = [1, 0, 0]  # initial guess
minimize(f, x0, method='SLSQP', bounds=((0, np.inf),)*3, constraints=cons)
这将提供以下输出:

  status: 0
 success: True
    njev: 2
    nfev: 10
     fun: 6608.620222860367
       x: array([ 0.,  0.,  1.])
 message: 'Optimization terminated successfully.'
     jac: array([ -62.50927734, -100.675354  , -127.78314209,    0.        ])
     nit: 2
这工作正常。但是下一步我要做的是通过这样做来规范化或缩放向量
b
和矩阵
A
,并将其放在
def(x)
之前

现在结果完全不同了

  x: array([ 1.,  0.,  0.])
我的问题是

  • 为什么这两种解决方案不同
  • 缩放
    A
    b
    以使结果一致的最佳方法是什么

你不能用不同的因子来缩放
A
b
。这取决于你为什么要这样做。你可以选择两个因子中的最大值作为你的比例因子。我希望答案会有所不同。必须一致地应用矩阵方程的缩放。它还应该允许您在缩放和未缩放答案之间进行转换。这是一个新的向量空间。显而易见的答案是:对方程的左右两侧使用一致的缩放矩阵。其他任何东西都是无效的线性代数。出于好奇:你为什么不使用平方误差(即,
np.linalg.norm(a.dot(x)-b)**2
)有什么原因吗?然后可以使用
np.linalg.lstsq()
。不能用不同的因子缩放
A
b
。这取决于您为什么要这样做。你可以选择两个因子中的最大值作为你的比例因子。我希望答案会有所不同。必须一致地应用矩阵方程的缩放。它还应该允许您在缩放和未缩放答案之间进行转换。这是一个新的向量空间。显而易见的答案是:对方程的左右两侧使用一致的缩放矩阵。其他任何东西都是无效的线性代数。出于好奇:你为什么不使用平方误差(即,
np.linalg.norm(a.dot(x)-b)**2
)有什么原因吗?您可以使用
np.linalg.lstsq()
  x: array([ 1.,  0.,  0.])