机器学习中的线性代数(1):矩阵的基本运算、NumPy库

文章目录

  • 矩阵定义
    • 定义
    • 用NumPy库创建数组、矩阵
      • array
      • mat
  • 矩阵加减
    • 定义
    • 代码实现
  • 矩阵乘法
    • 数与矩阵相乘
    • 矩阵与矩阵相乘
    • 代码实现
      • np.multiply
      • np.matmul 和 np.dot
      • @ 和 *
    • 线性方程
  • 矩阵的逆
    • 报错?
  • 矩阵转置
  • NumPy库的一些补充
    • zeros / ones
    • eye

矩阵定义

定义

在《线性代数》教材中,矩阵的定义如下:
由m*n个数aij (i = 1,2,…,m;j = 1,2,…,n)排成的m行n列的数表
机器学习中的线性代数(1):矩阵的基本运算、NumPy库_第1张图片
称为m行n列矩阵,简称m * n矩阵。为了表示他是一个整体,总是加一个括弧,并用大写黑体字母表示它,记作
机器学习中的线性代数(1):矩阵的基本运算、NumPy库_第2张图片
这m * n个数称为矩阵A的元素,数aij位于矩阵A的第i行第j列。

用NumPy库创建数组、矩阵

array

  • 一维数组

不额外说明的话,默认的起点是0,步长为1

>>> import numpy as np
>>> a = np.arange(9)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

>>> type(a)
<class 'numpy.ndarray'>

起点与步长也可以自行设定,比如:

>>> import numpy as np
>>> a = np.arange(1,9,2)
>>> a
array([1, 3, 5, 7])

其中,1为起点,9位终点,为步长。

  • 自定义多维数组
>>> import numpy as np
>>> a = np.array([ [1,2,3],[4,5,6],[7,8,9] ])
>>> a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> type(a)
<class 'numpy.ndarray'>  

也可以用reshape将一维数组转化为多维

>>> b = np.arange(9).reshape(3,3)
>>> b
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

mat

像前文那样定义好数组以后,我们就能以此创建矩阵了。

>>> import numpy as np
>>> b = np.arange(9).reshape(3,3)
>>> B = np.mat(b)
>>> B
matrix([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])

这个矩阵B就是一个3*3维度的矩阵。

矩阵加减

定义

对应元素相加减。不过仅维度相同的矩阵才能相加减
在这里插入图片描述

代码实现

# A和B是已经创建好的矩阵
>>> A
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
>>> B
matrix([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])
>>> A+B
matrix([[ 1,  3,  5],
        [ 7,  9, 11],
        [13, 15, 17]])

减法也是同理的

矩阵乘法

数与矩阵相乘

矩阵的每个元素都乘以这个数

>>> C = 2*A
>>> C
matrix([[ 2,  4,  6],
        [ 8, 10, 12],
        [14, 16, 18]])

矩阵与矩阵相乘

矩阵与矩阵相乘的意义这里不再详细描述,这里仅介绍其计算的方法:
机器学习中的线性代数(1):矩阵的基本运算、NumPy库_第3张图片
第一个矩阵的第 x 行所有元素,分别与第二个矩阵第 y 列的所有元素相乘求和,就构成了新矩阵的第 x 行第 y 列的元素
在这里插入图片描述
必须注意:只有当左矩阵的列数等于右矩阵的行数时,两个矩阵才能相乘。
m * n的矩阵乘以n * m的矩阵,会产生一个m * o的矩阵

代码实现

依然是已经定义好的A和B矩阵

>>> A
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
>>> B
matrix([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])

在矩阵相乘时,有以下几种基本的方法:

np.multiply

>>> np.multiply(A,B)
matrix([[ 0,  2,  6],
        [12, 20, 30],
        [42, 56, 72]])

multiply是直接将对应的元素相乘作为新的元素,而不是把行/列相乘求和

np.matmul 和 np.dot

>>> np.matmul(A,B)
matrix([[ 24,  30,  36],
        [ 51,  66,  81],
        [ 78, 102, 126]])
>>> np.dot(A,B)
matrix([[ 24,  30,  36],
        [ 51,  66,  81],
        [ 78, 102, 126]])

二者的用法在高维度计算时略有不同,这里不作过多描述

@ 和 *

对于矩阵来说,二者几乎没有什么区别:

>>> A*B
matrix([[ 24,  30,  36],
        [ 51,  66,  81],
        [ 78, 102, 126]])
>>> A@B
matrix([[ 24,  30,  36],
        [ 51,  66,  81],
        [ 78, 102, 126]])

但是对于数组:

>>> a*b
array([[ 0,  2,  6],
       [12, 20, 30],
       [42, 56, 72]])
>>> a@b
array([[ 24,  30,  36],
       [ 51,  66,  81],
       [ 78, 102, 126]])

这时候我们再看前文提到的multiply:

>>> np.multiply(A,B)
matrix([[ 0,  2,  6],
        [12, 20, 30],
        [42, 56, 72]])

可知,数组的*与multiply输出结果是相同的

线性方程

在机器学习(1).中,我曾简略地提到了线性方程的内容。
假定我已经得到了一个线性方程:f(x) = 0.5 + 2x
现在我有一组xt分别等于 2、4、6、8,我们需要用线性方程来预测x分别等于2468时,y的值:
机器学习中的线性代数(1):矩阵的基本运算、NumPy库_第4张图片
这时我们就可以用矩阵来计算出4组数据:
机器学习中的线性代数(1):矩阵的基本运算、NumPy库_第5张图片
当我们有多条线性回归方程时也可以用同样的方法来计算:
机器学习中的线性代数(1):矩阵的基本运算、NumPy库_第6张图片

矩阵的逆

逆的意义和应用会在机器学习系列更新中用到的时候再单独讲,这里仅了解怎么求逆即可

我们可以对矩阵对象直接用 .I 来求逆,非常方便:

>>> A.I
matrix([[ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15],
        [-6.30503948e+15,  1.26100790e+16, -6.30503948e+15],
        [ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15]])

报错?

AttributeError: ‘numpy.ndarray’ object has no attribute ‘I’
这种报错往往是因为我们想要求逆的对象不是矩阵

>>> c = np.array([ [1,2,3],[4,5,6],[7,8,9] ])
>>> c
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> c.I
Traceback (most recent call last):
  File "", line 1, in <module>
    c.I
AttributeError: 'numpy.ndarray' object has no attribute 'I'
  • 解决办法: 用np.mat()转为矩阵。
>>> C = np.mat(c)
>>> C
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
>>> C.I
matrix([[ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15],
        [-6.30503948e+15,  1.26100790e+16, -6.30503948e+15],
        [ 3.15251974e+15, -6.30503948e+15,  3.15251974e+15]])

矩阵转置

转置的意思就是把行换为列,列再换为行,即aij —— aji。
转置的意义和应用会在机器学习系列更新中用到的时候再单独讲,这里仅了解怎么求转置即可

>>> C
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

>>> C.T
matrix([[1, 4, 7],
        [2, 5, 8],
        [3, 6, 9]])

NumPy库的一些补充

zeros / ones

zeros是创建一个元素都为0的矩阵,这样的矩阵也叫零矩阵。

>>> np.zeros((3,3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

ones则是创建一个元素都为1的矩阵。

>>> np.ones((3,3))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

eye

eye创建了一个单位矩阵:

>>> np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

这期内容是对线性代数知识的一些补充,下周发布机器学习第二期/doge
我是康.,希望做一名能帮助到各位的博主!机器学习系列刚刚开坑,请多指教!
除了机器学习,我偶尔还会做一些单片机/嵌入式、Python相关的文章,欢迎感兴趣的小伙伴与我共同学习,一起进步!

你可能感兴趣的:(机器学习,numpy,线性代数,机器学习,python)