文章目录
前言
深度学习的表现之所以能够超过传统的机器学习算法离不开神经网络,然而神经网络最基本的数据结构就是向量
和矩阵
,神经网络的输入是向量,然后通过每个矩阵对向量进行线性变换,再经过激活函数的非线性变换,通过层层计算最终使得损失函数的最小化,完成模型的训练。所以要想学好深度学习,对这些基础的数据结构还是要非常了解。
标量
标量(scalar):一个标量就是一个单独的数(整数或实数),不同于线性代数中研究的其他大部分对象(通常是多个数的数组)。标量通常用斜体的小写字母
来表示,例如:
x
\mathit x
x,标量就相当于Python中定义的
x = 1
向量
向量(vector):一个向量表示一组有序排列的数,通过次序中的索引我们能够找到每个单独的数,向量通常用粗体的小写字母
表示,例如:
x
\bf x
x,向量中的每个元素就是一个标量,向量中的第
i
i
i个元素用
x
i
x_i
xi表示,向量相当于Python中的一维数组
import numpy as np
#行向量
a = np.array([1,2,3,4])
矩阵
矩阵(matrix):矩阵是一个二维数组,其中的每一个元素由两个索引来决定(
A
i
,
j
A_{i,j}
Ai,j),矩阵通常用加粗斜体的大写字母
表示,例如:
X
\boldsymbol X
X。我们可以将矩阵看做是一个二维的数据表,矩阵的每一行表示一个对象,每一列表示一个特征。在Python中的定义为
import numpy as np
#矩阵
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
张量
张量(tensor):超过二维的数组,一般来说,一个数组中的元素分布在若干维坐标的规则网格中,被称为张量。如果一个张量是三维数组,那么我们就需要三个索引来决定元素的位置(
A
i
,
j
,
k
A_{i,j,k}
Ai,j,k),张量通常用加粗的大写字母表示
,例如:
X
\bf X
X
import numpy as np
#张量
a = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
标量向量矩阵张量之间的联系
通过上面的介绍可以总结一下,标量是0维空间中的一个点
,向量是一维空间中的一条线
,矩阵是二维空间的一个面
,三维张量是三维空间中的一个体
。也就是说,向量是由标量组成的,矩阵是向量组成的,张量是矩阵组成的。
用一个比较通俗的例子可以概括为:假设你手中拿着一根棍子,标量
就是我们只知道棍子的长度,但是不知道棍子指向的方向。向量
就是我们除了知道棍子的长度之外还知道棍子指向的是左边还是右边,矩阵
就是除了知道向量知道的信息外还知道棍子是朝上还是朝下,张量
就是除了知道矩阵知道的信息外还知道棍子是朝前还是朝后。
线性代数常用的运算
一、向量的运算
1.点积
点积(dot product)又被称为数量积
(scalar product)或者内积
(inner product):是指接受在实数R上的两个向量并返回一个实数值标量的二元运算。
代数意义
两个向量 a ( a 1 , a 2 , … , a n ) a (a_1, a_2,…, a_n) a(a1,a2,…,an)和 b ( b 1 , b 2 , … , b n ) b(b_1, b_2,…, b_n) b(b1,b2,…,bn)的点积定义为: a ⋅ b = a 1 b 1 + a 2 b 2 + … … + a n b n a·b=a_1b_1+a_2b_2+……+a_nb_n a⋅b=a1b1+a2b2+……+anbn,使用矩阵乘法并把(纵列)向量当作n×1 矩阵,点积还可以写为: a ⋅ b = a T ∗ b a·b=a^T * b a⋅b=aT∗b,这里的 a T a^T aT指示矩阵 a a a的转置。
import numpy as np
a = np.array([1,2,3])
b = np.array([3,2,1])
#向量的点积运算
print(np.dot(a,b))#10
几何意义
除此之外,向量积还有另一种定义 a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ ∗ c o s θ \vec a·\vec b=|\vec a|*|\vec b| * cos\theta a⋅b=∣a∣∗∣b∣∗cosθ,该定义只对二维和三维空间有效, ∣ a ⃗ ∣ |\vec a| ∣a∣和 ∣ b ⃗ ∣ |\vec b| ∣b∣表示向量的长度, θ \theta θ表示向量之间的夹角。
这个运算可以简单地理解为:在点积运算中,第一个向量投影到第二个向量上(这里,向量的顺序是不重要的,点积运算是可交换的),然后通过除以它们的标量长度来“标准化”。这样,这个分数一定是小于等于1的,可以简单地转化成一个角度值。利用向量积的几何意义,我们可以用来计算两个向量之间的夹角。
2.外积
设向量
c
⃗
\vec c
c由两个向量
a
⃗
\vec a
a与
b
⃗
\vec b
b按下列方式定出:
c
⃗
\vec c
c的模
∣
c
∣
=
∣
a
∣
∣
b
∣
s
i
n
<
a
,
b
>
|c|=|a||b|sin<a,b>
∣c∣=∣a∣∣b∣sin<a,b>
c
⃗
\vec c
c的方向垂直于
a
⃗
\vec a
a与
b
⃗
\vec b
b所决定的平面(即
c
⃗
\vec c
c既垂直于
a
⃗
\vec a
a,又垂直于
b
⃗
\vec b
b),
c
⃗
\vec c
c的指向按右手规则
从
a
⃗
\vec a
a转向
b
⃗
\vec b
b来确定。
那么,向量
c
⃗
\vec c
c叫做向量
a
⃗
\vec a
a与
b
⃗
\vec b
b的外积,记作
a
⃗
×
b
⃗
\vec a×\vec b
a×b,即
c
⃗
=
a
⃗
×
b
⃗
\vec c=\vec a×\vec b
c=a×b 。
∣
a
⃗
×
b
⃗
∣
|\vec a×\vec b|
∣a×b∣的值与以
a
⃗
\vec a
a,
b
⃗
\vec b
b为邻边的平行四边形的面积的值相同。一般地,向量外积的研究仅限于三维空间中
import numpy as np
a = np.array([0,2])
b = np.array([3,3])
#向量的外积
c = np.cross(b,a)
print(c)
通过外积我们可以用来快速求解平行四边形或三角形的面积
,需要注意的是在计算向量积时候,向量之间的顺序,顺序相反会得到相反的结果(正数和负数),判断方向时采用右手定则。
3.向量的范数
定义一个向量, x = [ x 1 , x 2 , . . . x n ] x=[x_1,x_2,...x_n] x=[x1,x2,...xn]
- 向量的1范数:向量中各个元素绝对值之和, ∣ ∣ x ∣ ∣ 1 = ∑ i = 1 N ∣ x i ∣ ||x||_1=\sum_{i=1}^{N}|x_i| ∣∣x∣∣1=∑i=1N∣xi∣
- 向量的2范数:向量中每个元素的平方和的平方根, ∣ ∣ x ∣ ∣ 2 = ∑ i = 1 N x i 2 ||x||_2=\sqrt{\sum_{i=1}^{N}x_i^2} ∣∣x∣∣2=∑i=1Nxi2
- 向量的负无穷范数:向量中所有元素的绝对值中最小的, ∣ ∣ x ∣ ∣ − ∞ = m i n 1 ≤ x ≤ N ∣ x i ∣ ||x||_{-\infty}=\underset {1 \leq x \leq N}{min}|x_i| ∣∣x∣∣−∞=1≤x≤Nmin∣xi∣
- 向量的正无穷范数:向量中所有元素的绝对值中最大的, ∣ ∣ x ∣ ∣ ∞ = m a x 1 ≤ x ≤ N ∣ x i ∣ ||x||_{\infty}=\underset {1 \leq x \leq N}{max}{|x_i|} ∣∣x∣∣∞=1≤x≤Nmax∣xi∣
- 向量的 p p p范数:向量中每个元素的 p p p次方和的 1 / p 1/p 1/p次幂, ∣ ∣ x ∣ ∣ p = ( ∑ i = 1 N ∣ x ∣ p ) 1 / p ||x||_p=(\sum_{i=1}^{N}|x|^p)^{1/p} ∣∣x∣∣p=(∑i=1N∣x∣p)1/p
二、矩阵的运算
1 .转置
转置(transpose):是矩阵的重要操作之一。矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线被称为主对角线
(main diagonal)。如下图所示
其实就是将原矩阵的行变成了转置矩阵的列
或将原矩阵的列变成转置矩阵的行
。
2.矩阵的范数
定义一个矩阵 A m n = { a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n } \boldsymbol A_{mn}= \left\{ \begin{matrix} a_{11}& a_{12} & \cdots & a_{1n}\\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{matrix} \right\} Amn=⎩⎪⎪⎪⎨⎪⎪⎪⎧a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎭⎪⎪⎪⎬⎪⎪⎪⎫
- 矩阵的1范数(列范数):对矩阵每一列上的元素绝对值求和,再从中取一个列和最大的值, ∣ ∣ A ∣ ∣ 1 = m a x 1 ≤ j ≤ n ∑ i = 1 m ∣ a i j ∣ ||\boldsymbol A||_1=\underset {1 \leq j \leq n}{max} \sum_{i=1}^{m}|a_{ij}| ∣∣A∣∣1=1≤j≤nmax∑i=1m∣aij∣
- 矩阵的2范数:矩阵 A T A \boldsymbol A^T \boldsymbol A ATA的最大特征值的平方根, ∣ ∣ A ∣ ∣ 2 = λ m a x ( A T A ) ||\boldsymbol A||_2 = \sqrt{\lambda_{max}(\boldsymbol A^T \boldsymbol A)} ∣∣A∣∣2=λmax(ATA),式中的 λ m a x ( A T A ) \lambda_{max}(\boldsymbol A^T \boldsymbol A) λmax(ATA)为 A T A \boldsymbol A^T \boldsymbol A ATA的特征值绝对值最大的值,关于矩阵的特征值介绍将会在下一篇文章中详细介绍
- 矩阵的无穷范数(行范数):对矩阵每一行的元素绝对值求和,再从中取一个行和最大的值, ∣ ∣ A ∣ ∣ ∞ = m a x 1 ≤ i ≤ m ∑ j = 1 n ∣ a i j ∣ ||\boldsymbol A||_\infty=\underset {1 \leq i \leq m}{max} \sum_{j=1}^{n}|a_{ij}| ∣∣A∣∣∞=1≤i≤mmax∑j=1n∣aij∣
- 矩阵的核范数:矩阵的奇异值之和,这个范数可以用低秩表示
- 矩阵的 L 0 L_0 L0范数:矩阵的非0元素的个数,通常用它来表示稀疏度, L 0 L_0 L0范数越小,0元素越多,矩阵就越稀疏。
- 矩阵的 L 1 L_1 L1范数:矩阵中的每个元素的绝对值之和,它是 L 0 L_0 L0范数的最优凸近似。
- 矩阵的 F F F范数:矩阵的各个元素的平方之和再开平方根,通常也称为矩阵的 L 2 L_2 L2范数。
- 矩阵的 L 21 L_{21} L21范数:矩阵先以每一列为单位,求每一列的 L 2 L_2 L2范数,再将得到的结果求 L 1 L_1 L1范数,所以它是介于 L 1 L_1 L1和 L 2 L_2 L2之间的一种范数。
3.常见的矩阵
- 方阵:也就方形矩阵,矩阵的列数与行数相等
- 对称矩阵:对称矩阵是一个方阵,矩阵的元素关于对角线对称,它的转置和自身相等,即 A = A T A=A^T A=AT
- Jacobian矩阵:Jacobian矩阵是函数的
一阶偏导数
以一定方式排列成的矩阵 - 单位矩阵:主对角线上的元素都为1,其余元素全为0的n阶矩阵称为n阶单位矩阵,记为 I n I_n In或 E n E_n En ,通常用 I I I或 E E E来表示
- 正交矩阵:如果 A A T = I n AA^T=I_n AAT=In,则 A A A就被称为正交矩阵
4.矩阵的乘法
矩阵乘法
:是最常见的矩阵乘积,两个矩阵相乘,必须要满足前一个矩阵的列数等于后一个矩阵的行数,一个
m
×
p
m×p
m×p的矩阵乘以一个
p
×
n
p×n
p×n会得到一个
m
×
n
m×n
m×n的矩阵。运算规则如下
numpy的实现如下,和向量积一样
import numpy as np
a = np.array([[1,2,3],
[-1,3,-2]])
b = np.array([[1,2],
[3,4],
[1,3]])
#矩阵相乘
print(np.dot(a,b))#或者使用np.matmul(a,b)
"""
[[10 19]
[ 6 4]]
"""
5.矩阵哈达马积
哈达马积(Hadamard product)
:也叫矩阵的元素相乘
,矩阵对应元素相乘,两个矩阵在进行元素相乘的时候必须要有相同的行数和列数,计算公式如下
在Python中计算两个矩阵元素相乘的乘积直接相乘即可,如果两个相乘的矩阵行数和列数不相等会报错,相乘的时候其中一个可以是标量或向量,会自动使用广播
,标量乘以矩阵中的所有元素,相当于对矩阵的元素做一个缩放
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[2,2],[1,3]])
#矩阵的元素相乘
c = a * b
print(c)
"""
[[ 2 4]
[ 3 12]]
"""
#矩阵的广播
d = a * 2
print(d)
"""
[[2 4]
[6 8]]
"""
d = a * np.array([1,2])
print(d)
"""
[[1 4]
[3 8]]
"""
6.克罗内克积
克罗内克积(Kronecker Product)
:克罗内克积是两个任意大小的矩阵间的运算,符号记作
⊗
\otimes
⊗ 。克罗内克积也被称为直积或张量积。计算过程如下例所示: