最小二乘解lstsq

lstsqsolve更一般化,它不要求矩阵 AA 是方阵。 它找到一组解 XX,使得 bAx\|\mathbf{b}-\mathbf{A} \mathbf{x}\| 最小,我们称得到的结果为最小二乘解。

scipy.linalg.lstsq(a, 
                   b, 
                   cond=None, overwrite_a=False, 
                   overwrite_b=False,  
                   check_finite=True, lapack_driver=None)
  • a:为矩阵,形状为(M,N)
  • b:一维向量,形状为(M,)。它求解的是线性方程组 Ax=b\mathbf{A} \mathbf{x}=\mathbf{b} 。如果有 kk 个线性方程组要求解,且 a,相同,则 b的形状为 (M,k)
  • cond:一个浮点数,去掉最小的一些特征值。当特征值小于cond * largest_singular_value时,该特征值认为是零
  • overwrite_a:一个布尔值,指定是否将结果写到a的存储区。
  • overwrite_b:一个布尔值,指定是否将结果写到b的存储区。
  • check_finite:如果为True,则检测输入中是否有nan或者inf
  • lapack_driver:一个字符串,指定求解算法。可以为:'gelsd'/'gelsy'/'gelss'。默认的'gelsd'效果就很好,但是在许多问题上'gelsy'效果更好。

返回值:

  • x:最小二乘解,形状和b相同
  • residures:残差。如果 rank(A)rank(A) 大于N或者小于M,或者使用了gelsy,则是个空数组;如果b是一维的,则它的形状是(1,);如果b是二维的,则形状为(K,)
  • rank:返回矩阵a的秩
  • sa的奇异值。如果使用gelsy,则返回None

基本使用

求解线性方程组 [123449161276418]x=[111] \left[\begin{array}{cccc} 1 & 2 & 3 & 4 \\ 4 & 9 & 16 & 1 \\ 27 & 64 & 1 & 8 \end{array}\right] \mathbf{x}=\left[\begin{array}{c} 1 \\ 1 \\ 1 \end{array}\right]

import numpy as np
from scipy.linalg import lstsq

a = np.array([[1, 2, 3, 4], [4, 9, 16, 1], [27, 64, 1, 8]])
b = np.array([1, 1, 1])
lstsq(a, b)

结果:

(array([ 0.00205847, -0.01287038,  0.0558478 ,  0.21403472]),
 array([], dtype=float64),
 3,
 array([70.75236556, 15.95524212,  3.67872487]))
Update time: 2020-07-05

results matching ""

    No results matching ""