在《线性代数》教材中,矩阵的定义如下:
由m*n个数aij (i = 1,2,…,m;j = 1,2,…,n)排成的m行n列的数表
称为m行n列矩阵,简称m * n矩阵。为了表示他是一个整体,总是加一个括弧,并用大写黑体字母表示它,记作
这m * n个数称为矩阵A的元素,数aij位于矩阵A的第i行第j列。
不额外说明的话,默认的起点是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]])
像前文那样定义好数组以后,我们就能以此创建矩阵了。
>>> 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]])
矩阵与矩阵相乘的意义这里不再详细描述,这里仅介绍其计算的方法:
第一个矩阵的第 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(A,B)
matrix([[ 0, 2, 6],
[12, 20, 30],
[42, 56, 72]])
multiply是直接将对应的元素相乘作为新的元素,而不是把行/列相乘求和
>>> 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的值:
这时我们就可以用矩阵来计算出4组数据:
当我们有多条线性回归方程时也可以用同样的方法来计算:
逆的意义和应用会在机器学习系列更新中用到的时候再单独讲,这里仅了解怎么求逆即可
我们可以对矩阵对象直接用 .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'
>>> 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]])
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创建了一个单位矩阵:
>>> np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
这期内容是对线性代数知识的一些补充,下周发布机器学习第二期/doge
我是康.,希望做一名能帮助到各位的博主!机器学习系列刚刚开坑,请多指教!
除了机器学习,我偶尔还会做一些单片机/嵌入式、Python相关的文章,欢迎感兴趣的小伙伴与我共同学习,一起进步!