来自《深度学习》的配套资料!!!详情可以看书上的知识或是看相关的教材
异步社区:深度学习
线性代数是一门被广泛运用于各个工程技术学科的数学分支,利用线性代数的相关概念和结论,可以极大的简化机器学习里相关公式的推导和表述。
标量: 一个单独的数, 通常使用斜体小写字母表示,例如 x = 1 x=1 x=1。
向量:可以看作是一个有序
的一维
数组,通过索引能够唯一的确定向量中的某个值,通常使用斜体加粗的小写字母表示,例如 x = 1 , 2 , 3 , 4 , 5 \boldsymbol{x} = \\{1,2,3,4,5 \\} x=1,2,3,4,5,其中第 i i i个元素可以表示为 x i x_i xi。
矩阵:矩阵是一个有序
的二维
数组,其中每个元素由两个索引确定,分别表示它的行
和列
,通常使用斜体加粗的大写字母表示,例如 A = [ 1 2 3 4 ] \boldsymbol{A} = \left[ \begin{matrix}1 & 2 \\\\ 3 & 4 \end{matrix} \right] A=⎣⎡1324⎦⎤,一个 n n n维向量可以看做是一个 1 × n 1 \times n 1×n的矩阵。
张量:张量表示一个有序
的多维
数组,其中每个元素可以由多个索引确定,通常使用加粗的大写字母表示,例如 A \bf{A} A,向量和矩阵可以分别看作是一维和二维的张量。
在numpy中,可以用以下方式生成各种维度的张量:
>>> import numpy as np
## 生成元素全为0的二维张量,两个维度分别为3,4
>>> np.zeros((3,4))
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
## 生成三维的随机张量,三个维度分别为2,3,4
>>> np.random.rand(2,3,4)
array([[[ 0.93187582, 0.4942617 , 0.23241437, 0.82237576],
[ 0.90066163, 0.30151126, 0.89734992, 0.56656615],
[ 0.54487942, 0.80242768, 0.477167 , 0.6101814 ]],
[[ 0.61176321, 0.11454075, 0.58316117, 0.36850871],
[ 0.18480808, 0.12397686, 0.22586973, 0.35246394],
[ 0.01192416, 0.5990322 , 0.34527612, 0.424322 ]]])
方阵:行数和列数相等的矩阵。
单位矩阵:对角线元素均为1,其他位置均为0的方阵,通常记为 I n \boldsymbol{I}_n In, n n n代表行列数,例如
>>> np.eye(4)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
## 生成一个包含整数0~11的向量
>>> x = np.arange(12)
>>> x
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> x.shape
(12,)
## 将x转换成二维矩阵,其中矩阵的第一个维度为1
>>> x = x.reshape(1,12)
>>> x
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
>>> x.shape
(1, 12)
## 将x转换3x4的矩阵
>>> x = x.reshape(3,4)
>>> x
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
## 生成包含5个元素的向量x并将其转置
>>> x = np.arange(5).reshape(1,-1)
>>> x
array([[0, 1, 2, 3, 4]])
>>> x.T
array([[0],
[1],
[2],
[3],
[4]])
## 生成3*4的矩阵并转置
>>> A = np.arange(12).reshape(3,4)
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> A.T
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
## 生成2*3*4的张量
>>> B = np.arange(24).reshape(2,3,4)
>>> B
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
## 将B的01两个维度转置
>>> B.transpose(1,0,2)
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
对于张量来说,transpose和reshape都是非常常见又容易混淆的概念,reshape改变的是张量的形状,即张量各个维度上元素个数的分配,但对每一个元素来说,它相对于张量首个元素的
间隔
是不变的,对任一个张量,无论怎么样reshape,它进行flatten之后都是不变的;而transpose改变的是维度的方向,而不改变张量的形状,但是flatten之后会发生变化。
>>> A = np.arange(6).reshape(3,2)
>>> B = np.arange(6).reshape(2,3)
>>> A
array([[0, 1],
[2, 3],
[4, 5]])
>>> B
array([[0, 1, 2],
[3, 4, 5]])
>>> np.matmul(A,B)
array([[ 3, 4, 5],
[ 9, 14, 19],
[15, 24, 33]])
>>> A = np.arange(6).reshape(3,2)
>>> A*A
array([[ 0, 1],
[ 4, 9],
[16, 25]])
>>> A + A
array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
>>> A + A
array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
在numpy和tensorflow等运算库中,通常将element-wise operation的符号记为对应的四则运算符号,例如A*B表示的是element-eise product,而矩阵乘法则用matmul表示
>>> A = np.arange(4).reshape(2,2)
>>> A
array([[0, 1],
[2, 3]])
>>> np.linalg.inv(A)
array([[-1.5, 0.5],
[ 1. , 0. ]])