【机器学习-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]])

A

array([[1, 2],
       [1, 1]])

type(A)

numpy.ndarray
  • 利用mat创建矩阵
AM = np.mat(A)
AM

matrix([[1, 2],
        [1, 1]])
        
type(AM)
numpy.matrix

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

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

matrix([[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.T

array([[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)
14

a.dot(a)
14

(a * a).sum()
14

np.vdot(a, a)
14

np.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(最小二乘法)相关函数的使用。

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

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

相关文章

【01】htmlcssgit

01-前端干货-html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全…

C语言之快速排序

目录 一 简介 二 代码实现 快速排序基本原理: C语言实现快速排序的核心函数: 三 时空复杂度 A.时间复杂度 B.空间复杂度 C.总结: 一 简介 快速排序是一种高效的、基于分治策略的比较排序算法,由英国计算机科学家C.A.R. H…

【Machine Learning】Suitable Learning Rate in Machine Learning

一、The cases of different learning rates: In the gradient descent algorithm model: is the learning rate of the demand, how to determine the learning rate, and what impact does it have if it is too large or too small? We will analyze it through the follow…

HCIP—OSPF课后练习一

本实验模拟了一个企业网络场景,R1、R2、R3为公司总部网络的路由器,R4、R5分别为企业分支机构1和分支机构2的路由器,并且都采用双上行方式与企业总部相连。整个网络都运行OSPF协议,R1、R2、R3之间的链路位于区域0,R4与R…

Redis和Mysql的数据一致性问题

在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以我们都会用Redis来做数据的缓存,削减对数据库的请求的频率。 但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。 1、导…

并查集Disjoint Set

并查集的概念 并查集是一种简单的集合表示,它支持以下三种操作 1. make_set(x),建立一个新集合,唯一的元素是x 2. find_set(x),返回一个指针,该指针指向包含x的唯一集合的代表,也就是x的根节点 3. union_…

Echo框架:高性能的Golang Web框架

Echo框架:高性能的Golang Web框架 在Golang的Web开发领域,选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架,以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…

学习shell脚本

文章目录 什么是shell脚本为什么要学习shell脚本第一个脚本编写与执行 简单的shell脚本练习简单案例脚本的执行方式差异(source、sh script、./script) 如何使用shell脚本的判断式利用test命令的测试功能利用判断符号[ ]shell脚本的默认变量($0、$1...) shell脚本的条件判断式利…

MySQL安装(Mac系统)

首先要删除本机原有的mysql 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop不放心可以使用以下命令查询并杀死进程 ps aux | grep mysqld sudo kill <PID>再次尝试停止服务 sudo /usr/local/mysql/support-files/mysql.server stop卸载MySQL&…

多租户平台前端存储结构的选择

下图来源于cookie、localStorage 和 sessionStorage的区别及应用实例 既然localstorage无有效期&#xff0c;关闭浏览器还存在&#xff0c;那么用来存储用户的身份信息并不是太合适&#xff0c;先看一下B站中localstorage都存在了啥&#xff0c;原来把我搜索的记录都存在了下来…

第十二届蓝桥杯EDA省赛真题分析

前言&#xff1a; 第十二届蓝桥杯EDA比赛用的是AD软件&#xff0c;从第十四届起都是使用嘉立创EDA专业版&#xff0c;所以在这里我用嘉立创EDA专业版实现题目要求。 一、省赛第一套真题题目 主观题整套题目如下&#xff1a; 试题一&#xff1a;库文件设计&#xff08;5分&am…

【类脑智能】脑网络通信模型分类及量化指标(附思维导图)

脑网络通信模型分类及量化指标(附思维导图) 参考论文&#xff1a;Brain network communication_ concepts, models and applications 概念 脑网络通信模型是一种使用图论和网络科学概念来描述和量化大脑结构中信息传递的模型。这种模型可以帮助研究人员理解神经信号在大脑内…

P1881 绳子对折

题目描述 FJ 有一个长度为 L&#xff08;1≤L≤10,000&#xff09;的绳子。这个绳子上有 N&#xff08;1≤N≤100&#xff09;个结&#xff0c;包括两个端点。FJ 想将绳子对折&#xff0c;并使较短一边的绳子上的结与较长一边绳子上的结完全重合&#xff0c;如图所示&#xff…

知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会

在区块链技术的风起云涌和Web3生态的蓬勃发展中&#xff0c;知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit()&#xff0c;此次大会将为全球区块链开发者及业…

本地用AIGC生成图像与视频

最近AI界最火的话题&#xff0c;当属Sora了。遗憾的是&#xff0c;Sora目前还没开源或提供模型下载&#xff0c;所以没法在本地跑起来。但是&#xff0c;业界有一些开源的图像与视频生成模型。虽然效果上还没那么惊艳&#xff0c;但还是值得我们体验与学习下的。 Stable Diffu…

深度学习-基于机器学习的情绪分析研究

概要 互联网技术的迅速发展使得社交平台逐渐成为热点事件中社会情感的枢纽。社会热点事件的舆论监管的其中一个重要环节就是能够准确分析民众的社会情绪。本文旨在探索可以基于文本大数据彻底分析民众对热点事件的社会情绪的模型和方法。先是从社交平台上借助文本大数据、对数据…

计算机网络 |内网穿透

其实内网穿透&#xff0c;也挺好玩的&#xff0c;如果在大学的时候&#xff0c;那个时候讲计算机网络的老师能横向延展&#xff0c;估计课也会更有趣不少&#xff0c;本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说&#xff0c;怪可惜的 回到正题&#xff0c;内网…

【Stable Diffusion】入门-04:不同模型分类+代表作品+常用下载网站+使用技巧

目录 1 模型简介2 模型文件构成和加载位置2.1 存储位置2.2 加载模型 3 模型下载渠道3.1 HuggingFace3.2 Civitai 4 模型分类4.1 二次元模型4.2 写实模型4.3 2.5D模型 1 模型简介 拿图片给模型训练的这个过程&#xff0c;通常被叫做“喂图”。模型学习的内容不仅包括对具体事物…

数据结构的概念大合集03(栈)

概念大合集03 1、栈1.1 栈的定义和特点1.2 栈的基础操作1.3 栈的顺序存储1.3.1 顺序栈1.3.2 栈空&#xff0c;栈满&#xff0c;进栈&#xff0c;出栈的基本思想1.3.3 共享栈1.3.3.1 共享栈的4要素 1.4 栈的链式存储1.4.1 链栈的实现1.4.2 链栈的4个要素 1、栈 1.1 栈的定义和特…

客户端:Vue3,服务端:Node,基于Socket.IO实现单聊的功能

目录 1.介绍 2.环境搭建 3.本功能实现的主要逻辑 4.客户端和服务端的主要代码 5.效果展示 6.socket.io的运作原理 1.介绍 本篇主要讲讲基于Socket.IO实现单聊功能的主要实现&#xff0c;包括了客户端和服务端Node。 在这个即时通讯无处不在的时代&#xff0c;实时聊天功能…