机器学习对数学的要求高吗?
这取决于你要干什么。如果想从根本上理解优化过程,改进优化算法,我可以很负责任地告诉你,很高,这是毋庸置疑的,这些算法都是很多人工作几年的成果,没点技术含量肯定是站不稳的。但是如果只是想单纯地用这些算法去完成一些任务呢,其实不高,这也是我们大多数人学习机器学习的目的。既然这样,今天就从运用、实现的角度来看,想要很好地掌握算法运行的过程,很好地理解代码编写的过程需要哪些数学知识吧。
涉及多维参数的时候,使用矩阵和向量的形式不仅能使书面表述变得简洁,还能加快代码运行的速度。
首先看定义,一个i行j列的矩阵a长这个样子:
向量是特殊的矩阵,就是只有一列的矩阵,一个i维向量b长这个样子:
那么在下面的内容里我就把矩阵和向量统称为矩阵啦。
直观一点,大家可以把矩阵和向量看成是我们定义的一种数据结构,对于这个结构呢,有以下几种运算:
1. 矩阵相乘
矩阵相乘运算是这样的:
一个3行4列的矩阵a乘4行2列的矩阵b,得到3行2列的矩阵c:
他们之间的关系是:
c11= a11*b11+ a12*b21+ a13*b31+ a14*b41
也就是说a的第i行的每个数值乘b的第j列对应的每个数值得到新的矩阵c的元素cij。
由此我们也可以知道,乘号左边的矩阵列数应该和乘号右边的矩阵行数相等,这样两个矩阵才能相乘,这就导致矩阵的乘法是有顺序的,乘号左右不能随意颠倒。
那么在python中,我们一般使用numpy包中的函数对矩阵进行运算,首先是建立矩阵:
将numpy包导入并重命名为np,使用np包中的np.array()函数建立矩阵,注意括号中的元素要用方括号括起来,每一行的数据也要用方括号括起来,元素之间用逗号分隔。
a.shape可以查看a的形状,也就是行数和列数:
同样地,建立矩阵b:
这样的话a就是一个2×2的矩阵,b是一个2×3的矩阵,满足做积的条件,我们可以对他们进行矩阵的乘积运算:
用到的函数呢是np.dot(),注意两个矩阵的顺序不能写反,否则会报错:
表示要做积的两个矩阵形状不满足要求。
2. 矩阵元素相乘
矩阵元素相乘就是指两个形状一样(行列数一样)的矩阵,对应的元素相乘,得到的结果仍为相同形状的一个矩阵。
在python里直接用乘号连接两个矩阵就表示矩阵元素对应相乘:
值得注意的是,只要是使用一般的运算符,python默认地就会对矩阵的每一个元素单独进行这个运算,比如求平方:
3. 矩阵相加
矩阵的加减就比较简单啦,和矩阵的对应元素相乘是一个道理的,把两个形状相同的矩阵对应元素执行加或减运算就可以啦,在python里的实现也比较容易:
Ps:对于一般的+-*/来说,python会有一种自动扩展的机制,什么意思呢,比如有一个矩阵要和一个常数进行运算时,常数会被自动拓展为相同形状的矩阵:
另外一种会自动拓展的情况是一个矩阵和一个单列或者单行的矩阵(单列的矩阵叫做列向量,单行的矩阵叫做行向量)进行运算,并且矩阵的行数和列向量(或矩阵的列数与行向量)的维度相同:
如果不能自动扩展,会提示错误:
4. 矩阵转置
矩阵的转置是指把原来矩阵的行转换为转换后的列,之前的列作为转换后的行,直接用代码来演示吧:
其中a.T就表示矩阵a的转置。
前面已经提到过,矩阵的形式不仅看起来简洁,对运算效率已有提升,向量乘积的定义可以帮助我们减少代码中循环的次数,大大降低代码的时间复杂度,这一点大家会在之后的神经网络算法中有所体会,我也会展示给大家看的!当然大家可以回头看一下之前的算法里用到的矩阵运算,可以帮助大家更好地理解矩阵运算在算法中的应用。
本来想一次想把导数也写在这一期,感觉东西有点多啦,所以就分成两期来写吧,正好附上一些对矩阵的切片操作:
切片就是从矩阵中取部分数据的方法,直接写代码,大家直观上感受就可以啦:
需要注意的是下标使从0开始的,如果越界的话就会得到像我上边遇到的那样的异常提示啦,其中“a[:,1]”大家可以这么理解,我要得到的是a的所有行和第一列,其实也就是我们俗称的第一列的数据。
python常用的函数当然是还有很多,大家遇到问题可以查文档,当然如果不想查文档直接百度或者直接后台问我也是可以的!
领取专属 10元无门槛券
私享最新 技术干货