【问题标题】:Solve non square matrix with python: How to use numpy.linalg.lstsq()?用python求解非方阵:如何使用numpy.linalg.lstsq()?
【发布时间】:2019-04-13 13:32:48
【问题描述】:

请求的行为
我想用python解决一个非方阵。该矩阵有两个线性相关的向量。

当前状态
我首先尝试使用numpy.linalg.solve(),但这仅适用于方阵。 其他 StackOverflow 帖子推荐使用 numpy.linalg.lstsq()

问题
但是,我不明白如何正确实现numpy.linalg.lstsq()。该函数正确求解最后一个参数,但不能正确求解其他参数。一个帖子推荐this solution 我也不明白。

我必须以某种方式实现循环吗?

谁能给我一个代码示例?这个矩阵怎么解 使用python有问题?

我当前的代码

import numpy as np

# defining a linear equation system E=F with
#   | -2 * x1 - 4 * x2 + 1 * x3 -  9 * x4 + 0 * x5 =  +5  |
#   |  3 * x1 + 6 * x2 + 0 * x3 + 12 * x4 + 3 * x5 = +15  |
#   |  1 * x1 + 2 * x2 + 1 * x3 +  3 * x4 + 1 * x5 = -17  |
#   | -5 * x1 - 4 * x2 + 1 * x3 -  9 * x4 + 0 * x5 = +14  |


E=np.array(
    [
        [-2,-4,1,-9,0],
        [3,6,0,12,3],
        [1,2,1,3,1],
        [-5,-10,3,-23,1]
    ]
)

F=np.array(
    [3,15,-17,14]
)

solutionNonSquare = np.linalg.lstsq(E, F)
print('the solution vector is: {x1, x2, x3, x4, x5}=')
print(solutionNonSquare)

书面矩阵解决方案

【问题讨论】:

  • 你的代码给出了什么答案?你期待什么答案?假设我正确解释了您的问题,您的代码对我来说是正确的,除了 numpy.linalg.lstsq 返回四个量,其中第一个是您想要的最小二乘解决方案。
  • 它返回 (array([ -4.34615385, -8.69230769, -19.69230769, 2.30769231, 17.5 ]), array([], dtype=float64), 3, array([3.10597849e+01, 3.82343947e+00, 8.19190114e-01, 4.91552829e-16])) 但我希望它返回求解矩阵系统的向量,例如 -12,5, 0, -22, 0, 17.5(array([ -12,5, 0, -22, 0, 17.5 ]),
  • 没有计算非方阵高斯消元法的函数或变通方法吗?
  • 您有 5 个变量的 3 个独立方程。有很多向量可以解决这个系统。您可以添加两个空向量的任意倍数以找到系统的另一个解。您可以使用scipy.linalg.null_space 找到空空间的 a
  • 您能在此处发布一个代码示例,您将如何使用 scipy.linalg.null_space 求解方程吗?

标签: python numpy matrix linear-algebra


【解决方案1】:

这是一个欠定方程组。这意味着有很多解决方案,并且没有“解决方案”之类的东西。高斯消元法和lstsq 给出不同的解决方案并不意味着有任何问题。

让我们生成并检查各种解决方案:

import scipy.linalg as sla

E_null = sla.null_space(E)

def check_solution(coeffs):
    x = solutionNonSquare[0] + E_null @ coeffs
    check = E @ x - F
    with np.printoptions(precision=2, suppress=True):
        print('x = {}'.format(x))
    with np.printoptions(precision=5, suppress=True):
        print('E . x - F = {}'.format(check))
    print('|x| = {}'.format(np.linalg.norm(x)))

我们可以查看lstsq产生的最小范数解:

>>> check_solution([0, 0])
x = [ -4.35  -8.69 -19.69   2.31  17.5 ]
E . x - F = [ 0. -0. -0.  0.]
|x| = 28.174593028253167

我们可以生成和测试许多其他解决方案

>>> check_solution(100 * np.random.randn(2))
x = [ -88.93 -139.06   66.64   88.64   17.5 ]
E . x - F = [ 0.  0. -0.  0.]
|x| = 199.62363490542995
>>> check_solution(100 * np.random.randn(2))
x = [-25.2  -26.99  -5.33  16.67  17.5 ]
E . x - F = [ 0. -0. -0.  0.]
|x| = 44.455362582961335
>>> check_solution(100 * np.random.randn(2))
x = [ 93.34  14.57 -55.74 -33.74  17.5 ]
E . x - F = [ 0. -0. -0. -0.]
|x| = 116.09338153741933

我们甚至可以查看您的解决方案:

>>> my_favourite_solution = np.array([-12.5, 0, -22, 0, 17.5 ])
>>> my_favourite_coeffs = my_favourite_solution @ E_null
>>> check_solution(my_favourite_coeffs)
x = [-12.5   0.  -22.   -0.   17.5]
E . x - F = [ 0. -0. -0.  0.]
|x| = 30.765240125830324

【讨论】:

  • 您能否详细说明为什么它未确定?假设我们知道 Ax=b 的所有矩阵,其中 A 是 m x n,x 是 n x 1 向量,b 是 m x 1 向量,我们求解 x 。为什么我们不能得到与 x 完全相同的结果?
  • 在这种情况下,A 是一个 4x5 矩阵。这意味着我们有 5 个变量的 4 个方程。这最多可以让我们根据第 5 个变量求解 4 个变量。
  • 一般来说,当 mn 时是超定的,当 m=n 时有唯一解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2021-01-13
  • 1970-01-01
  • 2019-09-25
  • 2015-11-13
相关资源
最近更新 更多