概述
为什么标题有个“最”字呢?因为这篇文章涉及的是矩阵的最基本最基本运算,如矩阵乘。不会讲到太多矩阵的内容,后面慢慢学慢慢讲嘛,但是在开始学之前你最起码得知道矩阵的最基本运算吧,要知道深度学习的数学原理是以矩阵运算为基石的。而numpy库,是我们以后编写代码必须会用到的,它封装了几乎所有的矩阵的运算。如果你之前对这些都很熟悉了,那大可可以跳过这一节咯~
内容简介
矩阵的最基本运算
矩阵的运算规律
python的numpy库的简单使用
矩阵的最基本运算
我们把由m×n个数排成的m行n列的数表称为一个m行n列的矩阵,如图1所示(打公式真的好累...):
图1
这个m和n可以是大于等于1的任何一个整数。
特别地,有一些矩阵只有一行,也就是1行n列,我们称为行矩阵或行向量,形如图2所示:
图2
有一些矩阵只有一列,也就是n行1列,我们称为列矩阵或列向量,形如图3所示:
图3
而有些矩阵只有1行1列,那它就可以看作是一个数了~
接下来我要讲矩阵的数乘运算和加减乘运算。
先是矩阵的数乘运算:
设有一个数
和一个矩阵
,那么数
乘以矩阵
记作
,它的值如下:
图4
不就是以数
乘以矩阵
的各个元素嘛~
然后是矩阵的加法运算:
图5
没错,就是简单的两个矩阵间逐元素相加嘛~
至于矩阵减法,如矩阵
,可以看作是
,也就是两个矩阵间逐元素相减嘛,跟矩阵加一个道理~
但我们也可以看到,两个矩阵间能够进行加减运算,这两个矩阵必须是同型的,也就是说两个矩阵的行数列数均相等。
最后说说矩阵相乘:
先举个栗子,才不至于讲懵:
图6
哇,看起来好复杂啊,但仔细一看,有没有发现什么规律呢?实际上
的第i行、第j列的元素就是矩阵
的第i行各个元素依次乘以矩阵
的第j列的各个元素并相加嘛~
那我再举个实际的具体栗子,你们大概就能懂(我不太喜欢纯讲理论,喜欢举例子):
图7
怎样,是不是懂了?矩阵相乘可不是两个矩阵逐元素相乘了哦~
我们也可以看出,只有第一个矩阵的列数等于第二个矩阵的行数时,两个矩阵才能相乘,得到的矩阵是以第一个矩阵的行数为行数、第二个矩阵的列数为列数的矩阵~
例如:A矩阵是m行s列的矩阵,B矩阵是s行n列的矩阵,两个矩阵相乘,得到一个m行n列的矩阵。
我再举几个特殊的例子,因为这些特殊的例子在今后神经网络的学习中经常遇到~
第一个例子:当A矩阵是一个1行s列的行矩阵。B矩阵是一个s行n列的矩阵时,两个矩阵相乘,得到一个1行n列的矩阵:
图8
第二个例子:当矩阵A是一个1行s列的行矩阵。矩阵B是一个s行1列的列矩阵时,两个矩阵相乘,得到一个数:
图9
第三个例子:当矩阵A是一个m行1列的列矩阵,矩阵B是一个1行n列的行矩阵时,两个矩阵相乘,得到一个m行n列的矩阵:
图10
说到这里,大家肯定也注意到了矩阵
乘以矩阵
不等于矩阵
乘以矩阵
,即:
图11
OK,矩阵的加减乘运算我讲完了,接下来我讲最后一个运算,矩阵的转置:
设矩阵
,它的转置矩阵记作
:
图12
可以看到,一个矩阵的转置也就是把它的第i行变成它的第i列。具体到元素级别来说,就是原本第i行第j列的值变为了第j行第i列的值了~
一个m行n列的矩阵,转置后变为一个n行m列的矩阵。
一个行矩阵转置后变为一个列矩阵。列矩阵转置后变为一个行矩阵。
矩阵的最基本运算规律
先是矩阵的加减法的运算规律:
设矩阵
和矩阵
均是一个m行n列的矩阵,那么:
(1)
(2)
然后是矩阵的相乘的运算规律:
设矩阵
是一个m行s列矩阵,矩阵
是一个s行n列矩阵,矩阵
是一个n行任意列矩阵,那么:
(1)
设矩阵
是一个m行s列矩阵,矩阵
和矩阵
是一个s行n列矩阵,
是一个数,那么:
(2)
(3)
再设矩阵
和
是一个m行s列矩阵,矩阵
是一个s行n列矩阵,那么:
(4)
哎呀,你只需记住上面每个公式就行了,不用记住假设,我的假设都是设下面的公式中列出的矩阵相乘符合定义、能够相乘的情况下。
设矩阵
是矩阵
的转置矩阵,那么:
(1)
(2)
(3)
(4)
OK,矩阵的最基本运算和矩阵的基本运算规律我介绍完了!(小编,有没有搞错,就这么点?!)是的,没错,就这么点。就这么点就能够让你开始入门深度学习了。当然啦,这只是让你能够入门深度学习的最最最基本数学储备而已啦,没有这些你来起步都不能。后来我们讲到一些,会继续说一些的,矩阵的运算和分析是一门很深的学问,好几本书都写不完的~
python的numpy库的简单使用
哈哈哈哈,终于讲到这了对吧,不用码一大堆枯燥的数学公式了~
也辛苦读者居然能坚持到这了,相信接下来讲的是非常有意思和有趣的东西,大家别睡啦,起来吧,这个部分并不催眠咯~
首先,numpy(Numerical Python的简称)是Python数值计算最重要的基础包。python中大多数提供科学计算的包都是用numpy的数组作为构建基础。
我再次说明哦,我们要使用python3,不要使用python2啦,这都什么年代了~我推荐使用python3.6版本或3.5版本,因为这两个版本比较新,而且支持tensorflow、keras。我前几个星期看了下,貌似现在3.7版本还不能安装tensorflow。我默认大家都会点python基础语法啦,如果还没安装过python,呃....直接去官网下载安装就行了,我这文章当然不会教你怎么安装python,然后怎么用它运行它,上网搜一大堆~
如果之前没用过numpy库,没安装过。那么要使用numpy库,我们我们得先安装它:
ok,安装完毕后我们就正式开始学习它吧~
我的演示代码运行在jupyter notebook上,使用它之前我们要先导入它:
先声明下,下面我们学的这些事今后我们编代码时的基础,会经常用到,但我先不讲太深入,领大家入门python科学计算先~
创建ndarray对象
numpy中的数组是以ndarrray为对象的类型。
创建数组最简单的办法就是使用array函数。它接受一切序列型的对象(包括列表、集合等等),然后产生一个新的含有传入数据的numpy数组。以一个列表的转换为例:
如果想创建一个矩阵呢?我们知道矩阵是二维的,有行和列,我们传入一个嵌套列表就可以了~
使用ndarry对象的ndim属性和shape属性可分别查看它的维度和形状:
使用ndarry对象的dtype属性能够查看这个对象里的元素的数据类型:
如果我们要创建一个指定形状的全零数组或者全1数组,亦或者指定形状的空数组呢?
那如果我更进一步,要用指定初始值、结束值和步长的数列来填充指定形状的数组呢?(如1,2,3,4,5的初始值为1,终止值为5,步长为1)。我们会用到numpy的arange方法,它和python内置的range方法用法几乎一样,不过它返回ndarray对象。我们还会用到ndarray对象的reshape方法,它可以把数组转为换任意形状(默认为按行优先,看个例子就知道了):
那我们继续得寸进尺一波,我就想用一些散乱的随机数填充创建的指定形状数组呢?可以用numpy.random里的randn方法:
好吧,我们最后再任性一波,我就是想用一个指定值来填充创建的指定形状的数组呢?可以用ndarray对象的full方法:
指定ndarray数据类型
ndarray对象可以指定很多数据类型,相当灵活。主要有的数据类型,我在网上找了一张图片来概括:
图13
图13续
如果是小白的话,是不是看得眼花缭乱,不知所措呢?
没关系,慢慢来,以后做多了就体会了~现在心里先对它们大致有个印象~
要修改ndarray对象里的元素的数据类型,可以使用ndarray对象的astype方法:
当然,也可以在创建ndarray对象时就给它指定一个数据类型,如果不指定的话,会默认给一个数据类型的:
ndarray对象的索引操作
ndarray对象的索引操作甚至比python内置的列表这些数据类型要灵活得多!
先从最基本的它的元素取值开始吧:
ndarray对象可以使用python的内置数据类型,如列表的所有索引方法:
好啦好啦,关于这种常规的索引操作我不说过多,因为它跟python内置的可迭代数据类型索引方式是一样的,我来说点ndarray对象的与众不同的索引方式吧!前方高能哦~
如你所加哦,它会把arr中第2到4行(不包括第4行)的所有元素都赋值为10。这其实就涉及到了numpy中一个很高级的机制---广播机制。但我不打算详解广播机制,因为它实际上很复杂,我现在只是先领大家入门而已嘛~以后有时间来写写numpy中一些常见的高级用法。
OK,加了个分割线,我们再来看看ndarray对象的索引中非常非常厉害的布尔值索引!!!
如你所见,它把arr中所有大于10的元素全取出来,组成一个一维ndarray对象。
再看一个例子:
假如我们的names这个数组中的各个名字依次对应着data中的每一行。那么,我想取出所有名字为peihuangwu的人在data数组中对应的行怎么办呢?只需要这么做:
把上面这个语句拆分出来看就是:
我们还可以对它这么操作:
我们还可以使用布尔索引来给数组赋值:
再加一个分割线,我们再来看看ndarray的另一种索引方式:
如你所见,它会取出arr中第0、2、3行的所有元素。
你肯定以为如果我要取出arr中第0、2、3行,且第2、4列的所有元素可以用arr=[[0, 2, 3], [2, 4]]对吧?那就大错特错了!我们来看看:
实际上我们应该这么写:
那么为什么刚刚那样写就是错的呢?看看下面这个栗子就知道啦~
上面这个语句的意思是,取第0行第1列、第2行第2列、第3行第3列的所有元素,现在知道刚刚为什么错了吧?(好吧,我也觉得numpy这样的设计很奇怪)~
ndarray对象的运算
又来到一个很有意思很让人激动的部分了,就是ndarray对象的运算~
啥也不说了,直接上一些普通的栗子吧:
看到了没,元素与数组间的运算或者大小相等的任何数组间的运算都会被应用到元素级别,或者说广播(又是广播机制咯)。(等下小编,上面怎么有俩张图片冒红呢?实际上是因为发生了除0,但是在numpy中它不会当作错误,只会当作警告而已。然后用"nan"(想在程序里用到它得写为np.nan)和"inf"分别填充一般的0除错误和无穷大的数,不会中断程序~呃,inf还能理解,那为啥叫nan呢?nan是英语not a number的缩写)。
ndarray对象的转置
上文在讲解矩阵那块中不是提到了矩阵嘛~来结合numpy来看吧!我们先不考虑一维或者大于等于三维的那些ndarray对象吧,因为它们也类似!我们只来看二维的,因为二维的我们可以把它看作矩阵,刚好跟上文中讲的矩阵的转置联系起来~
矩阵转置
行矩阵转置为列矩阵
行矩阵转置为列矩阵又转置回来
我们可以看到,只需用ndarray对象的T属性,就可以直接进行转置了,够简洁~
numpy中的函数
又到了激动人心的时刻咯~~~~~
numpy有很多函数是专门对ndarray数组进行某种特定任务运算的~
先来看一大堆栗子,然后我们再对这些函数做个总结(了结)吧~
先生成两个5行5列的随机整数矩阵:
上面的randint方法中的第一个参数表示随机整数的起始值,第二个参数表示随机整数的终止值,默认步长为1,生成的随机整数中不包括终止值。第三个参数表示要生成的数组的形状~
英语好一点的童鞋应该能凭字面意思就知道上面每个方法的意思了吧?~
OK,下面做个总结(我只说最常用的哦~实际上还有很多的,以后如果用到了我再说):
注意:一元函数意思是对数组自身做的运算,不涉及另一个数组;二元函数意思是是对两个数组之间做的运算~
建议大家把下面总结的方法都试试几遍,用几遍,也免得被我骗了啊哈哈哈哈。而且我对函数解释的也不好,可能会让你误解,哭唧唧~
一元函数
一元函数续
一元函数再续
二元函数
连接两个ndarray对象
这里我只讲一个二元函数,但为什么就值得专门开一个小标题来讲呢?因为它非常重要,在深度学习中非常常用!!!就是与众不同,很多时候都会用到,伦家才不是上面那些妖艳贱货呢(指上面那些函数)~
来看一个例子:
concatenate函数一般传入两个参数,第一个参数是由要连接的各个数组组成的列表;第二个参数是要连接的轴,可以不传入,默认值为0(对于二维数组,也即矩阵,0就是行咯,1是列):
concatenate函数也可以处理python的一些内置对象,如列表,返回的是ndarray对象(事实上上面提到的所有函数也都是这样):
事实上它也可以处理由ndarray对象和列表组成的列表:
argmax函数
呃呃呃,又专门开一个小标题来讲一个函数咯~~~~因为它在深度学习中也很重要,朕独宠concatenate和argmax哈哈哈哈~
为什么他俩常用呢?以后你们就知道了(什么?你是深度学习老鸟?求你别喷小编啦~)
argmax函数到底干啥用的呢?先看几个例子我再解释(小编,你咋这样呢?我就是这样,我觉得很多时候先解释是什么再看例子,还不如先看例子再解释是什么,然后再回头看看例子)~
结合这个函数的名字,再结合这个例子,猜得到它的功能了吗?其实它就是返回数组中最大值的那个元素的索引值。如果有多个最大值,返回的是第一个最大值的那个索引值。这个索引值是全局的索引值,索引值以0开始。比如上面这个例子,第一个最大值是第1行第0列的9,它在全局中的索引值是第5个(因为索引值从0开始),所以返回5。
那如果我们想知道每一行的最大值元素的那个索引值呢?传入参数axis=0就行了:
看到了吗?返回的数组中每个元素都是它所在行的最大值的索引,这个索引就是相对于它所在行而言的了,不再是全局的了~
如果我们想知道每一列的最大值元素的那个索引值呢?传入参数axis=1就行了:
同样,这个函数也能用来处理python内置的列表类型:
呼呼~~~~为什么我说这俩个函数很重要呢?我可不是骗你们~以后在讲到循环神经网络时会经常涉及到滑动窗口机制,那concatenate函数就派上用场了。以后在一些分类问题中,会涉及到one-hot编码等等,这时候通常会将模型输出结果用argmax这个函数转换为模型最终预测的那个索引值~
再悄悄跟你们说(如果你们知道,就无视这句话哈),线性代数方面的很多运算,都能在numpy的linalg下找到相应的函数~不过我不是先带大家入门再说嘛?大家如果掌握了上面我说的这些,差不多就具备入门的基础了,以后更宽阔的知识海洋。。。。呃,用到的时候我再讲了!
哈哈哈哈,总算这一节总算讲完了~~~~~~~~开森!!!打公式很累的~~~
下节预告
下一节我就开始讲如何安装环境了~~~~
下一节课过后大家开始正式入门深度学习~~~(大家?小编你有没有搞错,总共不超过3个人看你的文章,大家还是可怜你才来瞅几眼的,把你给能的!)
切,没人看就没人看呗,我写给我自己欣赏也行哈哈哈哈哈哈,不然憋着难受(好饿啊,总算可以去吃饭了!!!)。
最后
以上就是高大短靴为你收集整理的python如何创建不同元素的矩阵_深度学习探索之旅--第二章:第一节-矩阵的最基本运算与Python的numpy库简单使用...的全部内容,希望文章能够帮你解决python如何创建不同元素的矩阵_深度学习探索之旅--第二章:第一节-矩阵的最基本运算与Python的numpy库简单使用...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复