NumPy解释线性代数

熵桥流沙
• 阅读 1701

作者|Soner Yıldırım
编译|VK
来源|Towards Data Science

NumPy解释线性代数

机器学习和深度学习模型需要大量的数据。它们的性能在很大程度上取决于数据量。因此,我们倾向于收集尽可能多的数据,以建立一个稳健和准确的模型。数据以多种不同的格式收集,从数字到图像,从文本到声波。然而,我们需要将数据转换为数字以便对其进行分析和建模。

仅仅将数据转换为标量(单个数字)是不够的。随着数据量的增加,使用标量的操作开始变得低效。我们需要向量化或矩阵运算来有效地进行计算。这就是线性代数发挥作用的地方。

线性代数是数据科学领域的重要课题之一。在这篇文章中,我们将通过使用NumPy的例子来介绍线性代数的基本概念。

NumPy是Python的一个科学计算库,是许多库(比如Pandas)的基础。

线性代数中的对象类型

线性代数中的对象(或数据结构)类型:

  • 标量:单个数字
  • 向量:数字数组
  • 矩阵:二维数字数组
  • 张量:N>2的N维数列

标量就是一个数字。我们将在下面的示例中看到,它可以用于向量化操作。

向量是一组数字。例如,5个元素的向量:

NumPy解释线性代数

我们可以在向量化运算中使用标量。对向量的每个元素执行指定的操作。例如

NumPy解释线性代数

矩阵是二维向量

NumPy解释线性代数

它看起来像是一个包含行和列的pandas数据框。实际上,pandas数据帧被转换成矩阵,然后输入到机器学习模型中。

张量是一个N维数数组,其中N大于2。张量主要用于输入数据为三维的深度学习模型。

NumPy解释线性代数

很难用数字来表示,但是可以把T看成3个3x2形状的矩阵。

shape方法可用于检查numpy数组的形状。

NumPy解释线性代数

数组的大小是通过乘以每个维度的大小来计算的。

NumPy解释线性代数


常用矩阵术语

如果行数等于列数,矩阵称为方阵。因此,上面的矩阵A是一个方阵。

单位矩阵,表示为I,是一个方阵,对角线上有是,其他位置全是0。NumPy的identity函数可以用来创建任意大小的单位矩阵。

NumPy解释线性代数

一个单位矩阵的特殊之处在于矩阵乘上它不会改变。从这个意义上讲,它与实数中的数字1相似。我们将在这篇文章的矩阵乘法部分用单位矩阵做例子。

矩阵的逆矩阵是与原始矩阵相乘得到单位矩阵的矩阵。

NumPy解释线性代数

不是每个矩阵都有一个逆矩阵。如果矩阵A有一个逆矩阵,那么它被称为可逆或非奇异


点乘与矩阵乘法

点乘和矩阵乘法是复杂机器学习和深度学习模型的组成部分,因此对它们进行全面的了解是非常有价值的。

两个向量的点积是元素相对于其位置的乘积之和。第一个向量的第一个元素乘以第二个向量的第一个元素,依此类推。这些积的和就是点积。在NumPy中计算点积的函数是dot()

让我们首先以numpy数组的形式创建两个简单的向量并计算点积。

NumPy解释线性代数

点积计算为(1*2)+(2*4)+(3*6),即28。

因为我们在相同的位置相乘,所以这两个向量的长度必须相同才能得到点积。

在数据科学领域,我们主要处理矩阵。矩阵是一组以结构化方式组合的行和列向量。因此,两个矩阵的相乘涉及向量的许多点积运算。我们再看一些例子就会更清楚了。我们先用NumPy创建两个2x2矩阵。

NumPy解释线性代数

NumPy解释线性代数

2x2矩阵有2行2列。行和列的索引以0开头。例如,A(索引为0的行)的第一行是[4,2]的数组。A的第一列是[4,0]的数组。第一行和第一列的元素是4。

我们可以访问单个行、列或元素,如下所示:

NumPy解释线性代数

这些是理解矩阵乘法的重要概念。

两个矩阵的相乘涉及到第一个矩阵的行和第二个矩阵的列之间的点乘。第一步是A的第一行和B的第一列之间的点积。这个点积的结果是在位置[0,0](即第一行,第一列)处得到的矩阵的元素。

NumPy解释线性代数

因此,得到的矩阵C在第一行和第一列将有一个 (4*0) + (2*4) 。C[0,0]=18。

下一步是A的第一行和B的第二列的点积。

NumPy解释线性代数

C在第一行和第二列有一个(4*0)+(2*4)。C[0,1]=8。

第一行A已完成,因此我们从A的第二行开始,并遵循相同的步骤。

NumPy解释线性代数

C在第二行和第一列有一个(0*4)+(3*1)。C[1,0]=3。

最后一步是A的第二行和B的第二列之间的点积。

NumPy解释线性代数

C在第二行和第二列有一个(0*0)+(3*4)。C[1,1]=12。

我们已经看到它是如何一步一步完成的。所有这些操作都是用np.dot操作:

NumPy解释线性代数

你可能还记得,我们已经提到过,单位矩阵乘以任何矩阵时不会改变矩阵。让我们举个例子。

NumPy解释线性代数

我们还提到,当一个矩阵乘以它的逆矩阵时,结果就是单位矩阵。让我们先创建一个矩阵,然后求它的逆矩阵。我们可以利用NumPy函数linalg.inv()求矩阵的逆。

NumPy解释线性代数

用B的逆矩阵C乘以B:

NumPy解释线性代数

我们得到了单位矩阵。


正如我们在向量点积中回忆的那样,两个向量的长度必须相同才能有一个点积。矩阵乘法中的每个点积运算都必须遵循这个规则。点积是在第一个矩阵的行和第二个矩阵的列之间进行的。因此,第一个矩阵的行和第二个矩阵的列的长度必须相同。

矩阵乘法的要求是第一个矩阵的列数必须等于第二个矩阵的行数。

例如,我们可以用一个3x2矩阵乘以一个2x3矩阵。

NumPy解释线性代数

结果矩阵的形状将是3x3,因为我们对A的每一行进行3点积运算,A有3行。确定结果矩阵形状的一种简单方法是从第一个矩阵中提取行数,从第二个矩阵中提取列数:

  • 3x2和2x3相乘返回3x3
  • 3x2和2x2相乘返回3x2
  • 2x4和4x3相乘返回2x3

我们已经讨论了线性代数的基本运算。这些基本操作是复杂机器学习和深度学习模型的构建基础。在模型优化过程中,需要进行大量的矩阵乘法运算。因此,了解基础知识也是非常重要的。

谢谢你的阅读。如果你有任何反馈,请告诉我。

原文链接:https://towardsdatascience.co...

欢迎关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官方文档:
http://sklearn123.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Aidan075 Aidan075
4年前
分享5个高效的pandas函数!
熟练掌握pandas函数都能帮我们在数据分析过程中节省时间。pandas还有很多让人舒适的用法,这次就为大家介绍5个pandas函数!本文来源towardsdatascience,作者SonerYıldırım,由Python大数据分析编译。1\.explodeexplode用于将一行数据展开成多行。比如说dataframe中某一行其中一个元素包含多个同
Stella981 Stella981
3年前
28篇论文、6大主题带你一览CVPR2020研究趋势
  !(http://dingyue.ws.126.net/2020/0625/c176bdbej00qchkrg001ld200p000ang00it0080.jpg)  编译|陈大鑫  编辑|丛末  首度于线上召开的CVPR2020会议已经落下帷幕。今年,大会共有1467篇论文被接收,共举办了29个Tutorial、64
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
R语言进行Twitter数据可视化
作者|AudhiAprilliant编译|VK来源|TowardsDatasScience!(https://oscimg.oschina.net/oscnet/up864338080506c2ca3c28abec924e3d569d5.JPEG)概述对于这个项目,我们在2019年5月2829日通过爬虫来使用Twitte
Stella981 Stella981
3年前
GPU上的随机森林:比Apache Spark快2000倍
作者|AaronRichter编译|VK来源|TowardsDataScience随机森林是一种机器学习算法,以其鲁棒性、准确性和可扩展性而受到许多数据科学家的信赖。该算法通过bootstrap聚合训练出多棵决策树,然后通过集成对输出进行预测。由于其集成特征的特点,随机森林是一种可以在分布式计算环境中实现的算法。树可以在集群中跨进程和机器并