常用的linalg函数
函数 | 说明 |
---|---|
diag | 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0) |
dot | 标准矩阵乘法 |
trace | 计算对角线元素的和 |
det | 计算矩阵行列式 |
eigvals | 计算矩阵的特征值 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆 |
pinv | 计算矩阵的Moore-Penrose伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 解线性方程组Ax=b,其中A为一个方阵 |
lstsq | 计算Ax=b的最小二乘解 |
- diag
# diag
x = np.arange(9).reshape((3,3))
print(x)
'''
[[0 1 2]
[3 4 5]
[6 7 8]]'''
# 取对角线上的数据
print(np.diag(x))
'''[0 4 8]'''
# k>0,主对角线之上
print(np.diag(x, k=1))
'''[1 5]'''
# k<0,主对角线之下
print(np.diag(x, k=-1))
'''[3 7]'''
# 通过对角线上的数据数组创建矩阵
print(np.diag(np.diag(x)))
'''[[0 0 0]
[0 4 0]
[0 0 8]]
'''
- dot : 矩阵乘法
# dot
A = np.arange(9).reshape((3,3))
print(A)
'''[[0 1 2]
[3 4 5]
[6 7 8]]
'''
B = np.arange(6).reshape((3,2))
print(B)
'''[[0 1]
[2 3]
[4 5]]
'''
print(A.dot(B))
print(np.dot(A,B))
'''[[10 13]
[28 40]
[46 67]]
'''
- trace :对角线上的和
A = np.arange(9).reshape((3,3))
print(A)
'''[[0 1 2]
[3 4 5]
[6 7 8]]
'''
print(A.trace())
print(np.trace(A))
'''12'''
- det : 行列式
x = np.mat('3 4;2 2')
print(x)
'''[[3 4]
[2 2]]
'''
print(np.linalg.det(x))
'''-2'''
- eigvals、eig :计算特征值和特征向量
注:特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中 A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量
函数 eigvals 函数可以计算矩阵的特征值,而 eig 函数可以返回一个包含特征值和对应的特征向量的元组
C = np.mat('3 -2;1 0')
# 调用eigvals函数求解特征值
e0 = np.linalg.eigvals(C)
print(e0)
'''[2. 1.]'''
# 使用 eig 函数求解特征值和特征向量,第一列为特征值,第二列为特征向量
e1,e2 = np.linalg.eig(C)
print(e1)
'''[2. 1.]'''
print(e2)
'''[[0.89442719 0.70710678]
[0.4472136 0.70710678]]
'''
# 检查结果
for i in range(len(e1)):
print("left:", np.dot(C, e2[:, i]))
print("right:", e1[i] * e2[:, i])
'''
left: [[1.78885438]
[0.89442719]]
right: [[1.78885438]
[0.89442719]]
left: [[0.70710678]
[0.70710678]]
right: [[0.70710678]
[0.70710678]]
'''
- inv :方阵的逆
A = np.mat('0 1 2;1 0 3;4 -3 8')
print(A)
'''
[[ 0 1 2]
[ 1 0 3]
[ 4 -3 8]]
'''
# 使用inv函数计算逆矩阵
inv = np.linalg.inv(A)
print(inv)
'''
[[-4.5 7. -1.5]
[-2. 4. -1. ]
[ 1.5 -2. 0.5]]
'''
# 检查结果
print(inv * A)
'''
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
- pinv : 广义逆矩阵
A = np.mat('1 2;4 3')
print(A)
'''
[[1 2]
[4 3]]
'''
pseudoinv = np.linalg.pinv(A)
print(pseudoinv)
'''
[[-0.6 0.4]
[ 0.8 -0.2]]
'''
- svd :奇异分解
SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
函数 svd 可以对矩阵进行奇异值分解,该函数返回3个矩阵--U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值
A = np.mat('4 11 14;8 7 -2')
print(A)
'''
[[ 4 11 14]
[ 8 7 -2]]
'''
# 调用svd函数分解矩阵
U,Sigma,V = np.linalg.svd(A, full_matrices=False)
print('U:{}{}Sigma:{}{}V:{}{}'.format(U,'\n',Sigma,'\n',V,'\n'))
'''
U:[[-0.9486833 -0.31622777]
[-0.31622777 0.9486833 ]]
Sigma:[18.97366596 9.48683298]
V:[[-0.33333333 -0.66666667 -0.66666667]
[ 0.66666667 0.33333333 -0.66666667]]
'''
# 检查结果
print(U * np.diag(Sigma) * V)
'''
[[ 4. 11. 14.]
[ 8. 7. -2.]]
'''
- solve :解线性方程组
solve可以解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x是未知变量
B = np.mat('1 -2 1;0 2 -8;-4 5 9')
print(B)
'''
[[ 1 -2 1]
[ 0 2 -8]
[-4 5 9]]
'''
b = np.array([0, 2, 2])
x = np.linalg.solve(B, b)
print(x)
'''[37. 21. 5.]'''
# 检查结果
print(B.dot(x))
'''[[0. 2. 2.]]'''
'''和b相等'''
-
QR分解
对于m×n的列满秩矩阵A,必有:Am*n= Qm*n·Rn*n
其中,QT·Q=I(即Q为正交矩阵),R为非奇异上三角矩阵(即矩阵R的对角线下面的元素全为0)。
这个将A分解成这样的矩阵Q和R的过程就是QR分解。
其中当要求R的对角线元素为正时,该分解唯一。
QR分解可用于求解矩阵A的特征值、A的逆等问题。
# QR分解
A = np.array([[1,2,3,4,0],[-1,3,np.sqrt(2),3,0],[-2,2,np.e,np.pi,0],[-np.sqrt(10),2,-3,7,0],[0,2,7,5/2,0]],dtype=float)
print(A)
'''
[[ 1. 2. 3. 4. 0. ]
[-1. 3. 1.41421356 3. 0. ]
[-2. 2. 2.71828183 3.14159265 0. ]
[-3.16227766 2. -3. 7. 0. ]
[ 0. 2. 7. 2.5 0. ]]
'''
A = np.matrix(A,dtype=float)
Q,R = np.linalg.qr(A)
# 验证
print(Q*R)
'''
[[ 1. 2. 3. 4. 0. ]
[-1. 3. 1.41421356 3. 0. ]
[-2. 2. 2.71828183 3.14159265 0. ]
[-3.16227766 2. -3. 7. 0. ]
[ 0. 2. 7. 2.5 0. ]]
'''