线性代数的相关计算(numpy)

线性代数是数学里一个很重要的分支,很多的非线性的问题都要近似的使用线性代数来处理,将一些常见的方法小结

创建矩阵

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

<class 'numpy.matrix'>(注意:矩阵类型和数组<class 'numpy.ndarray'>是不一样的)
它们之间可以进行类型的转换,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])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅恪光潜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值