scipy.linalg
)¶基于ATLAS LAPACK和BLAS库,SciPy具有非常快的线性代数功能。
所有线性代数例程都以二维数组为输入输出。
scipy.linalg
和numpy.linalg
¶scipy.linalg
=numpy.linalg
+ 更高级的算法。
scipy.linalg
使用BLAS/LAPACK编译,更快
numpy.matrix
与2-D numpy.ndarray
numpy.matrix
是矩阵类,具有比numpy.ndarray
更方便的接口,用于矩阵操作。
numpy.matrix
支持例如类似于MATLAB的创建语法
numpy.matrix
的星号运算符,表示矩阵乘法,I和T成员作逆和转置运算
我们想要拟合一个二次多项式形式为$y = a + bx^2$。我们首先形成“设计矩阵”$M$,其中一列为常数$1$,一列包含$x^2$。
我们想找到M.dot(p) = y的最小二乘解,其中p是一个长度为2的向量,包含参数a和b。
from scipy.linalg import lstsq
import matplotlib.pyplot as plt
x = np.array([1, 2.5, 3.5, 4, 5, 7, 8.5])
y = np.array([0.3, 1.1, 1.5, 2.0, 3.2, 6.6, 8.6])
M = x[:, np.newaxis]**[0, 2]
p, res, rnk, s = lstsq(M, y)
p
_= plt.plot(x, y, 'o', label='data')
xx = np.linspace(0, 9, 101)
yy = p[0] + p[1]*xx**2
_= plt.plot(xx, yy, label='least squares fit, $y = a + bx^2$')
_= plt.xlabel('x')
_= plt.ylabel('y')
_= plt.legend(framealpha=1, shadow=True)
_= plt.grid(alpha=0.25)
_= plt.show()
import numpy as np
A = np.mat('[1 2;3 4]')
A
A.I
b = np.mat('[5 6]')
b
b.T
A*b.T
matrix([[17], [39]])
import numpy as np
from scipy import linalg
A = np.array([[1,3,5],[2,5,1],[2,3,8]])
A
linalg.inv(A)
np.round(A.dot(linalg.inv(A)))
array([[ 1., -0., -0.], [ 0., 1., 0.], [ 0., -0., 1.]])
from scipy.linalg import lstsq
import matplotlib.pyplot as plt
x = np.array([1, 2.5, 3.5, 4, 5, 7, 8.5])
y = np.array([0.3, 1.1, 1.5, 2.0, 3.2, 6.6, 8.6])
M = x[:, np.newaxis]**[0, 2]
p, res, rnk, s = lstsq(M, y)
p
_= plt.plot(x, y, 'o', label='data')
xx = np.linspace(0, 9, 101)
yy = p[0] + p[1]*xx**2
_= plt.plot(xx, yy, label='least squares fit, $y = a + bx^2$')
_= plt.xlabel('x')
_= plt.ylabel('y')
_= plt.legend(framealpha=1, shadow=True)
_= plt.grid(alpha=0.25)
_= plt.show()