Day09:线性代数

线性代数

矩阵的基本运算

1. 矩阵的向量积

AB两个矩阵相乘,其结果是A的行与B的列相乘,一维数组的话就是他们的内积。
在numpy中的函数表达式为numpy.dot(a,b[,out])
注意:在线性代数里面讲的维数和数组的维数不同,如线代中提到的n维行向量在 Numpy 中是一维数组,而线性代数中的n维列向量在 Numpy 中是一个shape为(n, 1)的二维数组。

import numpy as np
x=np.arange(6)
y=np.arange(6)
z=np.dot(x,y)
print(z)
#55
x=np.arange(6).reshape(3,2)
print(x)
#[[0 1]
# [2 3]
# [4 5]]
y=np.random.randint(0,10,size=[2,3])#这里的两个矩阵必须是(m*n)*(n*p)型的,计算结果为m*p型
print(y)
#[[5 5 7]
# [0 6 0]]
z=np.dot(x,y)
print(z)
#[[ 0  6  0]
# [10 28 14]
# [20 50 28]]
print(np.dot(y,x))#这里的数组是特殊情况,刚好能进行A*B和B*A
#[[38 55]
# [12 18]]
2. 矩阵的特征值和特征向量

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

import numpy as np 
x=np.diag((1,2,3))#创建一个对角阵,diag()的参数为对角线的元素
print(x)
# [[1 0 0]
# [0 2 0]
# [0 0 3]]
print(np.linalg.eigvals(x))#计算x的特征值
#[1. 2. 3.]
a,b=np.linalg.eig(x)#将x的特征值储存在a中,特征向量保存在b中
print(a)
print(b)
#[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  

矩阵的分解

  1. SVD分解,也叫奇异值分解
    奇异值分解的理论解释:假设M是一个m×n阶矩阵,其中的元素全部属于域 K,也就是实数域或复数域。如此则存在一个分解使得其中U是m×m阶酉矩阵;Σ是半正定m×n阶对角矩阵;而V*,即V的共轭转置,是n×n阶酉矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,其中Σi即为M的奇异值。
    奇异值分解函数: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),
    其中 s 是对矩阵 a 的奇异值分解。 s 除了对角元素不为 0 ,其他元素都为 0 ,并且对角元素从大到小排列。 s 中有 n 个奇异值,一般排在后面的比较接近0,所以仅保留比较大的 r 个奇异值。
import numpy as np
A=np.arange(6).reshape(3,2)
print(A)
#[[0 1]
# [2 3]
# [4 5]]
u,s,vh=np.linalg.svd(A,full_matrices=False)
print(u.shape)
#(3, 2)
print(u)
#[[-0.10818576  0.90643763]
# [-0.48733624  0.30957507]
# [-0.86648672 -0.28728749]]
print(s.shape)#(2,)
print(s)#[7.38648213 0.66323581]
print(vh.shape)#(2, 2)
print(vh)
#[[-0.6011819  -0.79911221]
# [-0.79911221  0.6011819 ]]
a=np.dot(u,np.diag(s))#dot()矩阵的乘法运算,
a=np.dot(a,vh)
print(a)
#[[0. 1.]
# [2. 3.]
# [4. 5.]]
2. QR分解

QR分解:简单来说,就是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R
思路分析:
(1)对需要求解的特征值的矩阵进行QR分解
(2)对分解出来的结果进行逆向相乘
(3)将相乘得到的矩阵进行QR分解
(4)对分解出来的结果进行逆向相乘
参数的解释
q,r = numpy.linalg.qr(a, mode=‘reduced’)
a 是一个(M, N)的待分解矩阵
mode = reduced :返回(M, N)的列向量两两正交的矩阵 q ,和(N, N)的三角阵
r (Reduced QR分解)
mode = complete :返回(M, M)的正交矩阵 q ,和(M, N)的三角阵 r (Full QR分解)

import numpy as np
A=np.arange(9).reshape(3,3)
print(A)
#[[0 1 2]
# [3 4 5]
# [6 7 8]]
q,r=np.linalg.qr(A)
print(q.shape)
print(q)
print(r.shape)
print(r)
print(np.dot(q,r))
print(np.allclose(np.dot(q.T,q),np.eye(3)))#证明q为正交矩阵
#(3, 3)
#[[ 0.          0.91287093  0.40824829]
# [-0.4472136   0.36514837 -0.81649658]
#[-0.89442719 -0.18257419  0.40824829]]
#(3, 3)
#[[-6.70820393e+00 -8.04984472e+00 -9.39148551e+00]
# [ 0.00000000e+00  1.09544512e+00  2.19089023e+00]
# [ 0.00000000e+00  0.00000000e+00 -3.65307819e-16]]
#[[0. 1. 2.]
# [3. 4. 5.]
# [6. 7. 8.]]
#True

3. cholesky分解
cholesky分解:Cholesky 分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。它要求矩阵的所有特征值必须大于零,故分解的下三角的对角元也是大于零的。Cholesky分解法又称平方根法,是当A为实对称正定矩阵时,LU三角分解法的变形。(来源于百度词条)
函数表达式为L = numpy.linalg.cholesky(a)

import numpy as np
A=np.array([[1,2,1],[1,3,2],[1,2,3]])
print(A)
#[[1 2 1]
# [1 3 2]
# [1 2 3]]
print(np.linalg.eigvals(A))
#[0.35424869 5.64575131 1.        ]
L=np.linalg.cholesky(A)
print(L)
#[[1.         0.         0.        ]
# [1.         1.41421356 0.        ]
# [1.         0.70710678 1.22474487]]
print(np.dot(L,L.T))
#[[1. 1. 1.]
# [1. 3. 2.]
# [1. 2. 3.]]

范数及其他数字

1. 矩阵范数
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)

可以通过改变ord的值来计算不同的范数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值