参考链接: 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:线性代数相关推荐

  1. [入门教程](python numpy入门)

    [入门教程](python numpy入门) NumPy NumPy是一个开源的Python科学计算基础库,包含 •一个强大的N维数组对象ndarray •广播功能函数 •整合C/C++/Fortra ...

  2. 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 ...

  3. numpy入门详细教程(一)

    本讲主要介绍对numpy库和numpy库的N维数组对象:ndarray的基本了解.更多内容请看numpy入门详细教程(二) numpy: NumPy是一个开源的Python科学计算基础库,包含: • ...

  4. numpy 数组抽取_清晰易懂的Numpy入门教程

    原标题:清晰易懂的Numpy入门教程 翻译 | 石头 来源 | Machine Learning Plus Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pa ...

  5. python numpy教程_Python中的Numpy入门教程

    这篇文章主要介绍了 Python 中的 Numpy 入门教程,着重讲解了矩阵中的数组操作 , 需要的 朋友可以参考下 1 . Numpy 是什么 很简单, Numpy 是 Python 的一个科学计算 ...

  6. Numpy入门[9]——数组与字符串的转换

    Numpy入门[9]--数组与字符串的转换 参考: https://ailearning.apachecn.org/ 使用Jupyter进行练习 import numpy as np tobytes方 ...

  7. numpy入门详细代码

    numpy入门 生成小的随机数组 属性 生成ndarray 维度 类型转换 数组算术 基础索引和切片 copy使用 数组切片索引 数组转置 面向数组编程 条件逻辑转为数组操作 随机漫步示例 numpy ...

  8. 【Python语言基础】——Python NumPy 入门

    Python语言基础--Python NumPy 入门 文章目录 Python语言基础--Python NumPy 入门 一.Python NumPy 入门 一.Python NumPy 入门 安装 ...

  9. [转载]批处理入门教程

    [转载]批处理入门教程 写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可以让事情变的更简单,那么就让它简单吧!看这篇教程的方法 脚本之家补充说明:批处理相对来说是比较简单的语言,大家 ...

最新文章

  1. Java多线程-线程的调度(合并)
  2. C语言实验——打印数字图形(JAVA)
  3. 回文质数(洛谷-P1217)
  4. java数据结构之快速排序
  5. MySQL索引背后的数据结构及算法原理(employees实例)
  6. angular 设置接口调用地址_[译] 关于 Angular 的变化检测,你需要知道的一切
  7. JavaScript设计模式与开发实践 - 单例模式
  8. 微信客户端抽奖转盘效果
  9. python控制风扇_Python 语音控制普通风扇实现教程
  10. ARP报文目的MAC为什么不是广播地址?
  11. 齐齐哈尔计算机应用软件学校,黑龙江齐齐哈尔计算机应用技术课程
  12. DINO Emerging Properties in Self-Supervised Vision Transformers 论文阅读
  13. 是否能够成为真正的编程高手,主要是在于是否有毅力坚持学习和练习。输出名言“贵有恒,何必三更起五更睡:最无益,只怕一日曝十日寒。”主要是想让读者激励自己,坚持学习C语言。
  14. Excel学习之旅(三)
  15. 数字系统设计(FPGA)课程设计: 多功能数字钟
  16. UE4Material_节点——Panner(平移)
  17. redis evict.c内存淘汰机制的源码分析
  18. [推荐系统读书笔记]利用用户标签数据
  19. PowerBI如何注册
  20. 哈工大深圳计算机学院蔡聪怀,哈工大(深圳)计算机学院第一届光熙杯篮球赛圆满落幕...

热门文章

  1. 【POJ3190】Stall Reservations
  2. linux用cmake编译,CMake使用简介(forLinux)
  3. java fileio_java FileIO类
  4. 医学生可以跨专业考计算机的专业,可以跨考医学研究生:2016跨专业考研需谨慎的专业解读:临床医学...
  5. word2vec需要去标点吗_word2vec训练词向量前期处理-中文分词等
  6. 设计模式—结构型模式概述(思维导图)
  7. python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)
  8. python深度学习库keras——网络建模全解
  9. matlab2c使用c++实现matlab函数系列教程-reshape函数
  10. docker从C盘迁移到E盘