线性代数是数学里一个很重要的分支,很多的非线性的问题都要近似的使用线性代数来处理,将一些常见的方法小结
创建矩阵
M=np.mat("1 22 44 5;1 0 -3 6;-9 -3 8 1")
matrix([[ 1, 22, 44, 5],
[ 1, 0, -3, 6],
[-9, -3, 8, 1]])
它们之间可以进行类型的转换,np.array(M) 或 np.mat(np.array([1,2]))
逆矩阵(inverse matrix)
I=np.linalg.inv(M)
numpy.linalg.LinAlgError: Last 2 dimensions of the array must be square
这样计算逆矩阵,会报错,最后两位必须是正方形(方阵矩阵),所以修改如下:
M=np.mat("1 22 44 5;1 0 -3 6;-9 -3 8 1;1 3 4 9")
matrix([[-0.19342604, -1.66624526, -0.18015171, 1.23830594],
[ 0.27939317, 2.18457649, 0.09355247, -1.62199747],
[-0.10998736, -1.04551201, -0.04361568, 0.76295828],
[-0.02275601, -0.0783818 , 0.00821745, 0.17509482]])
如果要使用,也可以用到广义逆矩阵np.linalg.pinv(M)
正确来说M*I会得到一个单位矩阵,等价于np.eye(4,4),左上角开始的对角线位置都为1,其余为0的矩阵(浮点数转整型:np.round(M*I))
如果不做四舍五入的操作,就会发生我提的这个问题:https://ask.csdn.net/questions/7691772
解线性方程(类似:A=MX,求解X)
M=np.mat('2 4 7;5 1 2;3 5 1')
A=np.array([2,6,8])
X=np.linalg.solve(M,A)
array([ 1.25714286, 0.97142857, -0.62857143])
验证:np.dot(M,X)结果为A,matrix([[2., 6., 8.]])正确
求解范数值(默认是L2范数,参数ord决定
a1=np.array([[9,4,5],[1,8,1]])
np.linalg.norm(a1,ord=1,axis=1,keepdims=True)#L1范数
array([[18.],[10.]])
np.linalg.norm(a1,ord=2,axis=1,keepdims=True)#L2范数
array([[11.04536102],[ 8.1240384 ]])
求解特征值(Eigenvalues)和特征向量(Eigenvectors)
特征值,是线性代数中的一个重要概念,是指设 A 是n阶方阵,如果存在数m和非零n维列向量 x,使得 Ax=mx 成立,则称 m 是A的一个特征值(characteristic value)或本征值(eigenvalue)
A=np.mat('4 1;2 -1')
np.linalg.eigvals(A)#array([ 4.37228132, -1.37228132])
>>> a1,a2=np.linalg.eig(A)
>>> a1
array([ 4.37228132, -1.37228132])
>>> a2
matrix([[ 0.93716416, -0.18299738],
[ 0.34888871, 0.9831134 ]])
奇异值分解SVD(Singular Value Decomposition)
一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
svd该函数返回3个矩阵:U、Sigma、V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值
D=np.mat("1 0 -1;-2 1 4")
u,sigma,v=np.linalg.svd(D,full_matrices=False)
matrix([[-0.27794882, 0.96059588],
[ 0.96059588, 0.27794882]])
array([4.76823893, 0.51370952])
matrix([[-0.46120604, 0.20145716, 0.86412036],
[ 0.78779586, 0.54106224, 0.29432861]])
验证:np.round(u*np.diag(sigma)*v)
输出结果为
matrix([[ 1., 0., -1.],
[-2., 1., 4.]])
就是D矩阵,正确
其中np.diag的用法:
d1=np.array([1,2,3])
#d1是一维的,就会沿着对角线形成一个矩阵
np.diag(d1)
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
#d2是矩阵,就会返回对角线的值
d2=np.array([[1,2,3],[6,7,8],[5,9,4]])
np.diag(d2)
array([1, 7, 4])