【Numpy学习18】线性代数

Task09学习思维导图

在这里插入图片描述

注:为了节约行数,默认import numpy as np已经写在每段代码前,不再重复写入,如果有新的包引入,会在这里说明。

前言

NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能:

函数描述
dot两个数组的点积,即元素对应相乘。
vdot两个向量的点积
inner两个数组的内积
matmul两个数组的矩阵积
determinant数组的行列式
solve求解线性矩阵方程
inv计算矩阵的乘法逆矩阵

一、矩阵和向量的积

在这里插入图片描述

1) 一维向量的积

在这里插入图片描述

当a和b均为一维时,dot()方法即为求2个数组对应的乘积:1*3+2*4 = 11
,注意此时a和b的长度需要保持一致,否则会报错:

在这里插入图片描述

2)shape分别为(a,m)和(m,b)的矩阵之积

在这里插入图片描述
上面的例子就是正常的矩阵乘法,我们也可以用np.matmul()方法实现:

在这里插入图片描述
但需要保证a最后维度的维数和b第一维度的维数保持一致,否则会报错:

在这里插入图片描述

3)矩阵与标量之积

在这里插入图片描述
此时,可以直接用‘*’代替np.dot()方法

4)第二个参数是一维向量的情况

在这里插入图片描述

我们可以看到,此时ndarray在一维时的表达解答了我在前面学习过程中的思考,为什么一维ndarray变量的shape是(n,)而不是(,n),最后的结果依然保持一维。

此时需要满足矩阵最后维度的维数等于向量的长度,否则依然会报错:

在这里插入图片描述

注:对于线性代数中的n维行向量,numpy表示为形如(n,)的一位数组;对于线性代数中的n维列向量,numpy表示为行如(n,1)的二维数组。

二、矩阵特征值与特征向量

设 A 是n阶方阵,如果存在数λ和非零n维列向量 x,使得 Ax=λx 成立,则称 λ 是矩阵A的一个特征值(characteristic value)或本征值(eigenvalue)。

一般来说,我们需要先计算特征值,然后通过特征值去求特征向量:

1、求特征值

描述正方形矩阵的特征值的重要工具是特征多项式,λ是A的特征值等价于线性方程组(A – λI) v = 0 (其中I是单位矩阵)有非零解v (一个特征向量),因此等价于行列式|A – λI|=0 [1] 。
函数p(λ) = det(A – λI)是λ的多项式,因为行列式定义为一些乘积的和,这就是A的特征多项式。矩阵的特征值也就是其特征多项式的零点。

在numpy中,线性代数函数库 linalg提供了eigvals()方法进行计算:

在这里插入图片描述

其中a表示所求的矩阵,包括复数和实数。

举例:

在这里插入图片描述

在这里插入图片描述
验证成功。

2、求特征向量

一旦找到特征值λ,相应的特征向量可以通过求解特征方程(A – λE) v = 0 得到,其中v为待求特征向量,E为单位阵。

在numpy中,线性代数函数库 linalg提供了eig()方法同时计算特征值和特征向量:

在这里插入图片描述

在这里插入图片描述
这里注意 b[:i]代表的才是特征向量,而不是b[i]。

验证成功。

三、矩阵分解

1、奇异值分解

假设M是一个m×n阶矩阵,其中的元素全部属于域 K,也就是实数域或复数域。如此则存在一个分解使得:
在这里插入图片描述

其中U是m×m阶酉矩阵;Σ是半正定m×n阶对角矩阵;而V*,即V的共轭转置,是n×n阶酉矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,其中Σi即为M的奇异值。
常见的做法是为了奇异值由大而小排列。如此Σ便能由M唯一确定了。(虽然U和V仍然不能确定)

在numpy中,线性代数函数库 linalg提供了svd()方法进行奇异值分解:
在这里插入图片描述
参数解释:

  • a:原矩阵,维度大于1,元素为复数和实数均可
  • full_matrices:控制分解后的大小
  • compute_uv:是否只计算Σ矩阵
  • hermitian:是否保证a是自共轭矩阵(埃尔米特矩阵),这样可以加快运算效率

例子:

shape为(2,3)
在这里插入图片描述
shape为(3,2)
在这里插入图片描述

2、QR分解

QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。
如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解:

在这里插入图片描述

注:A须为Hessenberg矩阵。

使用qr分解有助于加快解方程或求解速度即收敛速度。

在numpy中,线性代数函数库 linalg提供了qr()方法进行QR分解:
在这里插入图片描述

参数解释:

  • a:原矩阵,形如(M,N)
  • mode:规定不同的返回矩阵类型及shape,默认返回(M,K)和(K,N)两个矩阵q和r,且q用于标准正交基的列

举例:

在这里插入图片描述
最后面的q和q的转置做矩阵乘法是为了验证q是正交矩阵:
在这里插入图片描述

3、Cholesky分解

Cholesky 分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。它要求矩阵的所有特征值必须大于零,故分解的下三角的对角元也是大于零的。Cholesky分解法又称平方根法,是当A为实对称正定矩阵时,LU三角分解法的变形:

在这里插入图片描述

注:A须为对称正定的矩阵,要求矩阵的所有特征值必须大于零,且生成的L为下三角矩阵。

例子:

在这里插入图片描述

四、范数和其它数字

1、范数

Ⅰ)向量范数

对于向量:
在这里插入图片描述
常用的范数包括:

Ⅱ)1-范数

在这里插入图片描述

即向量元素绝对值之和,x 到零点的曼哈顿距离

Ⅲ)2-范数

在这里插入图片描述

2-范数也称为Euclid范数(欧几里得范数,常用计算向量长度),即向量元素绝对值的平方和再开方,表示x到零点的欧式距离

Ⅳ)p-范数

在这里插入图片描述

即向量元素绝对值的p次方和的1/p次幂,表示x到零点的p阶闵氏距离。

Ⅴ)∞-范数

在这里插入图片描述

当p趋向于正无穷时,即所有向量元素绝对值中的最大值

Ⅵ)-∞-范数

在这里插入图片描述

当p趋向于负无穷时,即所有向量元素绝对值中的最小值

Ⅶ)0-范数

零范数即是当p趋于零,可以证明这时候的极限

在这里插入图片描述

恰好是向量

在这里插入图片描述

非零元素的个数。

2)矩阵范数

对于矩阵

在这里插入图片描述

Ⅰ)1-范数

在这里插入图片描述

列和范数,即所有矩阵列向量绝对值之和的最大值

Ⅱ)2-范数

在这里插入图片描述
在这里插入图片描述
表示
在这里插入图片描述
的最大特征值,称为谱范数

Ⅲ)∞-范数

在这里插入图片描述

称为行和范数,即所有矩阵行向量绝对值之和的最大值

Ⅳ)F-范数

在这里插入图片描述

称为Frobenius范数,即矩阵元素绝对值的平方和再开平方。

在这里插入图片描述

例子:

在这里插入图片描述

2、方阵的行列式

行列式就是关于“面积”的推广。他就是在给定一组基下,N个向量张成的一个N维广义四边形的体积。这就是行列式的本质含义。

在这里插入图片描述

在numpy中,线性代数函数库 linalg提供了det()方法计算方阵的行列式:
在这里插入图片描述
例子:

在这里插入图片描述

输入的矩阵须为方阵,否则会报错:
在这里插入图片描述

3、矩阵的秩

方阵(行数、列数相等的矩阵)的列秩和行秩总是相等的,因此它们可以简单地称作矩阵A的秩。通常表示为r(A),rk(A)或。
m × n矩阵的秩最大为m和n中的较小者,表示为 min(m,n)。有尽可能大的秩的矩阵被称为有满秩;类似的,否则矩阵是秩不足(或称为“欠秩”)的。
设A是一组向量,定义A的极大无关组中向量的个数为A的秩。

在numpy中,线性代数函数库 linalg提供了matrix_rank()方法计算矩阵的秩:

在这里插入图片描述
参数解释:

  • M:原矩阵
  • tol:
    在这里插入图片描述
  • hermitian:是否保证a是自共轭矩阵(埃尔米特矩阵),这样可以加快运算效率

例子:
在这里插入图片描述

我们先求出3*3的单位矩阵的秩,然后将其元素改变,再次求秩。

4、矩阵的迹

在线性代数中,一个n×n矩阵A的主对角线(从左上方至右下方的对角线)上各个元素的总和被称为矩阵A的迹(或迹数),一般记作tr(A):

在这里插入图片描述
在numpy中,实现方法如下:

在这里插入图片描述
参数解释:

  • a:原数组
  • offset:对角线与主对角线的偏移量。可以是正反两面。默认为0
  • axis1,axis2:当a维度大于2时,需要制定计算矩阵的迹的限定面
  • dtype:计算和返回时的数据类型
  • out:用来存放输出数据,需要保证正确的数据类型

例子:
在这里插入图片描述

五、解方程和逆矩阵

1、逆矩阵

设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E ,则称方阵A可逆,并称方阵B是A的逆矩阵:

在这里插入图片描述
表达为:

在这里插入图片描述
在这里插入图片描述

在numpy中,线性代数函数库 linalg提供了inv()方法计算矩阵的逆:
在这里插入图片描述

在这里插入图片描述

例子:

在这里插入图片描述
我们在求完A的逆矩阵之后利用逆矩阵的性质去验证了A和B的关系。

2、求解线性方程组

在numpy中,线性代数函数库 linalg提供了solve()方法求解线性方程组:
在这里插入图片描述

例子:

在这里插入图片描述

方法一直接使用solve()方法。方法二将两边同时左乘A的逆矩阵,求解x的过程就变为A的逆矩阵和b的矩阵乘法。

六、练习

1、计算两个数组a和数组b之间的欧氏距离

a = np.array([1, 2, 3, 4, 5])
b = np.array([4, 5, 6, 7, 8])
【知识点:数学函数、线性代数】

如何计算两个数组之间的欧式距离?

在这里插入图片描述

在这里插入图片描述

2、计算矩阵的行列式和矩阵的逆

np.linalg.det()

np.linalg.inv()

在这里插入图片描述

3、给定矩阵A和数组b,求解线性方程组

【知识点:线性代数】

在这里插入图片描述

4、计算特征值和特征向量

给定矩阵A[[4,-1,1],[-1,3,-2],[1,-2,3]]

【知识点:线性代数】

在这里插入图片描述

参考文献

#向量范数与矩阵范数
1、https://zhuanlan.zhihu.com/p/35897775

#矩阵的秩与行列式的几何意义
2、https://zhuanlan.zhihu.com/p/19609459

#SVD矩阵的奇异值分解
3、https://wenku.baidu.com/view/4b5012f8a1116c175f0e7cd184254b35effd1a51.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值