【机器学习-02】矩阵基础运算---numpy操作

  在机器学习-01中,我们介绍了关于机器学习的一般建模流程,并且在基本没有数学公式和代码的情况下,简单介绍了关于线性回归的一般实现形式。不过这只是在初学阶段、为了不增加基础概念理解难度所采取的方法,但所有的技术最终都是为了解决实际问题的,因此,接下来,我们就在之前的基础上更进一步,从一个更加严谨的理论体系出发、来尝试进行一种更加贴合实际应用所采用的一般方法的建模方法的学习。

import numpy as np
import pandas as pd

一、NumPy矩阵运算基础

  在进入到本节正式内容之前,我们需要先补充一些矩阵相关基础概念,以及矩阵运算的基本方法。
  在机器学习基础阶段,需要掌握的矩阵及线性代数基本理论包括:

  • 矩阵的形变及特殊矩阵的构造方法:包括矩阵的转置、对角矩阵的创建、单位矩阵的创建、上/下三角矩阵的创建等;
  • 矩阵的基本运算:包括矩阵乘法、向量内积、矩阵和向量的乘法等;
  • 矩阵的线性代数运算:包括矩阵的迹、矩阵的秩、逆矩阵的求解、伴随矩阵和广义逆矩阵等;
  • 矩阵分解运算:特征分解、奇异值分解和SVD分解等。
    本节将先介绍前三部分内容,矩阵分解部分内容将在后续补充。

1.NumPy中的矩阵表示

  在NumPy中,二维数组(array)和matrix类型对象都可以用于表示矩阵,并且也都具备矩阵的代数学方法。

  • 利用数组创建矩阵
A = np.array([[1, 2], [1, 1]])Aarray([[1, 2],[1, 1]])type(A)numpy.ndarray
  • 利用mat创建矩阵
AM = np.mat(A)
AMmatrix([[1, 2],[1, 1]])type(AM)
numpy.matrix

关于两种对象类型的选取,此处进行简单说明:

  • NumPy中的matrix类型对象和MATLAB中的matrix类型等价,和NumPy中数组类型对象底层基本结构不同;
  • 在NumPy中,针对大规模数据,数组类型对象的计算速度要快于矩阵类型对象;
  • 矩阵类型对象可以通过运算符直接进行矩阵乘法,而二维数组要进行矩阵乘法(及其他矩阵运算),则必须要使用包括linalg(线性代数运算)模块在内的相关函数。
AM * AMmatrix([[3, 4],[2, 3]])A.dot(A)
array([[3, 4],[2, 3]])# 新版NumPy也支持使用符号进行矩阵乘法
A @ A
array([[3, 4],[2, 3]])

为了执行更高效的计算、以及确保代码整体基本对象类型统一,课程如无说明,将统一使用二维数组表示矩阵。

2.NumPy中特殊矩阵构造方法

  在实际线性代数运算过程中,经常涉及一些特殊矩阵,如单位矩阵、对角矩阵等,相关创建方法如下:

函数描述
a.T数组a转置
np.eye(n)创建包含n个分量的单位矩阵
np.diag(a1)以a1中各元素,创建对角矩阵
np.triu(a)取矩阵a中的上三角矩阵
np.tril(a)取矩阵a中的下三角矩阵

下面将展示一些矩阵的基本操作:

# 创建一个2*3的矩阵
a1 = np.arange(1, 7).reshape(2, 3)a1
array([[1, 2, 3],[4, 5, 6]])# 转置
a1.Tarray([[1, 4],[2, 5],[3, 6]])

矩阵的转置就是每个元素行列位置互换

# 创建单位矩阵
np.eye(3)
array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])

单位矩阵之所以被称为“单位”,核心原因在于单位矩阵和任何矩阵相乘,都将返回原矩阵。

a = np.arange(5)a
array([0, 1, 2, 3, 4])np.diag(a)
array([[0, 0, 0, 0, 0],[0, 1, 0, 0, 0],[0, 0, 2, 0, 0],[0, 0, 0, 3, 0],[0, 0, 0, 0, 4]])# 对角线向上偏移一位
np.diag(a, 1)
array([[0, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0],[0, 0, 0, 2, 0, 0],[0, 0, 0, 0, 3, 0],[0, 0, 0, 0, 0, 4],[0, 0, 0, 0, 0, 0]])# 对角线向下偏移一位
np.diag(a, -1)
array([[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0],[0, 1, 0, 0, 0, 0],[0, 0, 2, 0, 0, 0],[0, 0, 0, 3, 0, 0],[0, 0, 0, 0, 4, 0]])a1 = np.arange(9).reshape(3, 3)
a1
array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])# 取上三角矩阵
np.triu(a1)
array([[0, 1, 2],[0, 4, 5],[0, 0, 8]])# 上三角矩阵向左下偏移一位
np.triu(a1, -1)
array([[0, 1, 2],[3, 4, 5],[0, 7, 8]])# 上三角矩阵向右上偏移一位
np.triu(a1, 1)
array([[0, 1, 2],[0, 0, 5],[0, 0, 0]])# 下三角矩阵
np.tril(a1)
array([[0, 0, 0],[3, 4, 0],[6, 7, 8]])

3.NumPy中矩阵基本运算

  由于NumPy中我们使用二维数组来表述矩阵,因此二维数组也就具备了数组和矩阵的两重属性。其中数组属性决定的基本运算相对简单,基础运算(如加减乘除)就是对应位置元素进行逐元素计算,而矩阵属性决定的运算则稍显复杂,当然矩阵的相关线性代数运算将在下一小节讨论,在基础运算上,矩阵和数组核心的区别在于乘法运算。
  当然,从另一个角度考虑,其实对于向量和矩阵这种具备一定结构的对象,有很多种容易混淆的计算规则。对于常用的计算规则,我们通过将其划分成三类以帮助大家理解:

描述解释/函数
逐元素相乘向量、矩阵通用
每个对应位置元素相乘*
逐元素相乘后相加也被称为点积(内积),向量,矩阵通用
向量点积vdot、dot、inner
矩阵点积vdot
矩阵乘法代数学意义的矩阵相乘
矩阵乘法dot、matmul、@
  • * :逐元素相乘
a = np.arange(4)
a
array([0, 1, 2, 3])a * a
array([0, 1, 4, 9])A = a.reshape(2, 2)
A
array([[0, 1],[2, 3]])A * A
array([[0, 1],[4, 9]])
  • 向量点积
      所谓点积(也被称为内积),指的是向量或矩阵对应位置元素相乘后相加。向量点积有三种实现方法,分别是dot、vdot和ineer。
np.dot(a, a)
14a.dot(a)
14(a * a).sum()
14np.vdot(a, a)
14np.inner(a, a)
14
  • 矩阵点积
      值得注意的是,矩阵内积只有vdot一种方式实现。
A
array([[0, 1],[2, 3]])np.vdot(A, A)
14(A * A).sum()
14

注意,高维数组的inner并不是内积,而是一种类似tensordot的沿着尾轴实现和积的计算过程,该方法并不通用,此处暂不做介绍。

  • 矩阵乘法
      NumPy中,我们可以使用诸多方法实现矩阵乘法,包括dot、@、matmul等。
a1 = np.arange(1, 7).reshape(2, 3)
a1
array([[1, 2, 3],[4, 5, 6]])a2 = np.arange(1, 10).reshape(3, 3)
a2
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 矩阵乘法
np.matmul(a1, a2)
array([[30, 36, 42],[66, 81, 96]])

此处也简单回顾矩阵乘法运算,上述相乘过程如下所示:
5

值得注意的是,矩阵相乘要求左乘矩阵列数和右乘矩阵行数相同,而内积计算过程则严格要求两个向量/矩阵形状完全一致。

4.NumPy中矩阵代数运算

  如果说矩阵的基本运算是矩阵基本性质,那么矩阵的线性代数运算,则是我们利用矩阵数据类型在求解实际问题过程中经常涉及到的线性代数方法,具体相关函数如下:

矩阵的线性代数运算

函数描述
np.trace(A)矩阵的迹
np.linalg.matrix_rank(A)矩阵的秩
np.linalg…det(A)计算矩阵A的行列式
np.linalg.inv(A)矩阵求逆

同时,由于线性代数所涉及的数学基础知识较多,从实际应用的角度出发,我们将有所侧重的介绍实际应用过程中需要掌握的相关内容,并通过本节末尾的实际案例,来加深线性代数相关内容的理解。

NumPy中的linalg是linear algebra(线性代数)的简写,也是NumPy中保存线性代数相关计算函数的模块。

  • 矩阵的迹(trace)

  矩阵的迹的运算相对简单,就是矩阵对角线元素之和,在NumPy中,可以使用trace函数进行计算。

A = np.array([[1, 2], [4, 5]])
A
array([[1, 2],[4, 5]])np.trace(A)
6

当然,对于矩阵的迹来说,计算过程不需要是方正

B = np.arange(1, 7).reshape(2, 3)
B
array([[1, 2, 3],[4, 5, 6]])np.trace(B)
6
  • 矩阵的秩(rank)
      矩阵的秩(rank),是指矩阵中行或列的极大线性无关数,且矩阵中行、列极大无关数总是相同的,任何矩阵的秩都是唯一值,满秩指的是方阵(行数和列数相同的矩阵)中行数、列数和秩相同,满秩矩阵有线性唯一解等重要特性,而其他矩阵也能通过求解秩来降维,同时,秩也是奇异值分解等运算中涉及到的重要概念。

所谓线性相关,其实也就是线性表示,如果 y = w x + b y=wx+b y=wx+b,我们则称y可以由x线性表示,二者线性相关,反之则线性无关。类似,如果 y = w 1 x 1 w 2 x 2 + b y=w_1x_1w_2x_2+b y=w1x1w2x2+b,则我们称y可以由 x 1 、 x 2 x_1、x_2 x1x2线性表示,y与 x 1 、 x 2 x_1、x_2 x1x2线性相关。

  • matrix_rank计算矩阵的秩
A = np.array([[1, 3, 4], [2, 1, 3], [1, 1, 2]])
A
array([[1, 3, 4],[2, 1, 3],[1, 1, 2]])np.linalg.matrix_rank(A)
2

对于矩阵A来说,第三列明显可以由第一列和第二列相加得出,因此极大线性无关组只有两列。

B = np.array([[1, 3, 4], [2, 1, 3], [1, 1, 10]])
B
array([[ 1,  3,  4],[ 2,  1,  3],[ 1,  1, 10]])np.linalg.matrix_rank(B)
3
  • 矩阵的行列式(det)
      所谓行列式,我们可以简单将其理解为矩阵的一个基本性质或者属性,通过行列式的计算,我们能够知道矩阵是否可逆,从而可以进一步求解矩阵所对应的线性方程。当然,更加专业的解释,行列式的作为一个基本数学工具,实际上就是矩阵进行线性变换的伸缩因子。

对于任何一个n维方正,行列式计算过程如下:
7

更为简单的情况,如果对于一个2*2的矩阵,行列式的计算就是主对角线元素之积减去另外两个元素之积

A = np.array([[1, 2], [4, 5]])
A
array([[1, 2],[4, 5]])np.linalg.det(A)
-2.9999999999999996

A的秩计算过程如下:
6

对于行列式的计算,要求矩阵必须是方阵,也就是行列数必须一致。

B = np.arange(1, 7).reshape(2, 3)
B
array([[1, 2, 3],[4, 5, 6]])np.linalg.det(B)A = np.array([[1, 3, 4], [2, 1, 3], [1, 1, 2]])
A
array([[1, 3, 4],[2, 1, 3],[1, 1, 2]])np.linalg.det(A)
0.0
  • 矩阵的逆
      对于满秩的方正来说,可以求其逆矩阵。从基本定义上来看,如果矩阵B和矩阵A相乘能够得到单位矩阵,即:
    B ⋅ A = E B \cdot A = E BA=E

则称B为A的逆矩阵,也可将B写作 A − 1 A^{-1} A1。当然,逆矩阵的性质是相互的,我们也可称A为B的逆矩阵,或者A和B互为逆矩阵。

A = np.array([[1, 1], [3, 1]])
A
array([[1, 1],[3, 1]])

然后使用inverse函数进行逆矩阵求解

np.linalg.inv(A)
array([[-0.5,  0.5],[ 1.5, -0.5]])

简单试探逆矩阵的基本特性

A.dot(np.linalg.inv(A))
array([[1.00000000e+00, 1.11022302e-16],[2.22044605e-16, 1.00000000e+00]])

当然,对于逆矩阵,还有很多其他理解角度。例如,从方程组求解角度来看,逆矩阵的存在就代表着方程组存在唯一解,并且逆矩阵本身也是方程组求解的关键;从矩阵分解角度来看,逆矩阵是一种最为基础的矩阵分解的形式。关于这些相关内容,我们都将在后续课程中逐渐介绍。

另外,在本栏目内容中,我们还将介绍solve(方程组求解)、lstsq(最小二乘法)相关函数的使用。

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

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

相关文章

sparksql简介

什么是sparksql sparksql是一个用来处理结构话数据的spark模块,它允许开发者便捷地使用sql语句的方式来处理数据;它是用来处理大规模结构化数据的分布式计算引擎,其他分布式计算引擎比较火的还有hive,map-reduce方式。 sparksql…

GUROBI之数学启发式算法Matheuristics

参考运小筹的帖子:优化求解器 | Gurobi 数学启发式算法:参数类型与案例实现 - 知乎 (zhihu.com) 简言之,数学启发式是算法就是数学规划和启发式算法的融合,与元启发式算法相比,数学启发式算法具有更强的理论性。 在GUR…

python--模块导入+路径处理+常见异常类型

python--模块导入路径处理常见异常类型 模块导入import 模块名from 模块名 import 类、变量、函数from 模块名 import *from 项目名.包.py文件名称 import 类、变量、函数导包快捷键 os 模块 路径处理路径获取os.path.dirname(__file__)os.path.abspath(test.txt)os.getcwd() 路…

React低代码平台实战:构建高效、灵活的应用新范式

文章目录 每日一句正能量前言一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践后记好书推荐编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书 赠书活动 每日一句正能量 人生之美,不在争…

AI论文速读 | TPLLM:基于预训练语言模型的交通预测框架

论文标题:TPLLM: A Traffic Prediction Framework Based on Pretrained Large Language Models 作者:Yilong Ren(任毅龙), Yue Chen, Shuai Liu, Boyue Wang(王博岳),Haiyang Yu(于海洋&#x…

提高安全投资回报:威胁建模和OPEN FAIR™风险分析

对大多数人和企业来说,安全意味着一种成本。但重要的是如何获得适合的量,而不是越多越好。然而,你如何决定什么时候可以有足够的安全性,以及你如何获得它?则完全是另一回事。 该篇文章是由The Open Group安全论坛主办&…

爱奇艺 CTR 场景下的 GPU 推理性能优化

01 背景介绍 GPU 目前大量应用在了爱奇艺深度学习平台上。GPU 拥有成百上千个处理核心,能够并行的执行大量指令,非常适合用来做深度学习相关的计算。在 CV(计算机视觉),NLP(自然语言处理)的模型…

基于SpringBoot SSM vue办公自动化系统

基于SpringBoot SSM vue办公自动化系统 系统功能 登录 个人中心 请假信息管理 考勤信息管理 出差信息管理 行政领导管理 代办事项管理 文档管理 公告信息管理 企业信息管理 会议室信息管理 资产设备管理 员工信息管理 开发环境和技术 开发语言:Java 使用框架: S…

ChatGLM3-6B独立部署提供HTTP服务failed to open nvrtc-builtins64_121.dll

背景 我在本地windoes部署ChatGLM3-bB,且希望部署后能提供HTTP server的能力。 模型部署且启动是成功了,但是在访问生成接口/v1/chat/completions时报错failed to open nvrtc-builtins64_121.dll。 问题详细描述 找不到nvrtc-builtins64_121.dll Runtime…

【JavaScript】JavaScript 运算符 ④ ( 逻辑运算符 | 逻辑与运算符 | 逻辑或运算符 || | 逻辑非运算符 ! )

文章目录 一、JavaScript 逻辑运算符1、逻辑运算符 概念2、逻辑与运算符 &&3、逻辑或运算符 ||4、逻辑非运算符 !5、完整代码示例 一、JavaScript 逻辑运算符 1、逻辑运算符 概念 JavaScript 中的 逻辑运算符 的作用是 对 布尔值 进行运算 , 运算完成 后 的 返回值 也是…

Java面试题20之论如何实现接口的幂等性(高并发情况下)

电商的前后端交互,下一步,登陆注册,由于网络原因的重复发送请求,同一资料发送多份 接口的幂等性:相同的资料进来只注册一个 唯一id: 每次操作,都根据操作和内容生成唯一的id,在执…

2.26回顾章节主体线索脉络,课程要求(评分)

3)翻译程序、汇编程序、编译程序、解释程序有什么差别?各自的特性是什么? 翻译程序是指把高级语言源程序翻译成机器语言程序(目标代码)的软件。 翻译程序有两种:一种是编译程序,它将高级语言源程序一次全部…

学习笔记--强化学习(1)

参考:https://blog.csdn.net/koulongxin123/article/details/122676149 1.什么是强化学习? (1)定义 基于环境的反馈而行动,通过不断与环境的交互、试错,最终完成特定目的或者使得整体行动收益最大化(是一种通过与环境…

CKA认证之Etcd备份与恢复

题目介绍: 资料参考: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd 解题: 1、备份 #参考模板列出 etcdctl 可用的各种选项。 #例如,你可以通过指定端点、证书和密钥来制作快照&#xff0…

15 个最佳免费照片恢复软件快速恢复已删除的图像

这篇文章重点介绍了适用于 Windows 10 的 15 款最佳免费照片恢复软件。阅读整篇文章,了解理想的图像恢复软件。 照片可以带回所有的回忆,回忆起与我们所爱的人和亲密的人度过的每一个“时刻”。照片是我们永远不想失去的东西,但有时我们会无…

Axios 中的文件上传(Upload File)方法

Axios 提供了多种上传文件(Upload File)的方法,适用于不同的上传场景。以下是其中几种常用的方法: 1. 使用 FormData 对象FormData是一个用于创建表单数据的 API,可用于发送包含文件和其他表单数据的multipart/form-d…

【热门话题】前端框架发展史

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 前端开发的历史演变引言第一章:起源与基础建设 - HTML与CSS时代1.1 …

24计算机考研调剂 | 南昌航空大学

2024年南昌航空大学计算机视觉与人工智能团队招收研究生 考研调剂招生信息 学校:南昌航空大学 专业:工学->计算机科学与技术 工学->控制科学与工程->模式识别与智能系统 年级:2024 招生人数:3 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式…

THM学习笔记—RootMe

nmap扫描,发现22端口和80端口打开 dirsearch扫描,注意到/panel和/uploads,在浏览器中打开 可以上传文件,尝试反弹shell 在尝试过程中发现网站不能上传.php文件,只需要将后缀更改为.php5之类即可 成功 查找文件&#x…

前世档案(不用二叉树语法秒杀版c++)

网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。 现在我们把结论从左到右顺序…