Numpy库 线性代数linalg模块中的一些函数

参考文章:https://www.cnblogs.com/xieshengsen/p/6836430.html
https://blog.csdn.net/hqh131360239/article/details/79061535

Numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
https://docs.scipy.org/doc/numpy/reference/routines.linalg.html

函数 描述
dot 两个数组的点积,即元素对应相乘
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
determinant 数组的行列式
solve 求解线性方程组
inv 计算矩阵的逆

1. 计算逆矩阵 numpy.linalg.inv()

import numpy as np
A=np.mat("0 1 2;1 0 3;4 -3 8")    #创建矩阵
print(A)

输出结果:[[ 0  1  2]
          [ 1  0  3]
          [ 4 -3  8]]
 
inv=np.linalg.inv(A)              #利用inv函数计算逆矩阵
print(inv)

输出结果:[[-4.5  7.  -1.5]
          [-2.   4.  -1. ]
          [ 1.5 -2.   0.5]]
 
print(A*inv)           #检查求得的矩阵与原矩阵相乘为单位矩阵

输出结果:[[1. 0. 0.]
          [0. 1. 0.]
          [0. 0. 1.]]

mat()函数 :将目标数据中的类型转化为矩阵

2. 求解线性方程组 numpy.linalg.solve()

numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量

import numpy as np
A=np.mat('1 -2 1;0 2 -8;-4 5 9') #创建矩阵和数组
b=np.array([0,8,-9])

x=np.linalg.solve(A,b)      #调用solve函数求解线性方程组
print(x)
输出结果:[29. 16.  3.]
print(np.dot(A,x))           #调用dot函数检查求得的解是否正确
输出结果:[[ 0.  8. -9.]]

dot()函数 :返回两个数组的点积

  1. 如果处理的是一维数组,则得到的是两数组的內积
  2. 如果是二维数组(矩阵)之间的运算,则得到的是矩阵积

3. 特征值和特征向量 numpy.linalg. eigvals() / eig()

特征值(eigenvalue)即方程 Ax = λx 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量。
numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组。

import numpy as np
C=np.mat('3 -2;1 0')
c0=np.linalg.eigvals(C)  #调用eigvals函数求解特征值
print(c0)
输出结果:[2. 1.]

c1,c2=np.linalg.eig(C) #eig函数求解特征值和特征向量
print(c1)
输出结果:[2. 1.]
print(c2)
输出结果:[[0.89442719 0.70710678]
          [0.4472136  0.70710678]]

for i in range(len(c1)):
    print('left:',np.dot(C,c2[:,i]))
        print('right:',c1[i]*c2[:,i])
        输出结果:
 left: [[1.78885438]
        [0.89442719]]
right: [[1.78885438]
        [0.89442719]]
 left: [[0.70710678]
        [0.70710678]]
right: [[0.70710678]
        [0.70710678]]

4. 奇异值分解 numpy.linalg.svd()
SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。
numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。

import numpy as np
D=np.mat ('4 11 14;8 7 -2')
U,Sigma,V=np.linalg.svd(D,full_matrices=False) #使用svd函数分解矩阵
print('U:',U)
输出结果:U: [[-0.9486833  -0.31622777]
             [-0.31622777  0.9486833 ]]
 
print('Sigma:',Sigma)
输出结果:Sigma: [18.97366596  9.48683298]

print('V:',V)
输出结果:V: [[-0.33333333 -0.66666667 -0.66666667]
             [ 0.66666667  0.33333333 -0.66666667]]
             
print(U*np.diag(Sigma)*V)  
#使用diag函数生成完整的奇异值矩阵,将分解的3个矩阵相乘
输出结果:[[ 4. 11. 14.]
          [ 8.  7. -2.]]

diag():返回一个矩阵的对角线元素或创建一个对角阵
当 np.diag(array) 中
array是一个1维数组时,结果形成一个以一维数组为对角线元素的矩阵
array是一个二维矩阵时,结果输出矩阵的对角线元素

5. 广义逆矩阵 numpy.linalg.pinv()
使用numpy.linalg模块中的pinv函数进行求解,inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制。

import numpy as np
E=np.mat('4 11 14;8 7 -2')
pseudoinv=np.linalg.pinv(E)   #使用pinv函数计算广义逆矩阵
print(pseudoinv)
输出结果:
[[-0.00555556  0.07222222]
 [ 0.02222222  0.04444444]
 [ 0.05555556 -0.05555556]]
 
print(E*pseudoinv)    #将原矩阵和得到的广义逆矩阵相乘
输出结果:
[[ 1.00000000e+00 -9.29811783e-16]
 [-1.66533454e-16  1.00000000e+00]]

6. 行列式 numpy.linalg.det()

import numpy as np
F=np.mat('3 4;5 6')
print(np.linalg.det(F)) #使用det函数计算行列式
输出结果:-1.9999999999999971

7. 求解范数 numpy.linalg.norm()

x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)
参数:
x:表示矩阵
ord:范数类型,默认是2范数
在这里插入图片描述
矩阵的范数:

ord=1:列和的最大值

ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根

ord=∞:行和的最大值

ord=None:默认情况下,是求整体的矩阵元素平方和,再开根号。(没仔细看,以为默认情况下就是矩阵的二范数,修正一下,默认情况下是求整个矩阵元素平方和再开根号)

③axis:处理类型

axis=1表示按行向量处理,求多个行向量的范数

axis=0表示按列向量处理,求多个列向量的范数

axis=None表示矩阵范数。

④keepding:是否保持矩阵的二维特性

import numpy as np
x=np.array([[0,3,4],[1,6,4]])
#默认参数ord=None,axis=None,keepdims=False
print('默认参数(矩阵整体元素平方和开根号,不保留矩阵二维特性):',np.linalg.norm(x))
print('矩阵整体元素平方和开根号,保留矩阵二维特性:',np.linalg.norm(x,keepdims=True))
print('矩阵每个行向量求向量的2范数:',np.linalg.norm(x,axis=1,keepdims=True))
print('矩阵每个列向量求向量的2范数:',np.linalg.norm(x,axis=0,keepdims=True))
print('矩阵1范数:',np.linalg.norm(x,ord=1,keepdims=True))
print('矩阵2范数:',np.linalg.norm(x,ord=2,keepdims=True))
print('矩阵∞范数:',np.linalg.norm(x,ord=np.inf,keepdims=True))

输出结果:
默认参数(矩阵整体元素平方和开根号,不保留矩阵二维特性): 8.831760866327848
矩阵整体元素平方和开根号,保留矩阵二维特性: [[8.83176087]]
矩阵每个行向量求向量的2范数: [[5.        ]
 [7.28010989]]
矩阵每个列向量求向量的2范数: [[1.         6.70820393 5.65685425]]
矩阵1范数: [[9.]]
矩阵2范数: [[8.70457079]]
矩阵∞范数: [[11.]]

inf 表示正无穷
-inf表示负无穷

猜你喜欢

转载自blog.csdn.net/tumantou2hao/article/details/88143271