【机器学习-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://xiahunao.cn/news/2869630.html

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

相关文章

Mysql:行锁,间隙锁,next-key锁?

注:以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1:只加了一行写锁,锁住要修改的这一行。语义问题数据一致性问题 猜想2:要修改的这一行加写锁,扫描过程中遇到其它行加读锁猜想3:要修改的这一行加写锁&…

BigDecimal保留两位小数失败问题

文章目录 背景问题解决如何测试代码 背景 测试时发现在线swagger测试会自动处理BigDecimal小数点后面的数字,就是有零的会都给你去掉,比如9.000与9.500到最后都会被swagger处理成9跟9.5。使用postman测是最准的,测出来的就是9.000跟9.500。 …

react可视化编辑器 第一章 拖拽

效果: 实现可视化编辑器,第一步难点 是 拖拽 提示:链接和图片默认是可拖动的,不需要draggable属性。 在拖放操作的不同阶段使用并可能发生许多事件属性: 在可拖动目标上触发的事件(源元素)&a…

【渗透测试】redis漏洞利用

redis安装及配置 wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make cp /root/redis-6.2.6/redis.conf /usr/local/redis/bin/ cd /usr/local/redis/bin/ vi redis.conf #修改内容如下: #protected-mode …

数据结构的概念大合集04(队列)

概念大合集04 1、队列1.1 队列的定义1.2队列的顺序存储1.2.1 顺序队1.2.2 顺序队的基本运算的基本思想1.2.3 顺序队的4要素的基本思想 1.3 环形队列1.3.1 环形队列的定义1.3.1 环形队列的实现 1.4 队列的链式存储1.4.1 链队1.4.2 链队的实现方式1.4.3 链队的4要素的基本思想 1.…

开发环境热部署:2021版IDEA没有compiler.automake.allow.when.app.running

解决办法:Settings--> Advanced Settings -->Compiler勾选上

科研学习|论文解读——了解在线环境中的多数观点形成过程:Facebook的探索性方法(IPM, 2018)

论文标题 Understanding the majority opinion formation process in online environments: An exploratory approach to Facebook 摘要 在在线社区的社会互动过程中,多数观点经常被观察到,但很少有研究用实证数据来解决这一问题。为了确定一个合适的理论…

Ubuntu 虚拟机安装

最小化安装后常用工具 sudo apt-get install vim# ifconfig apt install net-tools # nload apt install nload # 很多都要用到 apt install build-essential # 开发相关 apt install gcc gapt install iproute2 ntpdate tcpdump telnet traceroute \ nfs-kernel-server nfs…

刚刚离乳的幼猫该如何选择猫粮品牌?

亲爱的猫友们,当你家的幼猫刚刚离乳,准备踏入猫粮的世界时,如何选择一款合适的猫粮品牌确实是个让人头疼的问题。🐾 别担心,今天我就来为大家推荐一款值得信赖的幼猫粮——福派斯幼猫粮。 1️⃣ 考虑幼猫的营养需求 幼…

前端 - 笔记 - JavaScript - WebAPI【DOM + 事件类型 + Date+ 节点操作 + window + 本地存储 + 正则表达式】

前言 Web API:是一套操作 网页内容(DOM) 与 浏览器窗口(BOM) 的 对象; API:就是一些预定义好的方法,这些方法可以实现特定的功能,开发人员可以直接使用;Web …

Day66:WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 JavaSec搭建 Hello-Java-Sec搭建 Java安全-SQL注入-JDBC&MyBatis Java安全-XXE注入-Reader&Builder Java安全-SSTI模版-Thymeleaf&URL Java安全-SPEL表达式-SpringBoot框架 知识点: 1、Java安全-SQL注入-JDBC&MyBatis 2、Java安全-XXE注…

Vue 项目安装依赖提示core-js版本低的处理办法

core-js2.6.12: core-js<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js3. 我是下载一个老的项目&#xff0c;npm install之后提示上面的错误&#xff1b;本…

通用的springboot web jar包执行脚本,释放端口并执行jar包

1、通用的springboot web jar包执行脚本&#xff0c;释放端口并执行jar包&#xff1a; #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/data/yitu-projects/yitu-xzhq/sftp # 服务名称。同时约定部署服务的 jar 包名字也为它。 SERVER_NAMEyitu-server # 环境…

Tuxera NTFS 2023安装使用教程 Tuxera NTFS破解版 Tuxera NTFS for Mac优惠

对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说&#xff0c;跨平台不兼容一直是一个巨大的障碍&#xff0c;尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题&#xff0c;很多朋友会选择很便捷…

【安全类书籍-3】XSS跨站脚剖析与防御

目录 内容简介 作用 下载地址 内容简介 这本书涵盖以下几点: XSS攻击原理:解释XSS是如何利用Web应用未能有效过滤用户输入的缺陷,将恶意脚本注入到网页中,当其他用户访问时被执行,实现攻击者的目的,例如窃取用户会话凭证、实施钓鱼攻击等。 XSS分类:分为存储型XSS(…

R统计学3 - 数据分析入门问题41-60

往期R统计学文章: R统计学1 - 基础操作入门问题1-20 R统计学2 - 数据分析入门问题21-40 41. R 语言如何做双坐标图? # 创建模拟数据 year <- 2014:2024 gdp <- data.frame(year, GDP = sort(rnorm(11, 1000, 100))) ur <- data.frame(year, UR = rnorm(11, 5, 1…

[沉淀之华] 自研基于SpringBoot Mybaits 构建低代码数据治理脚手架分享:涵盖数据同步、数据比对、数据归档、数据恢复为一体

文章目录 成果演示背景整体能力功能描述相关细节安装使用 成果演示 Github地址&#xff1a;数据治理脚手架 wiki&#xff1a;kg-ctl-core使用文档 背景 为什么要做这个&#xff1f; 一个老生常谈且不得不谈问题&#xff1a;随着业务日益发展&#xff0c;如果不做数据迁移&…

双指针、bfs与图论

1238. 日志统计 - AcWing题库 import java.util.*;class PII implements Comparable<PII>{int x, y;public PII(int x, int y){this.x x;this.y y;}public int compareTo(PII o){return Integer.compare(x, o.x);} }public class Main{static int N 100010, D, K;st…

solr/ES 分词插件Jcseg设置自定义词库

步骤&#xff1a; 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置&#xff1a; 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径&#xff0c;我们这个配置可以自定义&#xf…

Qt教程 — 3.3 深入了解Qt 控件:Input Widgets部件(2)

目录 1 Input Widgets简介 2 如何使用Input Widgets部件 2.1 QSpinBox组件-窗口背景不透明调节器 2.2 DoubleSpinBox 组件-来调节程序窗口的整体大小 2.3 QTimeEdit、QDateEdit、QDateTimeEdit组件-编辑日期和时间的小部件 Input Widgets部件部件较多&#xff0c;将分为三…