数据分析学习笔记(四)-- numpy:线性代数

常用的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.        ]]
 '''

你可能感兴趣的:(数据分析学习笔记(四)-- numpy:线性代数)