1.矩阵简介
numpy中包含一个矩阵库 numoy.matlib ,该模块的函数返回一个矩阵,而不是ndarry对象。一个m*n的矩阵是一个由m行(row)n列(column)元素排列而成的矩形阵列。
矩阵matrix和数组arry存在一定的区别和联系
2.矩阵操作
1)矩阵转置
numpy中常用矩阵对象的T属性实现转置操作。
(x.T,y.T,sep='\n\n')
2)矩阵乘法
在线性代数中,一个m*p矩阵A和一个p*n矩阵B的乘积为一个m*n矩阵。其中,结果矩阵中每个元素Cij的值等于A矩阵中第i行和B矩阵中第j列的内积。
x=np.matrix([[1,2,3],[4,5,6]])
y=np.matrix([[1,2],[3,4],[5,6]])
print(x*y)
# [[22 28]
# [49 64]]
3.相关系数矩阵
np.corrcof()函数可以计算相关系数矩阵
A=np.matrix([1,2,3,4])
B=np.matrix([4,3,2,1])
C=np.matrix([1,2,3,40])
D=np.matrix([4,3,2,10])
print('负相关,变化方向相反:',np.corrcoef(A,B))
print('负相关,变化方向接近相反:',np.corrcoef(A,D))
print('正相关,变化方向相近:',np.corrcoef(A,C))
print('正相关,变化方向一致:',np.corrcoef(A,A))
# 负相关,变化方向相反: [[ 1. -1.]
# [-1. 1.]]
# 负相关,变化方向接近相反: [[1. 0.61065803]
# [0.61065803 1. ]]
# 正相关,变化方向相近: [[1. 0.8010362]
# [0.8010362 1. ]]
# 正相关,变化方向一致: [[1. 1.]
# [1. 1.]]
4.方差、协方差、标准差
print("单变量协方差、方差:",np.cov(A))
print("两变量协方差:",np.cov(A,B))
print("单变量标准差:",np.std(A))
print("单变量行元素标准差:",np.std(A,axis=1))
# 单变量协方差、方差: 1.6666666666666665
# 两变量协方差: [[ 1.66666667 -1.66666667]
# [-1.66666667 1.66666667]]
# 单变量标准差: 1.118033988749895
# 单变量行元素标准差: [[1.11803399]]
5.特征值与特征向量
numpy中线性代数子模块linalg提供了计算特征值和特征向量的eig()函数,参数可以是python列表、numpy数组或numpy矩阵
A=np.matrix([[1,-3,3],[3,-5,3],[6,-6,4]])
e,v=np.linalg.eig(A)
print("特征值:",e,sep='\n')
print("特征向量:",v,sep="\n")
print("矩阵与特征向量的乘积:",np.dot(A,v))
print("特征值与特征向量的乘积:",e*v)
print("验证二者是否相等:",np.isclose(np.dot(A,v),e*v))
#特征值:
#[ 4.+0.00000000e+00j -2.+1.10465796e-15j -2.-1.10465796e-15j]
#特征向量:
#[[-0.40824829+0.j 0.24400118-0.40702229j 0.24400118+0.40702229j]
# [-0.40824829+0.j -0.41621909-0.40702229j -0.41621909+0.40702229j]
# [-0.81649658+0.j -0.66022027+0.j -0.66022027-0.j ]]
#矩阵与特征向量的乘积: [[-1.63299316+0.00000000e+00j -0.48800237+8.14044580e-01j
# -0.48800237-8.14044580e-01j]
# [-1.63299316+0.00000000e+00j 0.83243817+8.14044580e-01j
# 0.83243817-8.14044580e-01j]
# [-3.26598632+0.00000000e+00j 1.32044054-5.55111512e-16j
# 1.32044054+5.55111512e-16j]]
# 特征值与特征向量的乘积: [[0.81649658+4.50974724e-16j 3.12888345-8.14044580e-01j
# 3.12888345+8.14044580e-01j]]
#验证二者是否相等: [[False False False]
# [False False False]
# [False False False]]
6.逆矩阵
A=np.matrix([[1,2],[3,4]])
B=np.linalg.inv(A)
print ("逆矩阵:\n",B)
print("AB乘积(对角线元素为1,其余近似为0):\n",A*B)
逆矩阵:
# [[-2. 1. ]
# [ 1.5 -0.5]]
#AB乘积(对角线元素为1,其余近似为0):
# [[1.0000000e+00 0.0000000e+00]
# [8.8817842e-16 1.0000000e+00]]
7.范数
A=np.matrix([[1,2],[3,4]])
print("矩阵2-范数:",np.linalg.norm(A))
print("矩阵最小奇异值:",np.linalg.norm(A,-2))
print("min(sum(abx),axis=0)=",np.linalg.norm(A,-1))
print("max(sum(abx),axis=0)=",np.linalg.norm(A,1))
print("向量中非0元素个数:",np.linalg.norm([1,2,0,3,4,0],0))
print("向量2-范数:",np.linalg.norm([1,2,0,3,4,0],2))
# 矩阵2-范数: 5.477225575051661
# 矩阵最小奇异值: 0.36596619062625746
# min(sum(abx),axis=0)= 4.0
# max(sum(abx),axis=0)= 6.0
# 向量中非0元素个数: 4.0
# 向量2-范数: 5.477225575051661
8.奇异值分解
A=np.matrix([[1,2,3],[4,5,6],[7,8,9]])
u,s,v=np.linalg.svd(A)
print("u=",u)
print("s=",s)
print("v=",v)
#u= [[-0.21483724 0.88723069 0.40824829]
# [-0.52058739 0.24964395 -0.81649658]
# [-0.82633754 -0.38794278 0.40824829]]
#s= [1.68481034e+01 1.06836951e+00 4.41842475e-16]
#v= [[-0.47967118 -0.57236779 -0.66506441]
# [-0.77669099 -0.07568647 0.62531805]
# [-0.40824829 0.81649658 -0.40824829]]
u*np.diag(s)*v
matrix([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])