线性代数
Numpy 定义了 matrix 类型,使用该 matrix 类型创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和Matlab十分类似。但是由于 NumPy 中同时存在 ndarray 和 matrix 对象,因此用户很容易将两者弄混。这有违 Python 的“显式优于隐式”的原则,因此官方并不推荐在程序中使用 matrix。在这里,我们用 ndarray 来介绍。
矩阵和向量积
矩阵的定义、矩阵的加法、矩阵的数乘、矩阵的转置与二维数组完全一致,不再进行说明,但矩阵的乘法有不同的表示。
numpy.dot(a, b[, out])计算两个矩阵的乘积,如果是一维数组则是它们的内积。
import numpy as np
x=np.array([1,2,3,4,5,6])
y=np.array([2,3,4,5,6,7])
z=np.dot(x,y)
print(z)
112
a=np.array([[1,2,3],[3,4,5],[6,7,8]])
print(a)
b=np.array([[9,10,11],[12,13,14],[15,16,17]])
print(b)
print(np.dot(a,b))
[[1 2 3]
[3 4 5]
[6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[ 78 84 90]
[150 162 174]
[258 279 300]]
numpy.linalg.eig(a) 计算方阵的特征值和特征向量。
numpy.linalg.eigvals(a) 计算方阵的特征值。
x=np.diag((1,2,3))
print(x)
print(np.linalg.eigvals(x))
a,b=np.linalg.eig(x)
print(a)
print(b)
[1. 2. 3.]
[1. 2. 3.]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
for i in range(3):
if np.allclose(a[i]*b[:,i],np.dot(x,b[:,i])):
print("right !")
else:
print('error')
right !
right !
right !
判断正定:
A=np.arange(16).reshape(4,4)
print(A)
A=A+A.T
print(A)
B=np.linalg.eigvals(A)
print(B)
if np.all(B>0):
print('y')
else:
print('n')
矩阵分解
奇异值分解
有关奇异值分解的原理:奇异值分解(SVD)及其应用
u, s, v = numpy.linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)奇异值分解
a 是一个形如(M,N)矩阵
full_matrices的取值是为False或者True,默认值为True,这时u的大小为(M,M),v的大小为(N,N)。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。
compute_uv的取值是为False或者True,默认值为True,表示计算u,s,v。为False的时候只计算s。
总共有三个返回值u,s,v,u大小为(M,M),s大小为(M,N),v大小为(N,N),a = usv。
其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。
注:Numpy中返回的v是通常所谓奇异值分解a=usv’中v的转置。
a=np.array([[1,2,3],[4,5,6]])
u,s,vh=np.linalg.svd(a,full_matrices=False)
print(u.shape)
print(u)
print(s.shape)
print(s)
print(vh.shape)
print(vh)
a=np.dot(u,np.diag(s))
a=np.dot(a,vh)
print(a)
(2, 2)
[[-0.3863177 -0.92236578]
[-0.92236578 0.3863177 ]]
(2,)
[9.508032 0.77286964]
(2, 3)
[[-0.42866713 -0.56630692 -0.7039467 ]
[ 0.80596391 0.11238241 -0.58119908]]
[[1. 2. 3.]
[4. 5. 6.]]
QR分解
q,r = numpy.linalg.qr(a, mode=‘reduced’)计算矩阵a的QR分解。
a是一个(M, N)的待分解矩阵。
mode = reduced:返回(M, N)的列向量两两正交的矩阵q,和(N, N)的三角阵r(Reduced QR分解)。
mode = complete:返回(M, M)的正交矩阵q,和(M, N)的三角阵r(Full QR分解)。
A=np.array([[1,2,3],[4,-1,-6],[2,5,0]])
q,r=np.linalg.qr(A)
print(q.shape)
print(r.shape)
print(q,r)
print(np.dot(q,r))
(3, 3)
(3, 3)
[[-0.21821789 0.31186099 -0.92472897]
[-0.87287156 -0.48613625 0.04203314]
[-0.43643578 0.816342 0.37829822]] [[-4.58257569 -1.74574312 4.58257569]
[ 0. 5.19156826 3.85240047]
[ 0. 0. -3.02638573]]
[[ 1.00000000e+00 2.00000000e+00 3.00000000e+00]
[ 4.00000000e+00 -1.00000000e+00 -6.00000000e+00]
[ 2.00000000e+00 5.00000000e+00 6.66133815e-16]]