欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-03 12:27:31
...

参考文章: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()函数 :将目标数据中的类型转化为矩阵

补充 :print( A.I) 输出矩阵A的逆矩阵

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]]

补充 : print(A.I) 输出矩阵A的广义逆矩阵

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范数
Numpy库 线性代数linalg模块中的一些函数
矩阵的范数:

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表示负无穷