一、向量
1.1 什么是向量?
向量 是由几个数横向或纵向排列而成的。数纵向排列的向量叫作 列向量 ,如下式所示的变量就是列向量:
x
=
[
6
8
]
\mathbf{x}=\left[\begin{matrix} 6 \\ 8\end{matrix}\right]
x=[68]
数横向排列的向量叫作 行向量,如下式所示的变量就是行向量:
y
=
[
1
2
3
4
5
6
]
\mathbf{y} = \left[\begin{matrix}1 & 2 & 3 & 4 & 5 & 6\end{matrix}\right]
y=[123456]
构成向量的一个一个数叫作元素。向量中的元素个数叫作向量的维度。如上例所示, 为二维列向量, 为四维行向量。如
x
\mathbf{x}
x 和
y
\mathbf{y}
y 所示,本文向量使用 字母小写粗体 表示。与向量不同的普通的单个数叫作标量。本文中的标量用 小写斜体 表示,如 x、y。向量右上角的 T 是转置符号,表示将列向量转换为行向量,或者将行向量转换为列向量,如下式所示:
y
T
=
[
1
2
3
4
5
6
]
T
=
[
1
2
3
4
5
6
]
\mathbf{y^T} =\left[\begin{matrix}1 & 2 & 3 & 4 & 5 & 6\end{matrix}\right]^T= \left[\begin{matrix}1 \\ 2 \\ 3 \\ 4 \\ 5 \\ 6\end{matrix}\right]
yT=[123456]T=⎣⎢⎢⎢⎢⎢⎢⎡123456⎦⎥⎥⎥⎥⎥⎥⎤
x
T
=
[
6
8
]
T
=
[
6
8
]
\mathbf{x^T} =\left[\begin{matrix} 6 \\ 8\end{matrix}\right]^T= \left[\begin{matrix}6 & 8\end{matrix}\right]
xT=[68]T=[68]
1.2 向量的简单定义及使用
import numpy as np # 导入numpy包
x = np.array([6, 8])
print(x)
# 一维的 ndarray 类型没有纵横之分,往往表示为行向量。
# 表示 2 × 2 的二维数组(矩阵)
y = np.array([[1, 2], [3, 4]]) # 列向量
print(y)
z = np.array([[1], [2]]) # 列向量
print(z)
# 向量通常定义为一维 ndarray 类型,必要时可以用二维 ndarray 类型
# 转置用 变量名.T
print(z.T)
print(z.T.T) # 转置操作对于二维 ndarray 类型有效,但对于一维 ndarray 类型是无效的。
1.3 向量的加法和减法
有如下两个向量:
a
=
[
2
1
]
,
b
=
[
1
3
]
\begin{aligned} \mathbf{a}=\left[\begin{matrix} 2 \\ 1\end{matrix}\right], \mathbf{b}=\left[\begin{matrix} 1 \\ 3\end{matrix}\right]\end{aligned}
a=[21],b=[13]
首先进行加法运算。向量的加法运算 是将各个元素相加:
a
+
b
=
[
2
1
]
+
[
1
3
]
=
[
2
+
1
1
+
3
]
=
[
3
4
]
\begin{aligned} \mathbf{a+b}=\left[\begin{matrix} 2 \\ 1\end{matrix}\right] +\left[\begin{matrix} 1 \\ 3\end{matrix}\right]\end{aligned}=\left[\begin{matrix} 2 +1 \\ 1 +3\end{matrix}\right]=\left[\begin{matrix} 3 \\ 4\end{matrix}\right]
a+b=[21]+[13]=[2+11+3]=[34]
向量的加法运算可以通过图形解释。首先,将向量的元素看作坐标点,将向量看作一个从坐标原点开始,延伸到元素坐标点的箭头。这样一来,单纯地将各个元素相加的向量加法运算就可以看作,对以
a
和
b
\begin{aligned} \mathbf{a}和\mathbf{b}\end{aligned}
a和b为邻边的平行四边形求对角线。
示例代码:
import numpy as np
a = np.array([2, 1])
b = np.array([1, 3])
print(a + b)
向量的减法运算与加法运算相同,是对各个元素进行减法运算:
a
−
b
=
[
2
1
]
−
[
1
3
]
=
[
2
−
1
1
−
3
]
=
[
1
−
2
]
\begin{aligned} \mathbf{a-b}=\left[\begin{matrix} 2 \\ 1\end{matrix}\right] -\left[\begin{matrix} 1 \\ 3\end{matrix}\right]\end{aligned}=\left[\begin{matrix} 2 -1 \\ 1 -3\end{matrix}\right]=\left[\begin{matrix} 1 \\ -2\end{matrix}\right]
a−b=[21]−[13]=[2−11−3]=[1−2]
示例代码:
import numpy as np
a = np.array([2, 1])
b = np.array([1, 3])
print(a - b)
a - b 就是 a + (-b) ,可以看作 a 和 -b 的加法运算。从图形上来说, -b 的箭头方向与 b 相反。所以,a + (-b) 是以 a 和 -b 为邻边的平行四边形的对角线。
1.4 标量积
在标量与向量的乘法运算中,标量的值会与向量的各个元素分别相乘,比如 2a:
2
a
=
2
×
[
2
1
]
=
[
2
×
2
2
×
1
]
=
[
4
2
]
\begin{aligned} \mathbf{2a}=2×\left[\begin{matrix} 2 \\ 1\end{matrix}\right]\end{aligned}=\left[\begin{matrix} 2×2 \\ 2 ×1\end{matrix}\right]=\left[\begin{matrix} 4 \\ 2\end{matrix}\right]
2a=2×[21]=[2×22×1]=[42]
示例代码:
import numpy as np
a = np.array([2, 1])
print(2 * a)
从图形上来说,向量的长度变成了标量倍,如下图所示:
1.5 内积
向量与向量之间的乘法运算叫作内积。内积是由相同维度的两个向量进行的运算,通常用 ·
表示,这在机器学习涉及的数学中很常见。内积运算是把对应的元素相乘,然后求和,比如:
b
=
[
1
3
]
,
c
=
[
2
4
]
\begin{aligned} \mathbf{b}=\left[\begin{matrix} 1 \\ 3\end{matrix}\right], \mathbf{c}=\left[\begin{matrix} 2 \\ 4\end{matrix}\right]\end{aligned}
b=[13],c=[24]
的内积:
b
⋅
c
=
[
1
3
]
⋅
[
2
4
]
=
2
×
1
+
3
×
4
=
14
\begin{aligned} \mathbf{b·c}=\left[\begin{matrix} 1 \\ 3\end{matrix}\right] ·\left[\begin{matrix} 2 \\ 4\end{matrix}\right]\end{aligned}=2×1+3×4=14
b⋅c=[13]⋅[24]=2×1+3×4=14
示例代码:
import numpy as np
b = np.array([1, 3])
c = np.array([2, 4])
print(b.dot(c))
设 b 在 c 上的投影向量为 b'
,那么 b'
和 c 的长度相乘即可得到内积的值。当两个向量的方向大致相同时,内积的值较大。相反,当两个向量近乎垂直时,内积的值较小;当完全垂直时,内积的值为 0。可以说,内积与两个向量的相似度相关。
但是,请注意内积与向量自身的大小也相关。即使两个向量方向相同,只要其中一个向量变成原来的 2 倍,那么内积也会变成原来的 2 倍。
1.6 向量的模
向量的模是指向量的长度,将向量夹在两个 ||
之间,即可表示向量的模。二维向量的模可计算为:
∥
a
∥
=
∥
[
a
0
a
1
]
∥
=
a
0
2
+
a
1
2
\mathbf{\lVert a \rVert}=\begin{Vmatrix} \left[\begin{aligned}a_0\\ a_1\end{aligned}\right]\end{Vmatrix}=\sqrt{a_0^2 + a_1^2}
∥a∥=∥∥∥∥∥[a0a1]∥∥∥∥∥=a02+a12
三维向量的模则可计算为:
∥
a
∥
=
∥
[
a
0
a
1
a
2
]
∥
=
a
0
2
+
a
1
2
+
a
2
2
\mathbf{\lVert a \rVert}=\begin{Vmatrix} \left[\begin{aligned}a_0\\ a_1\\a_2\end{aligned}\right]\end{Vmatrix}=\sqrt{{a_0^2 + a_1^2}+a_2^2}
∥a∥=∥∥∥∥∥∥∥⎣⎢⎡a0a1a2⎦⎥⎤∥∥∥∥∥∥∥=a02+a12+a22
在一般情况下, D 维向量的模计算为:
∥
a
∥
=
∥
[
a
0
a
1
⋮
a
D
−
1
]
∥
=
a
0
2
+
a
1
2
+
⋯
+
a
D
−
1
2
\mathbf{\lVert a \rVert}=\begin{Vmatrix} \left[\begin{aligned}a_0\\ a_1\\\vdots\\a_{D-1}\end{aligned}\right]\end{Vmatrix}=\sqrt{{a_0^2 + a_1^2}+\cdots+a_{D-1}^2}
∥a∥=∥∥∥∥∥∥∥∥∥∥∥⎣⎢⎢⎢⎢⎢⎡a0a1⋮aD−1⎦⎥⎥⎥⎥⎥⎤∥∥∥∥∥∥∥∥∥∥∥=a02+a12+⋯+aD−12
示例代码:
import numpy as np
a = np.array([3, 4])
print(np.linalg.norm(a))
二、求和符号
求和符号经常出现在机器学习的教材中。比如,下式的意思是将 从1到10的变量的值全部相加。
∑
i
=
1
10
i
=
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
\begin{aligned}\sum_{i=1}^{10}i=1+2+3+4+5+6+7+8+9+10\end{aligned}
i=1∑10i=1+2+3+4+5+6+7+8+9+10
∑ 用于简洁地表示长度较长的加法运算。对上式加以扩展,如下式所示,它表示对于 ∑ 右边的 f(n),令变量 n 的取值从 a 开始递增 1,直到 a 变为 b,然后把所有 f(n) 相加。
∑
n
=
a
b
f
(
n
)
=
f
(
a
)
+
f
(
a
+
1
)
+
⋯
+
f
(
b
)
\begin{aligned}\sum_{n=a}^{b}f(n)=f(a)+f(a+1)+\cdots+f(b)\end{aligned}
n=a∑bf(n)=f(a)+f(a+1)+⋯+f(b)
例子如下:
∑
n
=
1
5
n
=
1
+
2
+
3
+
4
+
5
=
15
\begin{aligned}\sum_{n=1}^{5}n=1+2+3+4+5=15\end{aligned}
n=1∑5n=1+2+3+4+5=15
∑
n
=
1
5
n
2
=
1
2
+
2
2
+
3
2
+
4
2
+
5
2
\begin{aligned}\sum_{n=1}^{5}n^2=1^2+2^2+3^2+4^2+5^2\end{aligned}
n=1∑5n2=12+22+32+42+52
∑
n
=
1
5
3
=
3
+
3
+
3
+
3
+
3
=
3
×
5
=
15
\begin{aligned}\sum_{n=1}^{5}3=3+3+3+3+3=3×5=15\end{aligned}
n=1∑53=3+3+3+3+3=3×5=15
∑
n
=
1
3
2
n
2
=
2
∑
n
=
1
3
n
2
\begin{aligned}\sum_{n=1}^{3}2n^2=2\sum_{n=1}^{3}n^2\end{aligned}
n=1∑32n2=2n=1∑3n2
∑
n
=
1
5
[
2
n
2
+
3
n
+
4
]
=
2
∑
n
=
1
5
n
2
+
3
∑
n
=
1
5
n
+
4
×
5
\begin{aligned}\sum_{n=1}^{5}[2n^2+3n+4]=2\sum_{n=1}^{5}n^2+3\sum_{n=1}^{5}n+4×5\end{aligned}
n=1∑5[2n2+3n+4]=2n=1∑5n2+3n=1∑5n+4×5
在思考机器学习的问题时,我们常常需要对带求和符号的数学式进行变形。接下来,思考一下如何变形。最简单的情况是求和符号右侧的函数 f(n) 中没有 n,比如 f(n)=3。这时,只需用相加的次数乘以 即可,所以可以去掉求和符号:
当 f(n) 为 标量×n 的函数时,可以将标量提取到求和符号的外侧(左侧):
∑
n
=
1
3
2
n
2
=
2
×
1
2
+
2
×
2
2
+
2
×
3
2
=
2
(
1
2
+
2
2
+
3
2
)
=
2
∑
n
=
1
3
n
2
\begin{aligned}\sum_{n=1}^{3}2n^2=2×1^2+2×2^2+2×3^2=2(1^2+2^2+3^2)=2\sum_{n=1}^{3}n^2\end{aligned}
n=1∑32n2=2×12+2×22+2×32=2(12+22+32)=2n=1∑3n2
当求和符号作用于多项式时,可以将求和符号分配给各个项:
∑
n
=
1
5
[
2
n
2
+
3
n
+
4
]
=
2
∑
n
=
1
5
n
2
+
3
∑
n
=
1
5
n
+
4
×
5
\begin{aligned}\sum_{n=1}^{5}[2n^2+3n+4]=2\sum_{n=1}^{5}n^2+3\sum_{n=1}^{5}n+4×5\end{aligned}
n=1∑5[2n2+3n+4]=2n=1∑5n2+3n=1∑5n+4×5
之所以可以这样做,是因为无论是多项式相加,还是各项单独相加再求和,答案都是一样的。1.5 小节的向量的内积也可以使用求和符号表示。比如:
w
=
[
w
0
w
1
w
2
w
3
w
4
⋮
w
D
−
1
]
\mathbf{w} = \left[\begin{matrix}w_0 \\ w_1 \\ w_2 \\ w_3\\ w_4 \\\vdots\\ w_{D-1}\end{matrix}\right]
w=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡w0w1w2w3w4⋮wD−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
和
x
=
[
x
0
x
1
x
2
x
3
x
4
⋮
x
D
−
1
]
\mathbf{x} = \left[\begin{matrix}x_0 \\ x_1 \\ x_2 \\ x_3\\ x_4 \\\vdots\\ x_{D-1}\end{matrix}\right]
x=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x0x1x2x3x4⋮xD−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤可以表示为:
w
⋅
x
=
[
w
0
w
1
w
2
w
3
w
4
⋮
w
D
−
1
]
⋅
[
x
0
x
1
x
2
x
3
x
4
⋮
x
D
−
1
]
=
w
0
x
0
+
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
⋯
+
w
D
−
1
x
D
−
1
=
14
\begin{aligned} \mathbf{w·x}=\left[\begin{matrix}w_0 \\ w_1 \\ w_2 \\ w_3\\ w_4 \\\vdots\\ w_{D-1}\end{matrix}\right]·\left[\begin{matrix}x_0 \\ x_1 \\ x_2 \\ x_3\\ x_4 \\\vdots\\ x_{D-1}\end{matrix}\right]\end{aligned}=w_0x_0+w_1x_1+w_2x_2+w_3x_3+\cdots+w_{D-1}x_{D-1}=14
w⋅x=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡w0w1w2w3w4⋮wD−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x0x1x2x3x4⋮xD−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=w0x0+w1x1+w2x2+w3x3+⋯+wD−1xD−1=14
左侧称为 矩阵表示法(向量表示法),右侧称为 元素表示法,而上式则可以看作在两者之间来回切换的一个式子。前面我们说过 ∑ 跟编程中的 for 语句很像,根据上式,∑ 也与内积有关,所以也可以通过内积计算 ∑。例如,从 1 加到 1000 的和为:
1
+
2
+
3
+
⋯
+
1000
=
[
1
1
1
1
1
⋮
1
]
⋅
[
1
2
3
4
5
⋮
1000
]
\begin{aligned} \mathbf{1+2+3+\cdots+1000}=\left[\begin{matrix}1 \\ 1 \\ 1 \\ 1\\ 1 \\\vdots\\ 1\end{matrix}\right]·\left[\begin{matrix}1 \\ 2 \\ 3 \\ 4\\ 5 \\\vdots\\1000\end{matrix}\right]\end{aligned}
1+2+3+⋯+1000=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡11111⋮1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡12345⋮1000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
在 Python 中,上式计算示例代码如下。与 for 语句相比,这种方法的运算处理速度更快。
import numpy as np
a = np.ones(1000) # [1 1 1 ... 1]
b = np.arange(1,1001) # [1 2 3 ... 1000]
print(a.dot(b))
三、累乘符号
累乘符号 Π 与 ∑ 符号在使用方法上类似。这个符号将会在机器学习中的分类问题里出现。Π 用于使 f(n) 的所有元素相乘:
∏
n
=
a
b
f
(
n
)
=
f
(
n
)
×
f
(
n
+
1
)
×
⋯
×
f
(
b
)
\prod_{n = a}^{b}f(n)=f(n)×f(n+1)×⋯×f(b)
n=a∏bf(n)=f(n)×f(n+1)×⋯×f(b)
下式是一个最简单的例子:
∏
n
=
1
5
n
=
1
×
2
×
3
×
4
×
5
\prod_{n = 1}^{5}n=1×2×3×4×5
n=1∏5n=1×2×3×4×5
下式是累乘符号 Π 作用于多项式的示例:
∏
n
=
2
5
(
2
n
+
1
)
=
(
2
⋅
2
+
1
)
(
2
⋅
3
+
1
)
(
2
⋅
4
+
1
)
(
2
⋅
5
+
1
)
\prod_{n = 2}^{5}(2n+1)=(2·2+1)(2·3+1)(2·4+1)(2·5+1)
n=2∏5(2n+1)=(2⋅2+1)(2⋅3+1)(2⋅4+1)(2⋅5+1)
如下图所示: