最小二乘解lstsq
lstsq
比solve
更一般化,它不要求矩阵 是方阵。 它找到一组解 ,使得 最小,我们称得到的结果为最小二乘解。
scipy.linalg.lstsq(a,
b,
cond=None, overwrite_a=False,
overwrite_b=False,
check_finite=True, lapack_driver=None)
a
:为矩阵,形状为(M,N)
b
:一维向量,形状为(M,)
。它求解的是线性方程组 。如果有 个线性方程组要求解,且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
:残差。如果 大于N
或者小于M
,或者使用了gelsy
,则是个空数组;如果b
是一维的,则它的形状是(1,)
;如果b
是二维的,则形状为(K,)
rank
:返回矩阵a
的秩s
:a
的奇异值。如果使用gelsy
,则返回None
基本使用
求解线性方程组
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]))