NumPy如何解决不确定系统的最小二乘问题?


14

假设我们有形状为(2,5)的X和形状为(2,)的
y

这有效: np.linalg.lstsq(X, y)

我们希望只有在X的形状为(N,5)且N> = 5的情况下,此方法才起作用。

我们确实获得了预期的5倍权重,但是该问题如何解决?

就像我们有2个方程和5个未知数吗?
numpy如何解决这个问题?
它必须执行类似插值的操作才能创建更多的人工方程式吗?


3
为什么不起作用?一个不确定的系统有很多解决方案。
马修·冈恩

您可能与相关理论有联系吗?..
George Pligoropoulos

Answers:


19

我的理解是numpy.linalg.lstsq依赖于LAPACK例程dgelsd

问题是要解决:

minimize(overx)Axb2

当然,对于小于向量长度的矩阵A ,这没有唯一的解决方案。对于不确定的系统,请提供解决方案:bdgelsdz

  • Az=b
  • z2x2对于满足所有。(即是未确定系统的最小范数解。xAx=bz

例如,如果system为,则numpy.linalg.lstsq将返回。x+y=1x=.5,y=.5

dgelsd如何工作?

该例程dgelsd计算A的奇异值分解(SVD)。

我将概述使用SVD求解线性系统背后的想法。奇异值分解是因式分解,其中和是正交矩阵,是对角矩阵,其中对角项称为奇异值。UΣV=AUVΣ

矩阵的有效等级将是奇异值的数量,这些奇异值实际上不为零(即,相对于机器精度而言,其与零之间的差异足够大...)。令为非零奇异值的对角矩阵。因此,SVD为:AS

A=U[S000]V

伪逆由下式给出:A

A=V[S1000]U

考虑解。然后:x=Ab

Axb=U[S000]VV[S1000]Ubb=U[I000]Ubb

这里基本上有两种情况:

  1. 非零奇异值的数量(即矩阵的大小)小于的长度。这里的解决方案并不精确;我们将在最小二乘意义上求解线性系统。Ib
  2. Axb=0

最后一部分有点棘手...需要跟踪矩阵尺寸并使用是正交矩阵。U

伪逆的等价

当具有线性独立的行时(例如,我们有一个胖矩阵),则: A

A=A(AA)1

对于不确定的系统,您可以证明伪逆为您提供了最小范数解。

当具有线性独立的列时(例如,我们有一个瘦矩阵),则: A

A=(AA)1A


dgelsd使用SVD,但R lm使用QR?
海涛杜

@ hxd1011R lm默认使用QR因式分解,但您可以指定替代方法。
Sycorax说恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.