task04 线性代数

线性代数
Numpy 定义了 matrix 类型,使用该 matrix 类型创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和Matlab十分类似。但是由于 NumPy 中同时存在 ndarray 和 matrix 对象,因此用户很容易将两者弄混。这有违 Python 的“显式优于隐式”的原则,因此官方并不推荐在程序中使用 matrix。在这里,我们用 ndarray 来介绍。

矩阵和向量积
矩阵的定义、矩阵的加法、矩阵的数乘、矩阵的转置与二维数组完全一致,不再进行说明,但矩阵的乘法有不同的表示。

numpy.dot(a, b[, out])计算两个矩阵的乘积,如果是一维数组则是它们的内积。

import numpy as np

x=np.array([1,2,3,4,5,6])
y=np.array([2,3,4,5,6,7])
z=np.dot(x,y)

print(z)

112

a=np.array([[1,2,3],[3,4,5],[6,7,8]])
print(a)
b=np.array([[9,10,11],[12,13,14],[15,16,17]])
print(b)

print(np.dot(a,b))

[[1 2 3]
[3 4 5]
[6 7 8]]

[[ 9 10 11]
[12 13 14]
[15 16 17]]

[[ 78 84 90]
[150 162 174]
[258 279 300]]

numpy.linalg.eig(a) 计算方阵的特征值和特征向量。
numpy.linalg.eigvals(a) 计算方阵的特征值。

x=np.diag((1,2,3))
print(x)

print(np.linalg.eigvals(x))
a,b=np.linalg.eig(x)
print(a)
print(b)
[1. 2. 3.]
[1. 2. 3.]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
for i in range(3):
    if np.allclose(a[i]*b[:,i],np.dot(x,b[:,i])):
        print("right !")
    else:
        print('error')
right !
right !
right !

判断正定:

A=np.arange(16).reshape(4,4)
print(A)
A=A+A.T
print(A)
B=np.linalg.eigvals(A)
print(B)

if np.all(B>0):
    print('y')
else:
    print('n')

矩阵分解
奇异值分解

有关奇异值分解的原理:奇异值分解(SVD)及其应用

u, s, v = numpy.linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)奇异值分解
a 是一个形如(M,N)矩阵
full_matrices的取值是为False或者True,默认值为True,这时u的大小为(M,M),v的大小为(N,N)。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。
compute_uv的取值是为False或者True,默认值为True,表示计算u,s,v。为False的时候只计算s。
总共有三个返回值u,s,v,u大小为(M,M),s大小为(M,N),v大小为(N,N),a = usv。
其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。
注:Numpy中返回的v是通常所谓奇异值分解a=usv’中v的转置。

a=np.array([[1,2,3],[4,5,6]])
u,s,vh=np.linalg.svd(a,full_matrices=False)
print(u.shape)
print(u)

print(s.shape)
print(s)

print(vh.shape)
print(vh)

a=np.dot(u,np.diag(s))
a=np.dot(a,vh)
print(a)
(2, 2)
[[-0.3863177  -0.92236578]
 [-0.92236578  0.3863177 ]]
(2,)
[9.508032   0.77286964]
(2, 3)
[[-0.42866713 -0.56630692 -0.7039467 ]
 [ 0.80596391  0.11238241 -0.58119908]]
[[1. 2. 3.]
 [4. 5. 6.]]

QR分解

q,r = numpy.linalg.qr(a, mode=‘reduced’)计算矩阵a的QR分解。
a是一个(M, N)的待分解矩阵。
mode = reduced:返回(M, N)的列向量两两正交的矩阵q,和(N, N)的三角阵r(Reduced QR分解)。
mode = complete:返回(M, M)的正交矩阵q,和(M, N)的三角阵r(Full QR分解)。

A=np.array([[1,2,3],[4,-1,-6],[2,5,0]])
q,r=np.linalg.qr(A)
print(q.shape)
print(r.shape)
print(q,r)
print(np.dot(q,r))
(3, 3)
(3, 3)
[[-0.21821789  0.31186099 -0.92472897]
 [-0.87287156 -0.48613625  0.04203314]
 [-0.43643578  0.816342    0.37829822]] [[-4.58257569 -1.74574312  4.58257569]
 [ 0.          5.19156826  3.85240047]
 [ 0.          0.         -3.02638573]]
[[ 1.00000000e+00  2.00000000e+00  3.00000000e+00]
 [ 4.00000000e+00 -1.00000000e+00 -6.00000000e+00]
 [ 2.00000000e+00  5.00000000e+00  6.66133815e-16]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值