向量是线性代数中的基本概念,也是机器学习的基础数据表示形式。例如计算机阅读文本的过程首先就会将文本分词,然后用向量表示。这是因为向量很适合在高维空间中表达和处理。在机器学习中会接触到的诸如投影、降维的概念,都是在向量的基础上做的。这篇文章我们谈谈向量的各种积。
标量乘向量
标量 乘以向量 定义为:
在数学中,标量乘法是由线性代数中的向量空间定义的基本运算(更一般地说,它是抽象代数中的一个模块)。在通常的几何概念中,通过正实数的欧几里德向量的标量乘法将矢量的幅值相乘而不改变它的方向。 术语“标量”本身来自于这种用法:标量是向量的幅值。 标量乘法是向量乘以标量(乘积是向量),并且必须与两个向量的内积(乘积是标量)进行区分。
一个向量向量 乘以一个标量得到 :
import numpy as np
a = np.array([-1, 2])
print a * 3 #[-3, 6]
向量点积
向量的点积(又叫点乘)定义如下:
点积在数学中,又称数量积(dot product; scalar product),是指接受在实数R上的两个向量并返回一个实数值标量的二元运算。它是欧几里得空间的标准内积。
可见点积得到的是一个标量。
例如:
[ 3 5 2 1 4 7 ] \left[ \begin{matrix} 3 & 5 & 2 \\ 1 & 4 & 7 \end{matrix} \right] [315427] = 3 ⋅ 1 + 5 ⋅ 4 + 2 ⋅ 7 = 37 3⋅1+5⋅4+2⋅7=37 3⋅1+5⋅4+2⋅7=37
import numpy as np
a = np.array([3, 5, 2])
b = np.array([1, 4, 7])
print a.dot(b) # 37
print np.dot(a, b) # 37(另一种等价写法)
容易证明点积满足乘法交换律、分配律和结合律。
关于点积还有一个非常重要的性质,称为 柯西不等式 :
- 对两个非 0 向量 x ⃗ , y ⃗ ∈ R n , ∣ x ⃗ ⋅ y ⃗ ∣ ≤ ∥ x ⃗ ∥ ∥ y ⃗ ∥ x⃗ ,y⃗ ∈Rn,|x⃗ ⋅y⃗ |≤∥x⃗ ∥∥y⃗ ∥ x⃗,y⃗∈Rn,∣x⃗⋅y⃗∣≤∥x⃗∥∥y⃗∥。
- 当且仅当 x ⃗ = c y ⃗ x⃗ =cy⃗ x⃗=cy⃗ 时,等式成立。
向量外积
向量的(又叫叉乘、向量积、叉积)只在 R 2 R^2 R2 和 R 3 R^3 R3 中定义:
R 2 R^2 R2 的向量外积:
[ a 1 a 2 ] \left[ \begin{matrix} a1 \\ a2 \end{matrix} \right] [a1a2] * [ b 1 b 2 ] \left[ \begin{matrix} b1 \\ b2 \end{matrix} \right] [b1b2] = [ a 1 ⋅ b 2 − a 2 ⋅ b 1 ] [a1⋅b2−a2⋅b1] [a1⋅b2−a2⋅b1]
R 3 R^3 R3 的向量外积:
[ a 1 a 2 a 3 ] \left[ \begin{matrix} a1 \\ a2 \\ a3 \end{matrix} \right] ⎣⎡a1a2a3⎦⎤ * [ b 1 b 2 b 3 ] \left[ \begin{matrix} b1 \\ b2 \\ b3\end{matrix} \right] ⎣⎡b1b2b3⎦⎤ = [ a 2 ⋅ b 3 − a 3 ⋅ b 2 a 3 ⋅ b 1 − a 1 ⋅ b 3 a 1 ⋅ b 2 − a 2 ⋅ b 1 ] \left[ \begin{matrix} a2⋅b3−a3⋅b2 \\ a3⋅b1−a1⋅b3 \\ a1⋅b2−a2⋅b1 \end{matrix} \right] ⎣⎡a2⋅b3−a3⋅b2a3⋅b1−a1⋅b3a1⋅b2−a2⋅b1⎦⎤
可见向量间外积的结果会得到一个新的向量。
import numpy as np
a = np.array([3, 5, 2])
b = np.array([1, 4, 7])
print np.cross(a, b) # [27, -19, 7]
矩阵向量积
矩阵的向量积可以当成是矩阵的所有列向量的线性组合:
例如矩阵
A
=
[
4
1
3
2
1
5
]
A=\left[ \begin{matrix} 4 & 1 & 3 \\ 2 & 1 & 5 \end{matrix} \right]
A=[421135]乘以向量
x
⃗
x⃗
x⃗ =
[
5
2
7
]
\left[ \begin{matrix} 5 \\ 2 \\ 7 \end{matrix} \right]
⎣⎡527⎦⎤ 的结果为:
[ 4 ⋅ 5 + 3 ⋅ 2 + 1 ⋅ 7 1 ⋅ 5 + 2 ⋅ 2 + 5 ⋅ 7 ] \left[ \begin{matrix}4⋅5+3⋅2+1⋅7 \\ 1⋅5+2⋅2+5⋅7 \end{matrix} \right] [4⋅5+3⋅2+1⋅71⋅5+2⋅2+5⋅7] = [ 33 44 ] \left[ \begin{matrix}33 \\ 44 \end{matrix} \right] [3344]
例如:
a = np.matrix('4 3 1;1 2 5')
x = np.array([[5], [2], [7]])
print a*x # [[33] [44]]