[转载] numpy入门4:线性代数
参考链接: Numpy 线性代数
文章目录
矩阵和向量积矩阵乘积
矩阵特征值与特征向量矩阵分解奇异值(SVD)分解QR分解Cholesky分解
范数和其他数字矩阵的范数方阵的行列式矩阵的秩矩阵的迹
解方程和逆矩阵逆矩阵(inverse matrix)求解线性方程组
矩阵和向量积
矩阵乘积
定义 内积 矩阵乘法相关知识
矩阵的本质就是线性方程式,两者是一一对应关系。 矩阵的最初目的,只是为线性方程组提供一个简写形式。 矩阵乘法证明 有三组未知数 x、y 和 t,其中 x 和 y 的关系如下。 有了这两组方程式,就可以求 y 和 t 的关系。从矩阵来看,很显然,只要把第二个矩阵代入第一个矩阵即可。 从方程式来看,也可以把第二个方程组代入第一个方程组。 上面的方程组可以整理成下面的形式。 2. 代码实现 计算两个矩阵的乘积,如果是一维数组则是它们的内积。
numpy.dot(a,b,[,out])
【例】
import numpy as np
x = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])
print(x)
y = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
print(y)
z1 = np.dot(x,y)
z2 = np.dot(y,x)
print(z1)
print(z2)
矩阵特征值与特征向量
定义 如果把矩阵看作运动,对于运动而言:特征值就是运动的速度,特征向量就是运动的方向。 资料参考:矩阵特征值和特征向量代码实现
import numpy as np
#创建对角矩阵
x = np.diag((1,2,3))
#计算特征值
y = np.linalg.eigvals(x)
print(y)
#计算特征值和特征向量
a,b = np.linalg.eig(x)
#a是特征值,b是特征向量
print(a)
print(b)
【例】判断对称阵是否为正定阵(特征值是否全部为正)
import numpy as np
A = np.arange(16).reshape(4, 4)
print(A)
#将方阵转换成对称阵
A = A+A.T
print(A)
B = np.linalg.eigvals(A)
print(B)
#判断是不是所有的特征值都大于0
if np.all(B>0):
print('YES')
else:
print('No')
矩阵分解
奇异值(SVD)分解
定义 SVD(Singular Value Decomposition)可以理解为:将一个比较复杂的矩阵用更小更简单的3个子矩阵的相乘来表示,这3个小矩阵描述了大矩阵重要的特性。代码实现
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的转置 。
import numpy as np
A = np.array([[1, 1], [1, -2], [2, 1]])
print(A)
u,s,vh = np.linalg.svd(A,full_matrix = False)
print(u)
print(s)
print(vh)
QR分解
定义 QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。代码实现
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.array([[2, -2, 3], [1, 1, 1], [1, 3, -1]])
print(A)
q,r = np.linalg.qr(A)
print(q)
print(r)
Cholesky分解
定义 Cholesky 分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。它要求矩阵的所有特征值必须大于零,故分解的下三角的对角元也是大于零的。Cholesky分解法又称平方根法,是当A为实对称正定矩阵时,LU三角分解法的变形。代码实现
L = numpy.linalg.cholesky(a)
【例】
import numpy as np
A = np.array([[1, 1, 1, 1], [1, 3, 3, 3],
[1, 3, 5, 5], [1, 3, 5, 7]])
print(A)
print(np.linalg.eigvals(A))
L = np.linalg.cholesky(A)
print(L)
print(np.dot(L,L.T)
范数和其他数字
矩阵的范数
定义 我们知道距离的定义是一个宽泛的概念,只要满足非负、自反、三角不等式就可以称之为距离。范数是一种强化了的距离概念,它在定义上比距离多了一条数乘的运算法则。有时候为了便于理解,我们可以把范数当作距离来理解。
在数学上,范数包括向量范数和矩阵范数,向量范数表征向量空间中向量的大小,矩阵范数表征矩阵引起变化的大小。一种非严密的解释就是,对应向量范数,向量空间中的向量都是有大小的,这个大小如何度量,就是用范数来度量的,不同的范数都可以来度量这个大小,就好比米和尺都可以来度量远近一样;对于矩阵范数,学过线性代数,我们知道,通过运算AX=B,可以将向量X变化为B,矩阵范数就是来度量这个变化大小的。
L-P范数 L-P范数不是一个范数,而是一组范数,其定义如下: L0范数 当P=0时,也就是L0范数,由上面可知,L0范数并不是一个真正的范数,它主要被用来度量向量中非零元素的个数。
L1范数 L1范数是我们经常见到的一种范数,它的定义如下: L1范数有很多的名字,例如我们熟悉的曼哈顿距离、最小绝对误差等。使用L1范数可以度量两个向量间的差异,如绝对误差和(Sum of Absolute Difference): L2范数
我们用的最多的度量距离欧氏距离就是一种L2范数,它的定义如下: 像L1范数一样,L2也可以度量两个向量间的差异,如平方差和(Sum of Squared Difference): 它主要被用来度量向量元素的最大值
代码实现
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
根据ord参数的不同,计算不同的范数: 【例】求向量的范数。
import numpy as np
x = np.array([1, 2, 3, 4])
#以下均两两为替代操作
print(np.linalg.norm(x,ord = 1)
print(np.sum(np.abs(x)))
print(np.linalg.norm(x,ord =2)
print(np.sum(np.abs(x)**2)**0.5)
#inf:无穷
print(np.linalg.norm(x,ord=-np.inf)
print(np.min(np.abs(x))
print(np.linalg.norm(x,ord = np.inf)
print(np.max(np.abs(x))
【例】求矩阵的范数
import numpy as np
A = np.array([[1, 2, 3, 4], [2, 3, 5, 8],
[1, 3, 5, 7], [3, 4, 7, 11]])
#以下均两两为替代操作
print(np.linalg.norm(A,ord=1)
print(np.max(np.sum(A,axis = 0))
print(np.linalg.norm(A,ord = 2))
print(np.max(np.linalg.svd(A,compete_uv = False)))
print(np.linalg.norm(A, ord=np.inf))
print(np.max(np.sum(A, axis=1)))
print(np.linalg.norm(A, ord='fro'))
print(np.sqrt(np.trace(np.dot(A.T, A))))
方阵的行列式
定义 矩阵行列式是指矩阵的全部元素构成的行列式,一个n×n的方阵A的行列式记为det(A)或者|A|代码实现
numpy.linalg.det(a)
矩阵的秩
定义 在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数,通常表示为r(A),rk(A)或rank A。那些方程组中真正是干货的方程个数,就是这个方程组对应矩阵的秩。 资料参考:矩阵的秩代码实现
numpy.linalg.matrix_rank(M, tol=None, hermitian=False)
矩阵的迹
定义 方阵的迹就是主对角元素之和。代码实现
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)
【例】计算方阵的迹。
import numpy as np
x = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])
print(x)
y = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
print(y)
# A的迹等于A.T的迹
print(np.trace(x))
print(np.trace(np.transpose(x)))
# 和的迹 等于 迹的和
print(np.trace(x+y))
print(np.trace(x)+np.trace(y))
解方程和逆矩阵
逆矩阵(inverse matrix)
定义 设 A 是数域上的一个 n 阶矩阵,若在相同数域上存在另一个 n 阶矩阵 B,使得:AB=BA=E(E 为单位矩阵),则我们称 B 是 A 的逆矩阵,而 A 则被称为可逆矩阵。代码实现
numpy.linalg.inv(a)
【例】计算矩阵的逆矩阵。
import numpy as np
A = np.array([[1, -2, 1], [0, 2, -1], [1, 1, -2]])
print(A)
# 求A的行列式,不为零则存在逆矩阵
A_det = np.linalg.det(A)
print(A_det)
# 求A的逆矩阵
A_inverse = np.linalg.inv(A)
print(A_inverse)
求解线性方程组
求解线性方程组或矩阵方程。
numpy.linalg.solve(a, b)
【例】求解线性矩阵方程
import numpy as np
A = np.array([[1, 2, 1], [2, -1, 3], [3, 1, 2]])
b = np.array([7, 7, 18])
x = np.linalg.solve(A, b)
print(x)
x = np.linalg.inv(A).dot(b)
print(x)
[转载] numpy入门4:线性代数相关推荐
- [入门教程](python numpy入门)
[入门教程](python numpy入门) NumPy NumPy是一个开源的Python科学计算基础库,包含 •一个强大的N维数组对象ndarray •广播功能函数 •整合C/C++/Fortra ...
- python科学计算2 数据组织形式与numpy入门
文章目录 1 数据组织 1.1 单个数据 1.2 数据组织 1.3 数据组织的形式 1.3.1一维数据 1.3.2 二维数据 1.3.3 多维数据 1.3.4 高维数据 1.4普通数据组织的缺点 2 ...
- numpy入门详细教程(一)
本讲主要介绍对numpy库和numpy库的N维数组对象:ndarray的基本了解.更多内容请看numpy入门详细教程(二) numpy: NumPy是一个开源的Python科学计算基础库,包含: • ...
- numpy 数组抽取_清晰易懂的Numpy入门教程
原标题:清晰易懂的Numpy入门教程 翻译 | 石头 来源 | Machine Learning Plus Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pa ...
- python numpy教程_Python中的Numpy入门教程
这篇文章主要介绍了 Python 中的 Numpy 入门教程,着重讲解了矩阵中的数组操作 , 需要的 朋友可以参考下 1 . Numpy 是什么 很简单, Numpy 是 Python 的一个科学计算 ...
- Numpy入门[9]——数组与字符串的转换
Numpy入门[9]--数组与字符串的转换 参考: https://ailearning.apachecn.org/ 使用Jupyter进行练习 import numpy as np tobytes方 ...
- numpy入门详细代码
numpy入门 生成小的随机数组 属性 生成ndarray 维度 类型转换 数组算术 基础索引和切片 copy使用 数组切片索引 数组转置 面向数组编程 条件逻辑转为数组操作 随机漫步示例 numpy ...
- 【Python语言基础】——Python NumPy 入门
Python语言基础--Python NumPy 入门 文章目录 Python语言基础--Python NumPy 入门 一.Python NumPy 入门 一.Python NumPy 入门 安装 ...
- [转载]批处理入门教程
[转载]批处理入门教程 写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可以让事情变的更简单,那么就让它简单吧!看这篇教程的方法 脚本之家补充说明:批处理相对来说是比较简单的语言,大家 ...
最新文章
- Java多线程-线程的调度(合并)
- C语言实验——打印数字图形(JAVA)
- 回文质数(洛谷-P1217)
- java数据结构之快速排序
- MySQL索引背后的数据结构及算法原理(employees实例)
- angular 设置接口调用地址_[译] 关于 Angular 的变化检测,你需要知道的一切
- JavaScript设计模式与开发实践 - 单例模式
- 微信客户端抽奖转盘效果
- python控制风扇_Python 语音控制普通风扇实现教程
- ARP报文目的MAC为什么不是广播地址?
- 齐齐哈尔计算机应用软件学校,黑龙江齐齐哈尔计算机应用技术课程
- DINO Emerging Properties in Self-Supervised Vision Transformers 论文阅读
- 是否能够成为真正的编程高手,主要是在于是否有毅力坚持学习和练习。输出名言“贵有恒,何必三更起五更睡:最无益,只怕一日曝十日寒。”主要是想让读者激励自己,坚持学习C语言。
- Excel学习之旅(三)
- 数字系统设计(FPGA)课程设计: 多功能数字钟
- UE4Material_节点——Panner(平移)
- redis evict.c内存淘汰机制的源码分析
- [推荐系统读书笔记]利用用户标签数据
- PowerBI如何注册
- 哈工大深圳计算机学院蔡聪怀,哈工大(深圳)计算机学院第一届光熙杯篮球赛圆满落幕...
热门文章
- 【POJ3190】Stall Reservations
- linux用cmake编译,CMake使用简介(forLinux)
- java fileio_java FileIO类
- 医学生可以跨专业考计算机的专业,可以跨考医学研究生:2016跨专业考研需谨慎的专业解读:临床医学...
- word2vec需要去标点吗_word2vec训练词向量前期处理-中文分词等
- 设计模式—结构型模式概述(思维导图)
- python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)
- python深度学习库keras——网络建模全解
- matlab2c使用c++实现matlab函数系列教程-reshape函数
- docker从C盘迁移到E盘