原文博客:Doi技术团队
链接地址:https://blog.doiduoyi.com/authors/1584446358138
初心:记录优秀的Doi技术团队学习经历
目录
文章目录
标量、向量、矩阵和张量
- 标量(scalar):一个标量就是一个单独的数,它不同与线性代数中研究其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称,比如: x x x
- 向量(vector): 一个向量是一列数。这些数都是有序排列的。通过次序中的索引,我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称.比如:
x
{\bf x}
x
x = [ x 1 x 2 ⋮ x n ] (1) {\bf x}=\left[\begin{matrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{matrix}\right]\tag{1} x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤(1) - 矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引(而非一个)所确定。我们通常会赋予矩阵粗体的大写变量名称,比如:
A
{\bf A}
A
A = [ A 1 , 1 A 1 , 2 A 2 , 1 A 2 , 2 ] (2) {\bf A}=\left[\begin{matrix} A_{1,1}&A_{1,2} \\ A_{2,1}&A_{2,2} \end{matrix}\right]\tag{2} A=[A1,1A2,1A1,2A2,2](2) - 张量(tensor):在某种情况下,我们会讨论坐标超过两维的数组。一般的,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量,使用 A {\sf A} A表示,张量 A {\sf A} A中坐标为 ( x , y , z ) (x,y,z) (x,y,z)的元素记作 A x , y , z A_{x,y,z} Ax,y,z
Python代码实现
使用Python创建普通二维矩阵
import numpy as np
m = np.mat([[1,2,3],[4,5,6]])
print m
输出为:
[[1 2 3]
[4 5 6]]
使用zeros
创建一个
3
×
2
3\times 2
3×2的0矩阵,还可以使用ones
函数创建1矩阵
from numpy import *
import numpy as np
m = np.mat(zeros((3,2)))
print m
输出为:
[[0. 0.]
[0. 0.]
[0. 0.]]
创建单位矩阵,单位矩阵部分有介绍
from numpy import *
import numpy as np
m = np.mat(eye(3,3,dtype=int))
print m
输出为:
[[1 0 0]
[0 1 0]
[0 0 1]]
转置
转置(transpose)是矩阵的重要操作之一。矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线被称为主对角线(main diagonal),我们将矩阵
A
{\bf A}
A的转置表示为
A
τ
{\bf A^\tau}
Aτ,定义如下:
(
A
τ
)
i
,
j
=
A
j
,
i
(3)
({\bf A^\tau})_{i,j}=A_{j,i}\tag{3}
(Aτ)i,j=Aj,i(3)
标量可以看作只有一个元素的矩阵。因此,标量的转置等于它本身,
a
=
a
τ
a=a^\tau
a=aτ
A
=
[
A
1
,
1
A
1
,
2
A
2
,
1
A
2
,
2
A
3
,
1
A
3
,
2
]
⇒
A
τ
=
[
A
1
,
1
A
2
,
1
A
3
,
1
A
1
,
2
A
2
,
2
A
3
,
2
]
(4)
A=\left[\begin{matrix} A_{1,1}&A_{1,2} \\ A_{2,1}&A_{2,2} \\ A_{3,1}&A_{3,2} \end{matrix}\right] \Rightarrow A^\tau= \left[\begin{matrix} A_{1,1}&A_{2,1}&A_{3,1} \\ A_{1,2}&A_{2,2}&A_{3,2} \end{matrix}\right]\tag{4}
A=⎣⎡A1,1A2,1A3,1A1,2A2,2A3,2⎦⎤⇒Aτ=[A1,1A1,2A2,1A2,2A3,1A3,2](4)
矩阵的转置也是一种运算,满足下述运算规律(假设运算都可行的):
- ( A τ ) τ = A ({\bf A}^\tau)^\tau={\bf A} (Aτ)τ=A
- ( A + B ) τ = A τ + B τ ({\bf A}+{\bf B})^\tau={\bf A}^\tau+{\bf B}^\tau (A+B)τ=Aτ+Bτ
- ( λ A ) τ = λ A τ (\lambda {\bf A})^\tau=\lambda {\bf A}^\tau (λA)τ=λAτ
- ( A B ) τ = B τ A τ ({\bf A}{\bf B})^\tau={\bf B}^\tau{\bf A}^\tau (AB)τ=BτAτ
在深度学习中,我也使用一些不那么常规的符号。我们允许矩阵和向量相加,产生另一个矩阵: C = A + a {\bf C}={\bf A}+{\bf a} C=A+a,其中 C i , j = A i , j + b j C_{i,j}=A_{i,j}+b_j Ci,j=Ai,j+bj。换言之,向量 a {\bf a} a和矩阵 A {\bf A} A的每一行相加。这个简写方法使我们无需在加法操作前定义一个将向量 b {\bf b} b复制到每一行而生成的矩阵。这种隐式地复制向量 b {\bf b} b到很多位置的方式,称之为广播(broadcasting)
Python代码实现
矩阵的装置
# coding=utf-8
import numpy as np
m = np.mat([[1,2,3],[4,5,6]])
print '转置前:\n%s' % m
t = m.T
print '转置前:\n%s' % t
输出为:
转置前:
[[1 2 3]
[4 5 6]]
转置前:
[[1 4]
[2 5]
[3 6]]
矩阵的运算
一. 矩阵的加法
**定义:**设有两个
m
×
n
m\times n
m×n矩阵
A
=
(
a
i
,
j
)
{\bf A}=(a_{i,j})
A=(ai,j)和
B
=
(
b
i
,
j
)
{\bf B}=(b_{i,j})
B=(bi,j),那么矩阵
A
{\bf A}
A与
B
{\bf B}
B的和记作
A
+
B
{\bf A}+{\bf B}
A+B,规定为:
A
+
B
=
[
a
1
,
1
+
b
1
,
1
a
1
,
2
+
b
1
,
2
⋯
a
1
,
n
+
b
1
,
n
a
2
,
1
+
b
2
,
1
a
2
,
2
+
b
2
,
2
⋯
a
2
,
n
+
b
2
,
n
⋮
⋮
⋮
⋮
a
m
,
1
+
b
m
,
1
a
m
,
2
+
b
m
,
2
⋯
a
m
,
n
+
b
m
,
n
]
(5)
{\bf A}+{\bf B}= \left[\begin{matrix} a_{1,1}+b_{1,1} & a_{1,2}+b_{1,2} & \cdots & a_{1,n}+b_{1,n} \\ a_{2,1}+b_{2,1} & a_{2,2}+b_{2,2} & \cdots & a_{2,n}+b_{2,n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{m,1}+b_{m,1}&a_{m,2}+b_{m,2}&\cdots & a_{m,n}+b_{m,n} \end{matrix}\right]\tag{5}
A+B=⎣⎢⎢⎢⎡a1,1+b1,1a2,1+b2,1⋮am,1+bm,1a1,2+b1,2a2,2+b2,2⋮am,2+bm,2⋯⋯⋮⋯a1,n+b1,na2,n+b2,n⋮am,n+bm,n⎦⎥⎥⎥⎤(5)
注意:两个矩阵必须是同型的矩阵时,这两个矩阵才能进行加法运算
矩阵加法满足下列运算规律(设 A , B , C {\bf A},{\bf B},{\bf C} A,B,C都是 m × n m \times n m×n矩阵):
- A + B = B + A {\bf A}+{\bf B}={\bf B}+{\bf A} A+B=B+A
- ( A + B ) + C = A + ( B + C ) ({\bf A}+{\bf B})+{\bf C}={\bf A}+({\bf B}+{\bf C}) (A+B)+C=A+(B+C)
Python代码实现
计算两个同型矩阵的加法
import numpy as np
m1 = np.mat([[1, 2, 3], [4, 5, 6]])
m2 = np.mat([[11, 12, 13], [14, 15, 16]])
print "m1 + m2 = \n%s " % (m1 + m2)
输出为:
m1 + m2 =
[[12 14 16]
[18 20 22]]
二. 矩阵的乘法
数与矩阵相乘定义: 数
λ
\lambda
λ与矩阵
A
{\bf A}
A的乘积记作
λ
A
\lambda {\bf A}
λA或
A
λ
{\bf A} \lambda
Aλ,规定为:
λ
A
=
A
λ
=
[
λ
a
1
,
1
λ
a
1
,
2
⋯
λ
a
1
,
n
λ
a
2
,
1
a
2
,
2
⋯
λ
a
2
,
n
⋮
⋮
⋮
⋮
λ
a
m
,
1
λ
a
m
,
2
⋯
λ
a
m
,
n
]
(6)
\lambda {\bf A}={\bf A} \lambda=\left[\begin{matrix}\lambda a_{1,1}&\lambda a_{1,2}&\cdots & \lambda a_{1,n}\\\lambda a_{2,1}&a_{2,2}&\cdots&\lambda a_{2,n}\\\vdots&\vdots&\vdots&\vdots\\\lambda a_{m,1}&\lambda a_{m,2}&\cdots & \lambda a_{m,n}\end{matrix}\right]\tag{6}
λA=Aλ=⎣⎢⎢⎢⎡λa1,1λa2,1⋮λam,1λa1,2a2,2⋮λam,2⋯⋯⋮⋯λa1,nλa2,n⋮λam,n⎦⎥⎥⎥⎤(6)
数乘矩阵满足下列运算规律(设 A , B {\bf A},{\bf B} A,B为 m × n m \times n m×n矩阵, λ , μ \lambda,\mu λ,μ为数):
- ( λ μ ) A = λ ( μ A ) (\lambda \mu){\bf A}=\lambda (\mu{\bf A}) (λμ)A=λ(μA)
- ( λ + μ ) A = λ A + μ A (\lambda + \mu){\bf A}=\lambda {\bf A}+\mu {\bf A} (λ+μ)A=λA+μA
- λ ( A + B ) = λ A + λ A \lambda({\bf A}+{\bf B})=\lambda {\bf A}+\lambda {\bf A} λ(A+B)=λA+λA
矩阵加法与数乘矩阵统称为矩阵的线性运算
**矩阵与矩阵相乘定义:**设
A
=
(
a
i
,
j
)
{\bf A}=(a_{i,j})
A=(ai,j)是一个
m
×
s
m \times s
m×s矩阵,
B
=
(
b
i
,
j
)
{\bf B}=(b_{i,j})
B=(bi,j)是一个
s
×
n
s \times n
s×n矩阵,那么规定矩阵
A
{\bf A}
A与
B
{\bf B}
B的乘积是一个
m
×
n
m \times n
m×n矩阵
C
=
(
c
i
,
j
)
{\bf C}=(c_{i,j})
C=(ci,j),记作:
C
=
A
B
(7)
{\bf C}={\bf A}{\bf B}\tag{7}
C=AB(7)
计算如下:
[
a
i
,
1
a
i
,
2
⋯
a
i
,
s
]
[
b
1
,
j
b
2
,
j
⋮
b
s
,
j
]
=
a
i
,
1
b
1
,
j
+
a
i
,
2
b
2
,
j
+
⋯
+
a
i
,
k
b
k
,
j
=
∑
k
=
1
s
a
i
,
k
b
k
,
j
=
c
i
,
j
(8)
\left[\begin{matrix} a_{i,1} & a_{i,2} & \cdots & a_{i,s} \end{matrix}\right] \left[\begin{matrix} b_{1,j} \\ b_{2,j} \\ \vdots \\ b_{s,j} \end{matrix}\right]= a_{i,1}b_{1,j}+a_{i,2}b_{2,j}+\cdots+a_{i,k}b_{k,j}= \sum_{k=1}^s a_{i,k}b_{k,j}= c_{i,j}\tag{8}
[ai,1ai,2⋯ai,s]⎣⎢⎢⎢⎡b1,jb2,j⋮bs,j⎦⎥⎥⎥⎤=ai,1b1,j+ai,2b2,j+⋯+ai,kbk,j=k=1∑sai,kbk,j=ci,j(8)
例如:
[
a
1
,
1
a
1
,
2
a
1
,
3
a
2
,
1
a
2
,
2
a
2
,
3
]
[
b
1
,
1
b
1
,
2
b
2
,
1
b
2
,
2
b
3
,
1
b
3
,
2
]
=
[
a
1
,
1
b
1
,
1
+
a
1
,
2
b
2
,
1
+
a
1
,
3
b
3
,
1
a
1
,
1
b
1
,
2
+
a
1
,
2
b
2
,
2
+
a
1
,
3
b
3
,
2
a
2
,
1
b
1
,
1
+
a
2
,
2
b
2
,
1
+
a
2
,
3
b
3
,
1
a
2
,
1
b
1
,
2
+
a
2
,
2
b
2
,
2
+
a
2
,
3
b
3
,
2
]
(9)
\left[\begin{matrix} a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \\ \end{matrix}\right] \left[\begin{matrix} b_{1,1} & b_{1,2} \\ b_{2,1} & b_{2,2} \\ b_{3,1} & b_{3,2} \\ \end{matrix}\right]= \left[\begin{matrix} a_{1,1}b_{1,1}+a_{1,2}b_{2,1}+a_{1,3}b_{3,1} & a_{1,1}b_{1,2}+a_{1,2}b_{2,2}+a_{1,3}b_{3,2} \\ a_{2,1}b_{1,1}+a_{2,2}b_{2,1}+a_{2,3}b_{3,1} & a_{2,1}b_{1,2}+a_{2,2}b_{2,2}+a_{2,3}b_{3,2} \end{matrix}\right]\tag{9}
[a1,1a2,1a1,2a2,2a1,3a2,3]⎣⎡b1,1b2,1b3,1b1,2b2,2b3,2⎦⎤=[a1,1b1,1+a1,2b2,1+a1,3b3,1a2,1b1,1+a2,2b2,1+a2,3b3,1a1,1b1,2+a1,2b2,2+a1,3b3,2a2,1b1,2+a2,2b2,2+a2,3b3,2](9)
矩阵不满足交换律,但在运算都可行的情况下满足结合律和分配律
- ( A B ) C = A ( B C ) ({\bf A}{\bf B}){\bf C}={\bf A}({\bf B}{\bf C}) (AB)C=A(BC)
- λ ( A B ) = ( λ A ) B = A ( λ B ) \lambda ({\bf A}{\bf B})=(\lambda{\bf A}){\bf B}={\bf A}(\lambda{\bf B}) λ(AB)=(λA)B=A(λB) (其中 λ \lambda λ为数)
- A ( B + C ) = A B + A C , ( B + C ) A = B A + C A {\bf A}({\bf B}+{\bf C})={\bf A}{\bf B}+{\bf A}{\bf C},({\bf B}+{\bf C}){\bf A}={\bf B}{\bf A}+{\bf C}{\bf A} A(B+C)=AB+AC,(B+C)A=BA+CA
Python代码实现
计算 2 × 3 2\times 3 2×3矩阵与 3 × 2 3\times2 3×2矩阵相乘
import numpy as np
m1 = np.mat([[1, 2, 3], [4, 5, 6]])
m2 = np.mat([[11, 12], [13, 14], [15, 16]])
print "m1 * m2 = \n%s " % (m1 * m2)
输出为:
m1 * m2 =
[[ 82 88]
[199 214]]
单位矩阵和逆矩阵
**单位矩阵(identity matrix)**就是对角线的元素都是1,而其他的所有元素都是0,如下:
I
3
=
[
1
0
0
0
1
0
0
0
1
]
(10)
{\bf I}_3= \left[\begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix}\right]\tag{10}
I3=⎣⎡100010001⎦⎤(10)
**逆矩阵(matrix inversion)定义:**对于
n
n
n阶矩阵
A
{\bf A}
A,如果有一个
n
n
n阶矩阵,使得:’
A
B
=
B
A
=
I
(11)
{\bf A}{\bf B}={\bf B}{\bf A}={\bf I}\tag{11}
AB=BA=I(11)
则说明矩阵
A
{\bf A}
A是可逆的,并把矩阵
B
{\bf B}
B称为
A
{\bf A}
A的逆矩阵,而且矩阵是唯一的,记作
A
−
1
{\bf A}^{-1}
A−1
当
∣
A
∣
≠
0
|{\bf A}|\not=0
∣A∣=0,则矩阵
A
{\bf A}
A可逆,且
A
−
1
=
1
∣
A
∣
A
∗
(12)
{\bf A}^{-1}=\frac{1}{|{\bf A}|} {\bf A}^\ast\tag{12}
A−1=∣A∣1A∗(12)
其中
A
∗
{\bf A}^\ast
A∗称为矩阵的{\bf A}的伴随矩阵
Python代码实现
单位矩阵的计算
from numpy import *
import numpy as np
m = np.mat(eye(3,3,dtype=int))
print m
输出为:
[[1 0 0]
[0 1 0]
[0 0 1]]
计算 3 × 3 3\times3 3×3矩阵的逆矩阵
# coding=utf-8
import numpy as np
m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
I = m.I
print '矩阵:\n%s\n的逆矩阵为:\n%s' % (m, I)
输出为:
矩阵:
[[2 0 0]
[0 4 0]
[0 0 8]]
的逆矩阵为:
[[0.5 0. 0. ]
[0. 0.25 0. ]
[0. 0. 0.125]]
求 3 × 3 3\times3 3×3方阵的行列式
# coding=utf-8
import numpy as np
m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
d = np.linalg.det(m)
print d
输出为:
64.0
求 3 × 3 3\times3 3×3方阵的伴随矩阵
import numpy as np
m = np.mat([[2, 0, 0], [0, 4, 0], [0, 0, 8]])
i = m.I
d = np.linalg.det(m)
a = i * d
print a
输出为:
[[32. 0. 0.]
[ 0. 16. 0.]
[ 0. 0. 8.]]
线性相关和生成子空间
线性组合(linear combination)
为了分析方程有多少个解,我们可以将
A
{\bf A}
A的列向量看作从原点(origin)(元素都是零的向量)出发的不同方向,确定有多少种方法可以到达向量
b
{\bf b}
b.在这个观点下,向量
x
{\bf x}
x中的每个元素都是表示我们应该沿着这些方向走多远,即
x
i
x_i
xi表示我们需要沿着第
i
i
i个向量的方向走多远:
A
x
=
∑
i
x
i
A
:
,
i
(13)
{\bf Ax}=\sum_i x_i{\bf A}_{:,i}\tag{13}
Ax=i∑xiA:,i(13)
生成子空间(span)
形式上,一组向量的线性组合,是指每个向量乘以对应标量系数之后的和,即:
∑
i
c
i
v
(
i
)
(14)
\sum_i c_iv^{(i)}\tag{14}
i∑civ(i)(14)
一组向量的生产子空间是原始向量线性组合后所能抵达的点的集合
范数
范数(norm):在机器学习中,我们经常使用称为范数的函数来衡量向量的大小,形式上,
L
p
L^p
Lp范数定义入下:
∣
∣
x
∣
∣
p
=
(
∑
x
∣
x
i
∣
p
)
1
p
(15)
||{\bf x}||_p=\left(\sum_x |x_i|^p\right)^\frac{1}{p}\tag{15}
∣∣x∣∣p=(x∑∣xi∣p)p1(15)
范数满足下列性质的任意函数:
- f ( x ) = 0 ⇒ x = 0 f(x)=0\Rightarrow x = 0 f(x)=0⇒x=0
- f ( x + y ) ≤ f ( x ) + f ( y ) f(x+y) \leq f(x) + f(y) f(x+y)≤f(x)+f(y)(三角不定式(triangle inequality))
- ∀ α ∈ R , f ( α x ) = ∣ α ∣ f ( x ) \forall\alpha \in {\Bbb R},f(\alpha{\bf x})=|\alpha|f({\bf x}) ∀α∈R,f(αx)=∣α∣f(x)
当
p
=
2
p=2
p=2时,
L
2
L^2
L2范数称为欧几里得范数(Euclidean norm).他表示从原点出发到向量
x
{\bf x}
x确定的点的欧几里得距离
当
p
=
∞
p=\infty
p=∞时,
L
∞
L^\infty
L∞范数称为最大范数(max norm).这个范数表示向量中具有最大幅度的元素的绝对值:
∣
∣
x
∣
∣
∞
=
m
a
x
i
∣
x
i
∣
||{\bf x}||_\infty = {\rm max}_i |x_i|
∣∣x∣∣∞=maxi∣xi∣
参考资料
- lan Goodfellow,Yoshua Bengio,Aaron Courville.深度学习(中文版).赵申剑,黎彧君,符天凡,李凯,译.北京:人民邮电出版社
- 同济大学数学系.工程数学-线性代数(第六版).北京:高等教育出版社