建设网站的价值,引流推广平台有哪些,律师网站建设建议,免费查公司查老板文章目录最小二乘法返回值测试最小二乘法 
scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr#xff0c;前者是经典算法#xff0c;后者来自斯坦福优化实验室#xff0c;据称可以比lsqr更快收敛。 
这两个函数可以求解AxbAxbAxb#xff0c;或arg minx∥Ax−b…
文章目录最小二乘法返回值测试最小二乘法 
scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr前者是经典算法后者来自斯坦福优化实验室据称可以比lsqr更快收敛。 
这两个函数可以求解AxbAxbAxb或arg minx∥Ax−b∥2\argmin_x\Vert Ax-b\Vert^2argminx∥Ax−b∥2或arg minx∥Ax−b∥2d2∥x−x0∥2\argmin_x\Vert Ax-b\Vert^2d^2\Vert x-x_0\Vert^2argminx∥Ax−b∥2d2∥x−x0∥2其中AAA必须是方阵或三角阵可以有任意秩。 
通过设置容忍度at,bta_t, b_tat,bt可以控制算法精度记rb−Axrb-Axrb−Ax为残差向量如果AxbAxbAxb是相容的lsqr在∥r∥⩽at∗∥A∥⋅∥x∥bt∥b∥\Vert r\Vert\leqslant a_t*\Vert A\Vert\cdot\Vert x\Vert  b_t\Vert b\Vert∥r∥⩽at∗∥A∥⋅∥x∥bt∥b∥时终止否则将在∥ATr∥⩽at∥A∥⋅∥r∥\Vert A^T r\Vert\leqslant a_t\Vert A\Vert \cdot\Vert r\Vert∥ATr∥⩽at∥A∥⋅∥r∥。 如果两个容忍度都是10−610^{-6}10−6最终的∥r∥\Vert r\Vert∥r∥将有6位精度。 
lsmr的参数如下 
lsmr(A, b, damp0.0, atol1e-06, btol1e-06, conlim100000000.0, maxiterNone, showFalse, x0None)参数解释 
A 可谓稀疏矩阵、数组以及线性算子b 为数组damp 阻尼系数默认为0atol, btol 截止容忍度是lsqr迭代的停止条件即at,bta_t, b_tat,bt。conlim 另一个截止条件对于最小二乘问题conlim应该小于10810^8108如果AxbAxbAxb是相容的则conlim最大可以设到101210^{12}1012iter_limint 迭代次数show 如果为True则打印运算过程calc_var 是否估计(A.TA  damp**2*I)^{-1}的对角线x0 阻尼系数相关 
lsqr和lsmr相比没有maxiter参数但多了iter_lim, calc_va参数。 
上述参数中damp为阻尼系数当其不为0时记作δ\deltaδ待解决的最小二乘问题变为 
[AδI]x[bδx0]\begin{bmatrix}A\\\delta I\end{bmatrix} x\begin{bmatrix}b\\\delta x_0 \end{bmatrix} [AδI]x[bδx0] 
返回值 
lsmr的返回值依次为 
x 即AxbAxbAxb中的xxxistop 程序结束运行的原因itn 迭代次数normr ∥b−Ax∥\Vert b-Ax\Vert∥b−Ax∥normar ∥AT(b−Ax)∥\Vert A^T(b-Ax)\Vert∥AT(b−Ax)∥norma ∥A∥\Vert A\Vert∥A∥conda A的条件数normx ∥x∥\Vert x\Vert∥x∥ 
lsqr的返回值为 
x 即AxbAxbAxb中的xxxistop 程序结束运行的原因itn 迭代次数r1norm ∥b−Ax∥\Vert b-Ax\Vert∥b−Ax∥r2norm ∥b−Ax∥2δ2∥x−x0∥2\sqrt{\Vert b-Ax\Vert^2\delta^2\Vert x-x_0\Vert^2}∥b−Ax∥2δ2∥x−x0∥2anorm 估计的Frobenius范数Aˉ\bar AAˉacond Aˉ\bar AAˉ的条件数arnorm ∥ATr−δ2(x−x0)∥\Vert A^Tr-\delta^2(x-x_0)\Vert∥ATr−δ2(x−x0)∥xnorm ∥x∥\Vert x\Vert∥x∥var (ATA)−1(A^TA)^{-1}(ATA)−1 
二者的返回值较多而且除了前四个之外剩下的意义不同调用时且须注意。 
测试 
下面对这两种算法进行验证第一步就得先有一个稀疏矩阵 
import numpy as np
from scipy.sparse import csr_arraynp.random.seed(42)  # 设置随机数状态
mat  np.random.rand(500,500)
mat[mat0.9]  0
csr  csr_array(mat)然后用这个稀疏矩阵乘以一个xxx得到bbb 
xs  np.arange(500)
b  mat  xs接下来对这两个最小二乘函数进行测试 
from scipy.sparse.linalg import lsmr, lsqr
import matplotlib.pyplot as plt
mx  lsmr(csr, b)[0]
qx  lsqr(csr, b)[0]
plt.plot(xs, lw0.5)
plt.plot(mx, lw0, marker*, labellsmr)
plt.plot(qx, lw0, marker., labellsqr)
plt.legend()
plt.show()为了对比清晰对图像进行放大可以说二者不分胜负 接下来比较二者的效率500×500500\times500500×500这个尺寸显然已经不合适了用2000×20002000\times20002000×2000 
from timeit import timeitnp.random.seed(42)  # 设置随机数状态
mat  np.random.rand(500,500)
mat[mat0.9]  0
csr  csr_array(mat)
timeit(lambda : lsmr(csr, b), number10)
timeit(lambda : lsqr(csr, b), number10)测试结果如下 timeit(lambda : lsqr(csr, b), number10)
0.5240591000001587timeit(lambda : lsmr(csr, b), number10)
0.6156221000019286看来lsmr并没有更快看来斯坦福也不靠谱(滑稽)。