4._矩阵的乘法

矩阵乘法的视图 里会介绍更多乘法的视角。但是核心掌握下面几个就可以了

矩阵的乘法

设矩阵 A=(aij)A=\left(a_{ij}\right) 是一个 m×pm \times p 矩阵, 矩阵 B=(bij)B=\left(b_{i j}\right) 是一个 p×np \times n 矩阵, 定义矩阵 AABB 的乘积是 一个 m×nm \times n 矩阵 C=(cij)C=\left(c_{i j}\right) ,其中矩阵 C=(cij)C=\left(c_{i j}\right) 的第 ii 行第 jj 列元素 cijc_{i j} 是由矩阵 AA 的第 ii 行元素a11,a2,,apa_{11}, a_2, \cdots, a_p 与矩阵 BB 的第 jj 列相应元素 b1j,b2j,,bBb_{1 j}, b_{2 j}, \cdots, b_B 乘积之和,即

cij=k=1paikbkj=ai1b1j+ai2b2j++aipbpj.c_{i j}=\sum_{k=1}^p a_{i k} b_{k j}=a_{i 1} b_{1 j}+a_{i 2} b_{2 j}+\cdots+a_{i p} b_{p j} .

定义有点绕口,直接看例子。

矩阵乘法举例

计算

(123456)×(789101112)=\left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \times\left(\begin{array}{cc} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{array}\right)=

解:我们使用行向量视角,第一个矩阵是2×32 \times 3矩阵,第二个矩阵是3×23 \times 2矩阵,所以结果将是一个2×22 \times 2的矩阵。

c11=17+29+311=58c_{11}=1*7+2*9+3*11=58 图片

同理, c12=18+210+312=64c_{12}=1*8+2*10+3*12=64 c21=47+59+611=139c_{21}=4*7+5*9+6*11=139 c22=48+510+612=154c_{22}=4*8+5*10+6*12=154

所以,结果是

(123456)×(789101112)=(5864139154)\left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \times\left(\begin{array}{cc} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{array}\right)= \left(\begin{array}{cc} 58 & 64 \\ 139 & 154 \end{array}\right)

上面结算结果是:用第一个矩阵的行和第二个矩阵的列相乘,然后得到的结果作为结果矩阵里的元素。这种以行为主的内积运算(也称点积)虽然很容易方便(计算机)处理,但是却不利于我们人脑的理解。

我们应该拥有更高维度更清晰的视角看待矩阵——以列为主,即列向量

计算

[232437][x1x2]=[2x1+3x22x1+4x23x1+7x2]\left[\begin{array}{ll} 2 & 3 \\ 2 & 4 \\ 3 & 7 \end{array}\right]\left[\begin{array}{l} x_1 \\ x_2 \end{array}\right]=\left[\begin{array}{l} 2 x_1+3 x_2 \\ 2 x_1+4 x_2 \\ 3 x_1+7 x_2 \end{array}\right]

仔细看一下列2,你发现了什么了吗?是的,乘积的结果矩阵 相当于用x1,x2x_1,x_2 分别乘以矩阵AA的前两列,再相加。

列视角理解矩阵乘法

本课程叫做《线性代数》,核心包含了“线性”和“代数”两层含义,在 引言了介绍了 线性代数 四字的意义。 只有以列为视角,才能把线性组合关联起来。

为主的视角将矩阵乘法视为对矩阵的列向量进行线性组合。所谓线性组合,即线性+组合,线性是指向量乘以一个标量,沿着向量的方向缩放,方向不变;组合是把多个向量加起来。列视角是线性代数非常核心的基础概念,基础并不是说它简单,而是说它像地基一样重要,在学习任何线代知识前,应该先要打好的地基。

参考下图

红绿蓝三种颜色乘以矩阵 A=(a,b,c)TA=(a,b,c)^T,得到的结果是红色乘以aa,绿色乘以bb,蓝色乘以cc,然后得到紫色

这里体现了两层含义:线性,即红绿蓝分别被a,b,ca,b,c作用,彼此不被干扰。 组合,就是把最终结果相加。

图片

推广

现在把上面的结果推广,把矩阵AA推广为多列, 为了方便理解,我们从结果看过程 可以看到,最后的结果就是前面线性的叠加。

A=[aegbehcfi]A= \left[\begin{array}{ll} a & e & g \\ b & e & h\\ c & f & i \end{array}\right]

(a,b,c)(a,b,c) 作用颜色的结果的第一列,(d,e,f)(d,e,f)作用颜色的结果作为第二列,(g,h,i)(g,h,i)作用颜色的结果作为第三列。 换句话说,每一列的结果只与对应的列有关,而和别的列无关

这就像,下课了,嘈杂的教师里,你能立刻分别出小明和小军的声音,虽然教室里各种同学声音杂乱无章,但是对你而言,“小明”的声音和小军的声音好想彼此不干扰一样。

图片

理解了上面的思想,再来看例1的乘法。

计算

(123456)×(789101112)=\left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \times\left(\begin{array}{cc} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{array}\right)=?

解:我们使用列向量视角,就可以把矩阵转换为

(123456)×(7090110)+(123456)×(08010012) \left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \times\left(\begin{array}{cc} 7 & 0 \\ 9 & 0 \\ 11 & 0 \end{array}\right) + \left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \end{array}\right) \times\left(\begin{array}{cc} 0 & 8 \\ 0 & 10 \\ 0 & 12 \end{array}\right)
(5801390)+(0640154)\left(\begin{array}{lll} 58 & 0 \\ 139 & 0 \end{array}\right) + \left(\begin{array}{lll} 0 & 64 \\ 0 & 154 \end{array}\right)
=(5864139154)= \left(\begin{array}{lll} 58 & 64 \\ 139 & 154 \end{array}\right)

注意:正如上面所说,使用列视角方便人脑的理解,但是计算量反而可能比行视角大,所以行视角多用于计算机处理中。

列视角下的方程组

设有方程

{a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2am1x1+am2x2++amnxn=bm\left\{\begin{array}{c} a_{11} x_1+a_{12} x_2+\cdots+a_{1 n} x_n=b_1 \\ a_{21} x_1+a_{22} x_2+\cdots+a_{2 n} x_n=b_2 \\ \cdots \cdots \cdots \\ a_{m 1} x_1+a_{m 2} x_2+\cdots+a_{m n} x_n=b_m \end{array}\right.

则方程可以写成

Ax=[a11a12a1na21a22a2nan1an2ann][x1x2xn]=x1[a11a21an1]+x2[a12a2can2]++xn[a1na2nann]=b\begin{aligned} & A x=\left[\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 n} \\ a_{21} & a_{22} & \cdots & a_{2 n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n 1} & a_{n 2} & \cdots & a_{n n} \end{array}\right]\left[\begin{array}{c} x_1 \\ x_2 \\ \vdots \\ x_n \end{array}\right]=x_1\left[\begin{array}{c} a_{11} \\ a_{21} \\ \vdots \\ a_{n 1} \end{array}\right]+x_2\left[\begin{array}{c} a_{12} \\ a_{2 c} \\ \vdots \\ a_{n 2} \end{array}\right]+\cdots & +x_n\left[\begin{array}{c} a_{1 n} \\ a_{2 n} \\ \vdots \\ a_{n n} \end{array}\right] \end{aligned}= \boldsymbol{b}

仅从长相上看,矩阵方程 Ax=βAx=\beta初中学习的代数方程 ax=bax=b 几乎张一模一样。

矩阵乘法的性质

求矩阵 A=(311220)A=\left(\begin{array}{ccc}3 & -1 & 1 \\ 2 & 2 & 0\end{array}\right)B=(110111211)B=\left(\begin{array}{ccc}1 & -1 & 0 \\ 1 & 1 & 1 \\ 2 & 1 & -1\end{array}\right) 的乘积 ABA B. 解 因为矩阵 AA2×32 \times 3 矩阵,矩阵 BB3×33 \times 3 矩阵, AA 的列数等于 BB 的行数,所以矩阵 AABB 可 以相乘,乘积 ABA B 是一个 2×32 \times 3 矩阵.

AB=(311220)(110111211)=(3×1+(1)×1+1×23×(1)+(1)×1+1×13×0+(1)×1+1×(1)2×1+2×1+0×22×(1)+2×1+0×12×0+2×1+0×(1))=(432402)\begin{aligned} \boldsymbol{A} \boldsymbol{B} & =\left(\begin{array}{ccc} 3 & -1 & 1 \\ 2 & 2 & 0 \end{array}\right)\left(\begin{array}{ccc} 1 & -1 & 0 \\ 1 & 1 & 1 \\ 2 & 1 & -1 \end{array}\right) \\ & =\left(\begin{array}{ccc} 3 \times 1+(-1) \times 1+1 \times 2 & 3 \times(-1)+(-1) \times 1+1 \times 1 & 3 \times 0+(-1) \times 1+1 \times(-1) \\ 2 \times 1+2 \times 1+0 \times 2 & 2 \times(-1)+2 \times 1+0 \times 1 & 2 \times 0+2 \times 1+0 \times(-1) \end{array}\right) \\ & =\left(\begin{array}{ccc} 4 & -3 & -2 \\ 4 & 0 & 2 \end{array}\right) \end{aligned}

求矩阵 A=(1122)A=\left(\begin{array}{cc}-1 & 1 \\ 2 & -2\end{array}\right)B=(2163)B=\left(\begin{array}{cc}2 & 1 \\ -6 & -3\end{array}\right) 的乘积 ABA BBAB A.

AB=(1122)(2163)=(84168)A B=\left(\begin{array}{cc}-1 & 1 \\ 2 & -2\end{array}\right)\left(\begin{array}{cc}2 & 1 \\ -6 & -3\end{array}\right)=\left(\begin{array}{cc}-8 & -4 \\ 16 & 8\end{array}\right);

BA=(2163)(1122)=(0000).B A=\left(\begin{array}{cc} 2 & 1 \\ -6 & -3 \end{array}\right)\left(\begin{array}{cc} -1 & 1 \\ 2 & -2 \end{array}\right)=\left(\begin{array}{ll} 0 & 0 \\ 0 & 0 \end{array}\right) .

注意: (1) 矩阵乘法不满足交换律,即在一般情况下, ABBAA B \neq B A. (2) 尽管矩阵 AABB 满足 AB=OA B=O ,但是得不出 A=OA=OB=OB=O 的结论.

矩阵乘法满足的运算规律

结合律: (AB)C=A(BC)(A B) C=A(B C)

矩阵乘法对矩阵加法的分配律: A(B+C)=AB+AC,(A+B)C=AC+BCA(B+C)=A B+A C,(A+B) C=A C+B C

数乘 (kA)B=A(kB)=k(AB)(k \boldsymbol{A}) \boldsymbol{B}=\boldsymbol{A}(k \boldsymbol{B})=k(\boldsymbol{A B}) ;

单位矩阵 EmAm×n=Am×nEn=Am×n;\boldsymbol{E}_m \boldsymbol{A}_{m \times n}=\boldsymbol{A}_{m \times n} \boldsymbol{E}_n=\boldsymbol{A}_{m \times n} ;

矩阵乘法 Om×sAs×n=Om×n;Am×sOs×n=Om×n.\boldsymbol{O}_{m \times s} \boldsymbol{A}_{s \times n}=\boldsymbol{O}_{m \times n} ; \quad \boldsymbol{A}_{m \times s} \boldsymbol{O}_{s \times n}=\boldsymbol{O}_{m \times n} .

方阵的幂

定义方阵的方幂如下: Ak=AAAkA^k=\underbrace{A A \cdots A}_{k \uparrow} (这里 kk 为正整数), 并且规定:对非零方阵 AA ,有 A0=EA^0=E. 方阵的方幂满足以下运算规律 (这里 k,lk, l 均为非负整数) :

AkAl=Ak+l;(Ak)l=Akl\boldsymbol{A}^k \boldsymbol{A}^l=\boldsymbol{A}^{k+l} ; \quad\left(\boldsymbol{A}^k\right)^l=\boldsymbol{A}^{k l} \text {. }

由于矩阵乘法不满足交换律,一般来讲 (AB)kAkBk(A+B)2A2+2AB+B2(A B)^k \neq A^k B^k ,(A+B)^2 \neq A^2+2 A B+B^2. 只有当 AABB 可交换(即 AB=BA)A B=B A) 时,公式 (AB)k=AkBk,(A+B)2=A2+2AB+B2,(A+B)(AB)=A2B2(A B)^k=A^k B^k,(A+B)^2=A^2+2 A B+B^2,(A+B)(A-B)=A^2-B^2 等才成立.

设矩阵 A=(010001000)A=\left(\begin{array}{lll}0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0\end{array}\right), 求 A2A^2A3A^3.

A2=(010001000)(010001000)=(001000000),A3=A2A=(001000000)(010001000)=(000000000).\begin{aligned} \boldsymbol{A}^2 & =\left(\begin{array}{lll} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{array}\right)\left(\begin{array}{lll} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{array}\right)=\left(\begin{array}{lll} 0 & 0 & 1 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right), \\ \boldsymbol{A}^3 & =\boldsymbol{A}^2 \boldsymbol{A}=\left(\begin{array}{lll} 0 & 0 & 1 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right)\left(\begin{array}{lll} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{array}\right)=\left(\begin{array}{lll} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right) . \end{aligned}

行视角理解矩阵乘法(不方便人脑的理解)

矩阵左乘行向量,向量对矩阵的行进行线性组合,结果向量位于矩阵的行空间

图片

左侧的向量可以延展为一个由若干行所组成的矩阵,每一行乘以右边的矩阵,得到结果矩阵中的一行。

图片

矩阵的高纬推广

在计算机学习里,会遇到多维数组,为了方便理解多维数组的内涵,下面简单介绍高纬度矩阵。

1维矩阵

shape=[1,2,3,4]

图片{width=200px}

2维矩阵

shape=[[1. 2. 3.]
[4. 5. 6.]]

看维度的小技巧:想知道一个矩阵的维度是几维的,只需要看开头有几个“[”,有1个即为1维,上面的两个就是两维,后面举到的三维和四维的例子,分别是有三个“[”、四个“[”的。 上面这两维可视化长这样: 图片{width=200px}

为了方便后续解释三维和四维,我们把它旋转一个小角度,如下

图片{width=300px}

3维矩阵

shape=[[[ 1.  2.  3.]
[ 4.  5.  6.]]
[[ 7.  8.  9.]
[10. 11. 12.]]]

可以看到这是一个三维空间,是2×2×32 \times 2 \times 3 维度

图片{width=350px}

如果切片则显示数据如下

图片{width=350px}

结论:shape=[2,2,3]的三维矩阵,可以视为2个shape=[2,3]的二维矩阵堆叠在一起!!最后两维才是有数据的矩阵,前面的维度只是矩阵的排列而已!

注意上图中红色的0,1,2,表示的是输出的三个维度,在可视化中的位置。

总结怎么画三维: 先根据shape画出一个三维,shape=[2,2,3]分别对应着可视化中红色的0,1,2中小格子的个数 填充两维,在可视化中分别是1,2这两个维度上,把数据填充上,也就是上半部分的[[ 1. 2. 3.] [ 4. 5. 6.]] 填充剩余部分的[[ 7. 8. 9.] [10. 11. 12.]],并堆叠在一起形成三维。

四维

shape=[[[[ 1.  2.  3.]
[ 4.  5.  6.]]

[[ 7.  8.  9.]
[10. 11. 12.]]]

[[[13. 14. 15.]
[16. 17. 18.]]

[[19. 20. 21.]
[22. 23. 24.]]]]

结论:shape=[2,2,2,3]的四维矩阵,可以视为2个shape=[2,2,3]的三维矩阵堆叠在一起!!然后三维的最后是用二维的堆叠组成的!!第一个2表示的是batchsize!!最后两维才是有数据的矩阵,前面的维度只是矩阵的排列而已!

图片{width=600px}

注:本文综合了知乎矩阵乘法列空间多维矩阵向量运算 等文章改编。

4._矩阵的乘法 - 线性代数 | OpenTech