建立网站就可以赚钱了吗,全国企业注册官方网,科技公司网站源码,百度指数数据分析报告文章目录 numpy实现scipy封装速度对比 所谓线性最小二乘法#xff0c;可以理解为是解方程的延续#xff0c;区别在于#xff0c;当未知量远小于方程数的时候#xff0c;将得到一个无解的问题。最小二乘法的实质#xff0c;是保证误差最小的情况下对未知数进行赋值。
最小… 文章目录 numpy实现scipy封装速度对比 所谓线性最小二乘法可以理解为是解方程的延续区别在于当未知量远小于方程数的时候将得到一个无解的问题。最小二乘法的实质是保证误差最小的情况下对未知数进行赋值。
最小二乘法是非常经典的算法而且这个名字我们在高中的时候就已经接触了属于极其常用的算法。此前曾经写过线性最小二乘法的原理并用Python实现最小二乘法及其Python实现以及scipy中非线性最小二乘法的调用方式非线性最小二乘法还有稀疏矩阵的最小二乘法稀疏矩阵最小二乘法。
下面讲对numpy和scipy中实现的线性最小二乘法进行说明并比较二者的速度。
numpy实现
numpy中便实现了最小二乘法即lstsq(a,b)用于求解类似于axb中的x其中a为 M × N M\times N M×N的矩阵则当b为 M M M行的向量时刚好相当于求解线性方程组。对于 A x b Axb Axb这样的方程组如果 A A A是满秩仿真那么可以表示为 x A − 1 b xA^{-1}b xA−1b否则可以表示为 x ( A T A ) − 1 A T b x(A^{T}A)^{-1}A^{T}b x(ATA)−1ATb。
当b为 M × K M\times K M×K的矩阵时则对每一列都会计算一组x。
其返回值共有4个分别是拟合得到的x、拟合误差、矩阵a的秩、以及矩阵a的单值形式。
import numpy as np
np.random.seed(42)
M np.random.rand(4,4)
x np.arange(4)
y Mx
xhat np.linalg.lstsq(M,y)
print(xhat[0])
#[0. 1. 2. 3.]scipy封装
scipy.linalg同样提供了最小二乘法函数函数名同样是lstsq其参数列表为
lstsq(a, b, condNone, overwrite_aFalse, overwrite_bFalse, check_finiteTrue, lapack_driverNone)其中a, b即 A x b Axb Axb二者均提供可覆写开关设为True可以节省运行时间此外函数也支持有限性检查这是linalg中许多函数都具备的选项。其返回值与numpy中的最小二乘函数相同。
cond为浮点型参数表示奇异值阈值当奇异值小于cond时将舍弃。
lapack_driver为字符串选项表示选用何种LAPACK中的算法引擎可选gelsd, gelsy, gelss。
import scipy.linalg as sl
xhat1 sl.lstsq(M, y)
print(xhat1[0])
# [0. 1. 2. 3.]速度对比
最后对着两组最小二乘函数做一个速度上的对比
from timeit import timeit
N 100
A np.random.rand(N,N)
b np.arange(N)timeit(lambda:np.linalg.lstsq(A, b), number10)
# 0.015487500000745058
timeit(lambda:sl.lstsq(A, b), number10)
# 0.011151800004881807这一次二者并没有拉开太大的差距即使将矩阵维度放大到500二者也是半斤八两。
N 500
A np.random.rand(N,N)
b np.arange(N)timeit(lambda:np.linalg.lstsq(A, b), number10)
0.389679799991427
timeit(lambda:sl.lstsq(A, b), number10)
0.35642060000100173