python-numpy(3)-线性代数

一、方程求解

参考资料
对于Ax = b 这种方程:

  1. np.linalg.inv(A).dot(B)
  2. np.linalg.solve(A,b)

1.1 求解多元一次方程一个直观的例子

# AX=B
# X = A^(-1)*B 
A = np.array([
    [7, 3, 0, 1], 
    [0, 1, 0, -1], 
    [1, 0, 6, -3], 
    [1, 1, -1, -1]])
B = np.array([
    8, 
    6, 
    -3, 
    1])
X = np.linalg.inv(A).dot(B)

print("x是:{} ".format(X[0]))
print("y是:{} ".format(X[1]))
print("z是:{} ".format(X[2]))
print("k是:{} ".format(X[3]))

1.2. 方程求解具体步骤

1.2.1 创建矩阵

A = np.mat("0 1 2;1 0 3;4 -3 8")
print (A)
#[[ 0 1 2]
# [ 1 0 3]
# [ 4 -3 8]]

1.2.2 求解逆矩阵

# 使用inv函数计算逆矩阵
inv = np.linalg.inv(A)
print (inv)
#[[-4.5 7. -1.5]
# [-2. 4. -1. ]
# [ 1.5 -2. 0.5]]

验证是否是逆矩阵

print (A * inv)
#[[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]

1.2.3 完整的求解过程

# Bx = b 
#创建矩阵和数组
B = np.mat("1 -2 1;0 2 -8;-4 5 9")
b = np.array([0,8,-9])

# 调用solve函数求解线性方程
x = np.linalg.solve(B,b)
print (x)
#[ 29. 16. 3.]

# 使用dot函数检查求得的解是否正确
print (np.dot(B , x))
# [[ 0. 8. -9.]]

二、常用的定义

2.1 特征值和特征向量

  • 特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量
  • numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组
# 创建一个矩阵
C = np.mat("3 -2;1 0")

# 调用eigvals函数求解特征值
c0 = np.linalg.eigvals(C)
print (c0)
# [ 2. 1.]

# 使用eig函数求解特征值和特征向量 (该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量)
c1,c2 = np.linalg.eig(C)
print (c1)
# [ 2. 1.]
print (c2)
#[[ 0.89442719 0.70710678]
# [ 0.4472136 0.70710678]]

# 使用dot函数验证求得的解是否正确
for i in range(len(c1)):
    print ("left:",np.dot(C,c2[:,i]))
    print ("right:",c1[i] * c2[:,i])
#left: [[ 1.78885438]
# [ 0.89442719]]
#right: [[ 1.78885438]
# [ 0.89442719]]
#left: [[ 0.70710678]
# [ 0.70710678]]
#right: [[ 0.70710678]
# [ 0.70710678]]
使用数组函数创建数组
a = np.array([[1, -2j], [2j, 5]])

print("Array is :",a)
# 使用 with() 函数计算特征值
c, d = np.linalg.eigh(a)

print("Eigen value is :", c)
print("Eigen value is :", d)

2.2 奇异值分解

参考资料

  • SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
  • numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。
# 分解矩阵
D = np.mat("4 11 14;8 7 -2")
# 使用svd函数分解矩阵
U,Sigma,V = np.linalg.svd(D, full_matrices=False)
print ("U:",U)
#U: [[-0.9486833 -0.31622777]
# [-0.31622777 0.9486833 ]]
print ("Sigma:",Sigma)
#Sigma: [ 18.97366596 9.48683298]
print ("V",V)
#V [[-0.33333333 -0.66666667 -0.66666667]
# [ 0.66666667 0.33333333 -0.66666667]]
# 结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma

# 使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘
print (U * np.diag(Sigma) * V)
#[[ 4. 11. 14.]
# [ 8. 7. -2.]]

2.3 逆矩阵

  • 使用numpy.linalg模块中的pinv函数进行求解,
  • 注:inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制

2.3.1 普通逆矩阵

# 使用inv函数计算逆矩阵
inv = np.linalg.inv(A)
print (inv)
#[[-4.5 7. -1.5]
# [-2. 4. -1. ]
# [ 1.5 -2. 0.5]]

2.3.2 广义逆矩阵

# 创建一个矩阵
E = np.mat("4 11 14;8 7 -2")
# 使用pinv函数计算广义逆矩阵
pseudoinv = np.linalg.pinv(E)
print (pseudoinv)
#[[-0.00555556 0.07222222]
# [ 0.02222222 0.04444444]
# [ 0.05555556 -0.05555556]]

# 将原矩阵和得到的广义逆矩阵相乘
print (E * pseudoinv)
#[[ 1.00000000e+00 -5.55111512e-16]
# [ 0.00000000e+00 1.00000000e+00]]

2.4 行列式

  • numpy.linalg模块中的det函数可以计算矩阵的行列式
# 计算矩阵的行列式
F = np.mat("3 4;5 6")
# 使用det函数计算行列式
print (np.linalg.det(F))
# -2.0

2.5 范数

  • 顾名思义,linalg=linear+algebra,normnorm则表示范数,首先需要注意的是范数是对向量(或者矩阵)的度量,是一个标量(scalar):
  • 首先help(np.linalg.norm)查看其文档:norm(x, ord=None, axis=None, keepdims=False)
    *在这里插入图片描述

a=[[1,2,0],[-1,2,-1],[0,1,1]]#写入矩阵
A=np.array(a)#转换成np.array格式
a1=np.linalg.norm(A, ord=1)
a2=np.linalg.norm(A, ord=2)
a2_2=np.sum(np.abs(A) ** 2) ** 0.5 

a3=np.linalg.norm(A, ord=np.Inf)
a4=np.linalg.norm(A, ord=-np.Inf)
print("第一范数为",a1)
print("第二范数为",round(a2, 2))
print("第二范数_自定义函数为",round(a2_2, 2))
print("无穷大范数为",a3)
print("无穷小范数a4为",a3)
#法二:第二范数:先求最大特征值再求
 
#先得到A的转置矩阵与A相乘的矩阵d
b=np.transpose(A)
B=np.array(b)
d=np.matmul(B,A)
 
#根据特征多项式得一元三次方程求解
import sympy as sp # 导入sympy包
x=sp.Symbol('x')
f=x**3-13*(x**2)+38*x-25   #见前面运算过程
x=sp.solve(f)  #得到的解析解比较复杂,故后续转换成浮点数
 
#取四位小数输出
for i in range(0,3):
    x[i]=round(x[i].evalf(),4) #求出表达式的浮点数
    print(x[i])
maxX=x[0]
for i in x:   ## 求最大值
    if i > maxX:
        maxX= i
print("第二范数为",round(maxX**0.5,4)) 

2.6 矩阵的秩

import numpy as np
A = np.array([
        [1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0],
        [5, 1, 2, 4, 0, 0, 1, 0, 0, 0, 0, 0],
        [5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
        [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1]
])
B = np.array(
    [
        [1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10],
        [0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 15],
        [5, 1, 2, 4, 0, 0, 1, 0, 0, 0, 0, 0, 100],
        [5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 60],
        [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,1],
        [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,4],
        [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,2],
        [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,10]
]
)
np.linalg.matrix_rank(A)#返回矩阵的秩
np.linalg.matrix_rank(B)#返回矩阵的秩

2.7 矩阵的迹

方阵的迹就是主对角元素之和:

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)
# [[1 2 3]
#  [3 4 5]
#  [6 7 8]]

y = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
print(y)
# [[5 4 2]
#  [1 7 9]
#  [0 4 5]]

print(np.trace(x))  # A的迹等于A.T的迹
# 13
print(np.trace(np.transpose(x)))
# 13

print(np.trace(x + y))  # 和的迹 等于 迹的和
# 30
print(np.trace(x) + np.trace(y))
# 30

2.8 两个数组的矩阵积

numpy.matmul 函数返回两个数组的矩阵乘积。

  • 虽然它返回二维数组的正常乘积,
  • 如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。
  • 另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。
import numpy as np 
 
a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print (np.matmul(a,b))

a = [[1,0],[0,1]] 
b = [1,2] 
print (np.matmul(a,b))
print (np.matmul(b,a))

a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print (np.matmul(a,b))

2.9 两个向量的内积

numpy.inner() 函数返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积。

print (np.inner(np.array([1,2,3]),np.array([0,1,0])))
# 等价于 1*0+2*1+3*0

a = np.array([[1,2], [3,4]]) 
b = np.array([[11, 12], [13, 14]])  
"""
1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14
"""
print ('内积:')
print (np.inner(a,b))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/544492.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue - 6( 13000 字 Vue3 入门级教程)

一 :Vue3 1.1 Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-ne…

Android ParcelFileDescriptor实现进程间通信

需求 一个通信通道,实现跨进程的的Socket网络通信。 具体的通信通道的图如下。 需求分析 我们需要一个进程一直做通信通道的事情,业务进程把数据通过进程间通信交给通信进程。通信进程通过Socket通道将数据发给网络另外一端的通信进程。接收端的通信进…

RedisTemplate

3.3.RedisTemplate 在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。 下面,我们…

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总

由于我是在虚拟机中安装的security onion,在此过程中,遇到很多的网络访问不通的问题,通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上,网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…

ssm051网上医院预约挂号系统+jsp

网上医院预约挂号系统设计与实现 摘 要 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让医院预约挂号信息的管理模式进行升级,也为了更好的维护医院预约挂号信息,网上医院…

dbeaver数据库语言编辑器设置jdbc驱动

打开 dbeaver 软件 数据库 -> 驱动管理器 以mysql为例 双击 MySQL -> 库 -> 添加工件 然后 打开maven组件库 官网 找到mysql驱动对应的maven工件地址 复制进去然后确认就行了 参考 大神博客

<计算机网络自顶向下> TCPUDP套接字编程

应用实现:源端的应用进程交换报文实现应用协议,来实现各种各样的网络应用(dash,email, etc) 而应用层通信不可以直接通信,需要借助下层的服务才可以进行,通过层间接口交给下层,通过…

Hadoop概述及集群搭建

文章目录 一、Hadoop介绍二、Hadoop发展简史三、Hadoop核心组件四、Hadoop架构变迁1、Hadoop 1.02、Hadoop 2.03、Hadoop 3.0 五、Hadoop集群简介六、Hadoop部署模式七、Hadoop 集群搭建第一步:创建虚拟机第二步:安装Linux镜像第三步:网络配置…

Go微服务: go-micro集成consul的注册中心和配置中心

微服务与注册中心的关系图 这个图很好说明了微服务之间的关系,以及consul注册中心的重要性 环境准备 1 )consul 集群 假设consul 集群已经搭建,已有5台server和2台client这里2台client被nginx做负载均衡,假设最终本地的访问地址…

了解 Vue 工程化开发中的组件通信

目录 1. 组件通信语法 1.1. 什么是组件通信? 1.2. 为什么要使用组件通信? 1.3. 组件之间有哪些关系(组件关系分类)? 1.4. 组件通信方案有哪几类 ? 2. 父子通信流程图 3. 父传子 3.1. 父传子核心流程…

1. 信息存储

系列文章目录 信息的表示和处理 : Information Storage(信息存储)Integer Representation(整数表示)Integer Arithmetic(整数运算)Floating Point(浮点数) 文章目录 系列文章目录前…

网络网络层之(2)ARP协议

网络网络层之(2)ARP协议 Author:Once Day Date: 2024年4月1日 漫漫长路,有人对你笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客。 参考文档: 《TCP/IP详解卷一》arp(8) - Linux manual page (man7.org)彻底搞懂系…

专业照片编辑软件ON1 Photo RAW 2024 mac/win

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面,即便对于摄影新手,也能快速上手。软件支持RAW格式照片处理,能够完整保留照片原始信息,让后期调整更加灵活。 在功能方面&#…

利用Sentinel解决雪崩问题(一)流量控制

1、解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待;舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离;熔断降级:由断路器统计业务…

Textarea的常用属性thymeleaf

文章目录 textareathymeleaf1.基础使用2.代码块的切换3.链接表达式1)范例 4.前后端5.遍历1.th:each2.th:switch3.添加属性 组件替换 每周总结 textarea -webkit-scrollbar:width:0;让滚动条隐藏,宽度为0 resize&#x…

浦大喜奔APP8.0智能升级,发力数字金融深化五大金融篇章服务

1. 浦大喜奔立足科技赋能持续迭代升级,筑牢用户体验护城河 浦发信用卡中心坚持数字科技与客户体验双轮驱动,以科技赋能发展,优化整体系统性能,全方位支撑浦大喜奔 APP提高线上客户服务能力与体验,积极服务民生消费&a…

【MATLAB源码-第188期】基于matlab的64QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境: MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术,作为一种高效的调制方案,能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

大模型面试准备(十八):使用 Pytorch 从零实现 Transformer 模型

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

Kafka 架构深入探索

目录 一、Kafka 工作流程及文件存储机制 二、数据可靠性保证 三 、数据一致性问题 3.1follower 故障 3.2leader 故障 四、ack 应答机制 五、部署FilebeatKafkaELK 5.1环境准备 5.2部署ELK 5.2.1部署 Elasticsearch 软件 5.2.1.1修改elasticsearch主配置文件 5.2…

MacOS Docker 部署 Solr 搜索引擎

一、简介 Solr 是 Apache 下的一个顶级开源项目,采用 Java 开发,它是基于 Lucene 的全文搜索服务器。Solr 可以独立运行在 Jetty、Tomcat 等这些 Servlet 容器中。Solr 提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展&#x…