python-numpy(3)-线性代数

news2024/12/23 17:42:38

一、方程求解

参考资料
对于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))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity上接入手柄,手柄控制游戏物体移动

1、unity软件上安装system input 组件。菜单栏【window】-【Packag Manager】打开如下界面,查找Input System,并且安装。 2、安装成功后插入手柄到windows上,打开菜单栏上【window】--【Analysis】--【Input Debuger】 进入Input Debug界面,可以看到手柄设备能被Unity识别。…

Flutter - iOS 开发者速成篇

首先 安装FLutter开发环境:M1 Flutter SDK的安装和环境配置 然后了解Flutter和Dart 开源电子书:Flutter实战 将第一章初略看一下,你就大概了解一下Flutter和Dart这门语言 开始学习Dart语言 作为有iOS经验的兄弟们,学习Dart最快…

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…

云服务器安装Mysql、MariaDB、Redis、tomcat

前置工作 进入根目录 cd / 进入/user/local文件夹 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-…

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

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

Linux(Ubuntu) 查看并删除使用【dpkg】安装的软件【mysql 8.3安装失败---原因调查(Depends: libc6 (>= 2.35) but 2.31-0ubuntu9.1)】

目录 ■前言 ■查看安装的软件 ■删除安装的软件 正常删除&#xff08;dpkg -r xxxxName&#xff09; 问题解决&#xff1a;use --purge to remove them too ■其他调查信息 命令 图片1 图片2 图片3 图片4 图片5&#xff08;和镜像库有关&#xff09; 图片6 ■前…

在MOS管栅极前加100Ω电阻,有啥妙用

我们经常会听到在MOSFET栅极前增加一个电阻。那么&#xff0c;为什么要增加这个电阻&#xff0c;进一步地来讲&#xff0c;为什么要增加一个100Ω电阻&#xff1f; 在MOSFET的栅极前增加一个电阻&#xff1f; MOS管是电压型控制器件&#xff0c;一般情况下MOS管的导通&#x…

【学习笔记十五】批次管理和容量管理

一、批次管理 1.配置 SAP EWM 特定参数 激活仓库的批次管理 2.ERP端物料需要启用批次管理 3.EWM物料需要启用批次管理 一般是ERP启用批次管理&#xff0c;相关的配置也会传输到EWM系统 4.建立批次主数据 5.创建采购订单并创建内向交货单&#xff0c;维护批次 6.维护产品主数…

Ubuntu 22.04 开机自动挂载webdav - 设置开机自启脚本 - 解决坚果云webdav无写入权限

效果图&#xff1a; 前言&#xff1a; 1&#xff09;亲测/etc/fstab的办法没有成功自动挂载&#xff0c;换成传统的rc.local可以解决&#xff1b; 2&#xff09;rc-local.service是系统自带的一个开机自启服务&#xff0c;但是在 ubuntu 20.04 上&#xff0c;该服务默认没有开…

NLP_知识图谱_图谱问答实战

文章目录 图谱问答NERac自动机实体链接实体消歧 多跳问答neo4j_graph执行流程结构图![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1577c1d9c9e342b3acbf79824aae980f.png)company_data![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/20f567d877c743b…

深度学习图像处理基础工具——opencv 实战信用卡数字识别

任务 信用卡数字识别 穿插之前学的知识点 形态学操作 模板匹配 等 总体流程与方法 1.有一个模板 2 用轮廓检测把模板中数字拿出来 外接矩形&#xff08;模板和输入图像的大小要一致 &#xff09;3 一系列预处理操作 问题的解决思路 1.分析准备&#xff1a;准备模板&#…

libbpf-bootstrap库的代码结构介绍(用户层接口介绍),编译链接语句详细介绍,.skel.h文件介绍+示例,bpf程序的后续处理+文件关系总结

目录 libbpf-bootstrap 代码结构介绍 用户层函数 编译 查看 生成内核层的.o文件 第一模块 第二模块 第三模块 第四模块 第五模块 生成辅助文件(.skel.h) 介绍 示例 生成代码层的.o文件 第一模块 第二模块 第三模块 链接出可执行文件 后续总结 libbpf-bootst…

舒欣上门预约系统源码-按摩预约/家政预约全行业适用-小程序/h5/app

上门预约或者到店预约均可&#xff0c;家政&#xff0c;按摩&#xff0c;等等上门类行业均可适用。&#xff08;后台的技师及前台技师这两个字是可以更改的&#xff0c;例如改成家政老师&#xff0c;保洁&#xff0c;等等&#xff09; 视频教程是演示搭建的小程序端&#xff0c…

stm32报错问题集锦

PS&#xff1a;本文负责记录本人日常遇到的报错问题&#xff0c;以及问题描述、原因以及解决办法等&#xff0c;解决办法百分百亲测有效。本篇会不定期更新&#xff0c;更新频率就看遇到的问题多不多了 更换工程芯片型号 问题描述 例程最开始用的芯片型号是STM32F103VE&#…

Abstract Factory抽象工厂模式详解

模式定义 提供一个创建一系列相关或互相依赖对象的接口&#xff0c;而无需指定它们具体的类。 代码示例 public class AbstractFactoryTest {public static void main(String[] args) {IDatabaseUtils iDatabaseUtils new OracleDataBaseUtils();IConnection connection …

微信登录功能-保姆级教学

目录 一、使用组件 二、登录功能 2.1 步骤 2.2 首先找到网页权限 复制demo 代码 这里我们需要修改两个参数 三、前端代码 3.1 api 里weiXinApi.ts 3.2 api里的 index.ts 3.3 pinia.ts 3.4 My.vue 四、后端代码 4.1 WeiXinController 4.2 Access_Token.Java 4.3 We…

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头&#xff0c;救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时&#xff0c;倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO&#xff0c;这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机&#xff0c;以其卓越的性能和功能&#…

OpenHarmony实战开发-FaultLoggerd组件。

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口Sig…

新手教程 | 2024年最新Vmware17安装教程及许可证(详细图文)

目录 前言&#xff1a; 一、VMware Workstation 17 Pro 简介 二、下载安装&#xff08;以Windows为例&#xff09; 三、许可证 四、检查是否安装成功 前言&#xff1a; 重新装电脑后&#xff0c;安装虚拟机 一、VMware Workstation 17 Pro 简介 VMware Workstation 17 …

问题整理【2024-04-08】

一、关于MYSQL死锁问题 1.1 源由 一次上线过程中&#xff0c;遇到了MySQL死锁的问题…… 1.2 分析 1.2.1 前置知识 ​ 首先要知道&#xff0c;MySQL是一个多线程的数据库管理系统&#xff0c;查询是通常并发执行的&#xff0c;可以同时处理多个查询请求&#xff0c;并且My…