ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python数据分析--Numpy常用函数介绍(9)-- 与线性代数有关的模块linalg [打印本页]

作者: 民工心事    时间: 2022-9-5 14:57
标题: Python数据分析--Numpy常用函数介绍(9)-- 与线性代数有关的模块linalg
numpy.linalg 模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
一、计算逆矩阵
线性代数中,矩阵A与其逆矩阵A ^(-1)相乘后会得到一个单位矩阵I。该定义可以写为A *A ^(-1) =1。numpy.linalg 模块中的 inv 函数可以计算逆矩阵。
1) 用 mat 函数创建示例矩阵
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. A = np.mat("0 1 2;1 0 3;4 -3 8")
复制代码
2)用 inv 函数计算逆矩阵
  1. inverse = np.linalg.inv(A)
  2. print("inverse of A\n", inverse)
复制代码
运行结果如下:
  1. A
  2. [[ 0  1  2]
  3. [ 1  0  3]
  4. [ 4 -3  8]]
  5. inverse of A
  6. [[-4.5  7.  -1.5]
  7. [-2.   4.  -1. ]
  8. [ 1.5 -2.   0.5]]
复制代码
 3)可能通过原矩阵和逆矩阵相乘的结果来验证
  1. print ("Check\n", A * inverse) #验证计算,原矩阵和逆矩阵相乘的,单位矩阵
复制代码
结果:
  1. Check
  2. [[1. 0. 0.]
  3. [0. 1. 0.]
  4. [0. 0. 1.]]
复制代码
二、求解线性方程组
线性议程组  Ax=b
1)分另创建矩阵A和数组b
  1. A = np.mat("1 -2 1;0 2 -8;-4 5 9") #用mat()函数创建示例矩阵
  2. print("A\n", A)
  3. b = np.array([0, 8, -9])
复制代码
2)用solve(A, b)解出x,用dot()函数进行验证,并打印
x = np.linalg.solve(A, b)
print("Solution", x)
print("Check\n", np.dot(A , x))  #用dot()函数检查求得的解是否正确
三、特征值和特征向量
特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量,特征向量是关于特征值的向量。在numpy.linalg 模块中, eigvals函数可以计算矩阵的特征值,而 eig 函数可以返回一个包含特征值和对应的特征向量的元组。
用 eigvals 函数求解特征值
用 eig 函数求解特征值和特征向量 ,如下代码:
  1. print("Eigenvalues", np.linalg.eigvals(A))
  2. eigenvalues, eigenvectors = np.linalg.eig(A)
  3. print( "First tuple of eig", eigenvalues)
  4. print(" Second tuple of eig\n", eigenvectors)
复制代码
四、奇异值分解
奇异值分解,是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。奇异值分解是特征值分解一种推广。在 numpy.linalg 模块中的svd()函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值(计算出来结果可能是虚数)。
  1. U, Sigma, V = np.linalg.svd(A, full_matrices=False)# 用svd() 函数分解矩阵
  2. print ("U:",U)
  3. print ("Sigma:",Sigma)
  4. print ("V:", V)
  5. print ("Product\n", U * np.diag(Sigma) * V) #用diag函数生成完整的奇异值矩阵
复制代码
 五、广义
pinv 函数进行求解,计算广义逆矩阵需要用到奇异值分解函数pinv(),行列式计算用np.linalg中的函数det(): 
  1. #使用pinv函数计算广义逆矩阵:
  2. A = np.mat("4 11 14;8 7 -2")
  3. pseudoinv = np.linalg.pinv(A)
  4. print("Pseudo inverse:\n", pseudoinv)
  5. #计算矩阵的行列式
  6. print("\n")
  7. B = np.mat("3 4;5 6")
  8. print("Determinant:", np.linalg.det(B))
复制代码
全部代码如下:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. A = np.mat("0 1 2;1 0 3;4 -3 8")  #用mat()函数创建示例矩阵print ("A\n",A)inverse = np.linalg.inv(A)  #用inv()函数计算逆矩阵print("inverse of A\n", inverse)print ("Check\n", A * inverse) #验证计算,原矩阵和逆矩阵相乘的,单位矩阵#  求解线性方程组A = np.mat("1 -2 1;0 2 -8;-4 5 9") #用mat()函数创建示例矩阵b = np.array([0, 8, -9])x = np.linalg.solve(A, b)print("Solution", x)print("Check\n", np.dot(A , x))  #用dot()函数检查求得的解是否正确#特征值和特征向量print("Eigenvalues", np.linalg.eigvals(A))   #eigvals函数可以计算矩阵的特征值eigenvalues, eigenvectors = np.linalg.eig(A) #用 eig 函数求解特征值和特征向量print( "First tuple of eig", eigenvalues)print(" Second tuple of eig\n", eigenvectors)#奇异值分解U, Sigma, V = np.linalg.svd(A, full_matrices=False)# 用svd() 函数分解矩阵
  4. print ("U:",U)
  5. print ("Sigma:",Sigma)
  6. print ("V:", V)
  7. print ("Product\n", U * np.diag(Sigma) * V) #用diag函数生成完整的奇异值矩阵#使用pinv函数计算广义逆矩阵:
  8. A = np.mat("4 11 14;8 7 -2")
  9. pseudoinv = np.linalg.pinv(A)
  10. print("Pseudo inverse:\n", pseudoinv)
  11. #计算矩阵的行列式
  12. print("\n")
  13. B = np.mat("3 4;5 6")
  14. print("Determinant:", np.linalg.det(B))
复制代码
运行结果:

本篇介绍了一些numpy.linalg 模块中常用的函数,

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4