<< 返回 Menu

向量加法

$$\begin{pmatrix} a \\ b \\ c \end{pmatrix} + \begin{pmatrix} d \\ e \\ f \end{pmatrix} = \begin{pmatrix} a+d \\ b+e \\ c+f \end{pmatrix}$$$$\begin{pmatrix} v_1 \\ v_2 \\ ... \\ v_n \end{pmatrix} + \begin{pmatrix} u_1 \\ u_2 \\ ... \\ u_n \end{pmatrix} = \begin{pmatrix} v_1 + u_1 \\ v_2 + u_2 \\ ... \\ v_n + u_n \end{pmatrix}$$

向量乘法

$$ k \times (a, b)^T = (ka, kb)^T $$

向x移动k次a个单位

再向y移动k次b个单位

$$ k \times \begin{pmatrix} v_1 \\ v_2 \\ ... \\ v_n \end{pmatrix} = \begin{pmatrix} k \cdot v_1 \\ k \cdot v_2 \\ ... \\ k \cdot v_n \end{pmatrix}$$

向量的长度 (模 norm of vector)

$$\vec{u} = (3, 4)^T$$$$\begin{Vmatrix} \vec{u} \end{Vmatrix} = \sqrt{3^2 + 4^2} = 5$$$$\vec{u} = (u_1, u_2, ..., u_n)^T$$$$\begin{Vmatrix} \vec{u} \end{Vmatrix} = \sqrt{u_1^2 + u_2^2 + ... + u_n^2}$$

单位向量 unit vector

(向量/向量长度)
$$\hat{u} = \frac{1}{\begin{Vmatrix} \vec{u} \end{Vmatrix}} \cdot \vec{u} = (\frac{u_1}{\begin{Vmatrix} \vec{u} \end{Vmatrix}} + \frac{u_2}{\begin{Vmatrix} \vec{u} \end{Vmatrix}} + ... + \frac{u_n}{\begin{Vmatrix} \vec{u} \end{Vmatrix}})$$

单位向量的模永远等于1,单位向量的长度不重要,只表示方向,所以单位向量有无数个,以(0,0)为圆心,半径为1的一个圆。二维空间中,有两个特殊的单位向量 $\vec{e_1}=(1,0)$, $\vec{e_2}=(0,1)$。只由0,1组成的单位向量:标准单位向量 Standard Unit Vector

$$\begin{Vmatrix} \hat{u} \end{Vmatrix} = 1 $$

归一化 规范化 (Normalize)

根据 $\vec{u}$ 求出 $\hat{u}$ 的过程

两个向量相乘

$$\vec{u} \cdot \vec{v} = \begin{pmatrix} u_1 \\ u_2 \\ ... \\ u_n \end{pmatrix} \cdot \begin{pmatrix} v_1 \\ v_2 \\ ... \\ v_n \end{pmatrix}$$

$$ = sum(\begin{pmatrix} u_1 \cdot v_1 \\ u_2 \cdot v_2 \\ ... \\ u_n \cdot v_n \end{pmatrix})$$ $$ = u_1 \cdot v_1 + u_2 \cdot v_2 + ... + u_n \cdot v_n$$ $$ = \begin{Vmatrix} \vec{u} \end{Vmatrix} \cdot \begin{Vmatrix} \vec{v} \end{Vmatrix} \cdot cos\theta$$

两个向量“相乘”,结果是一个数(标量)
更严格的说法:
两个向量的【点乘】
两个向量的【内积】

所以

$$ cos\theta = \frac{\vec{u} \cdot \vec{v}}{\begin{Vmatrix} \vec{u} \end{Vmatrix} \cdot \begin{Vmatrix} \vec{v} \end{Vmatrix}} $$

如果 $\theta = 90^\circ$, $\vec{u} \cdot \vec{v} = 0$
如果 $\vec{u} \cdot \vec{v} = 0$,两个向量垂直;
如果 $\vec{u} \cdot \vec{v} > 0$,两个向量夹角为锐角;数值越大,两个向量相似度越高,可用于推荐系统
如果 $\vec{u} \cdot \vec{v} < 0$,两个向量夹角为钝角;

几何计算

投影点的距离:
$\vec{v}$ 往 $\vec{u}$ 上投影 $$d = \begin{Vmatrix} \vec{v} \end{Vmatrix} cos\theta = \frac{\vec{u} \cdot \vec{v}}{\begin{Vmatrix} \vec{u} \end{Vmatrix}}$$ 投影点的方向:
$$\hat{u}$$ 投影点的坐标:
$$P_v = d \cdot \hat{u}$$

In [8]:
import numpy as np
print(np.__version__)
1.16.2
In [9]:
vec = np.array([1, 2, 3])
print(vec)
[1 2 3]
In [12]:
# np.array的创建
print(np.zeros(5))
print(np.ones(5))
print(np.full(5, 666))
[0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1.]
[666 666 666 666 666]
In [16]:
# np.array的基本属性
print(vec)
print("size =", vec.size)
print("size =", len(vec))
print(vec[0])
print(vec[-1])
print(vec[0:2])
print(type(vec[0:2]))
[1 2 3]
size = 3
size = 3
1
3
[1 2]
<class 'numpy.ndarray'>
In [26]:
# np.array的基本运算
vec2 = np.array([4, 5, 6])
print("{} + {} = {}".format(vec, vec2, vec+vec2))
print("{} - {} = {}".format(vec, vec2, vec-vec2))
print("{} * {} = {}".format(2, vec, 2*vec))
print("{} * {} = {}".format(vec, 2, vec*2))
print("{} * {} = {}".format(vec, vec2, vec*vec2)) # element-wise multiplication
print("{}.dot({}) = {}".format(vec, vec2, vec.dot(vec2))) # 点乘
print(np.linalg.norm(vec)) # vec 的模
print(vec/np.linalg.norm(vec)) # vec 的单位向量
# 上面这个单位向量的模应该为 1
print(np.linalg.norm(vec/np.linalg.norm(vec)))
[1 2 3] + [4 5 6] = [5 7 9]
[1 2 3] - [4 5 6] = [-3 -3 -3]
2 * [1 2 3] = [2 4 6]
[1 2 3] * 2 = [2 4 6]
[1 2 3] * [4 5 6] = [ 4 10 18]
[1 2 3].dot([4 5 6]) = 32
3.7416573867739413
[0.26726124 0.53452248 0.80178373]
1.0