前面只用了加法和数乘。本节引入一个新运算——内积,它让向量空间有了「长度」和「角度」,也是相似度、回归、压缩的基础。
一、内积(Inner Product / Dot Product)
两个向量的内积是一个数:
u⋅v=i∑uivi=u1v1+u2v2+⋯+unvn
它同时有一个几何公式,连接了「长度」和「夹角」:
u⋅v=∥u∥∥v∥cosθ
这个公式是本节的核心:内积衡量两个向量「多同向」。同向为正,反向为负,垂直为零。
二、范数(Norm):向量的长度
由向量与自己的内积开根得到长度(L2 范数):
∥v∥=v⋅v=v12+⋯+vn2
这就是勾股定理的高维推广。两点距离 ∥u−v∥ 是机器学习里最常用的「不相似度」度量。L1 范数(各分量绝对值之和)则常用于稀疏正则化(Lasso)。
三、正交(Orthogonality)
当 u⋅v=0(且都非零),两向量正交,几何上就是垂直(θ=90°,余弦为 0)。
正交为什么重要:正交的方向互不干扰。由两两正交、长度为 1 的向量组成的基叫标准正交基(如标准基 e1,e2)。在正交基下,求坐标只需做内积,计算极其简单,且数值稳定。
四、投影(Projection)
把向量 u 投影到向量 v 方向上,就是问「u 在 v 方向上的影子有多长」:
projvu=v⋅vu⋅vv
投影是「用低维去近似高维」的核心动作:保留能被表达的部分,丢掉垂直方向上装不下的部分。
五、最小二乘:投影的最大应用
当方程 Ax=b 无解(方程比未知数多、数据有噪声)时,退而求「最接近」的解:把 b 投影到 A 的列空间上。结果就是正规方程:
A⊤Ax^=A⊤b
这正是线性回归的数学本质——找一条直线(超平面)使所有点到它的垂直距离平方和最小。「最小二乘」里的「二乘」就是 L2 范数的平方。
六、跨领域应用
AI —— 余弦相似度:判断两段文本(两个 embedding)意思像不像,用的就是余弦相似度 cosθ=∥u∥∥v∥u⋅v。值越接近 1 越相似。RAG 检索、语义搜索、推荐系统全靠它。Transformer 的注意力分数也是 Query 与 Key 的内积。
AI —— 回归与正则化:上述最小二乘是最基础的预测模型;L1/L2 范数作为惩罚项控制过拟合。
区块链 / 编码 —— 正交与独立性:纠错码设计追求码字之间足够「远」(汉明距离大),思路与正交分解一致:让信息在互不干扰的方向上展开,才能最大限度容错。
七、小结
| 概念 | 一句话理解 | 典型应用 |
| 内积 | 两向量多同向 | 相似度、注意力分数 |
| 范数 | 向量长度 | 距离度量、正则化 |
| 正交 | 互不干扰的方向 | 标准正交基、稳定计算 |
| 投影 | 用低维近似高维 | 最小二乘、降维 |
下一节:一个变换里是否有「不被旋转、只被拉伸」的特殊方向?这就是特征值与特征向量。
八、进阶:Gram–Schmidt 正交化
给一组线性无关但不正交的向量,怎么造出一组正交基?Gram–Schmidt 的思路:逐个加入向量,每次减去它在已有正交方向上的投影,只留下「新方向」。
uk=vk−j<k∑projujvk
再各自归一化(除以自己的范数),就得到标准正交基。这正是第 4 节「投影」的直接应用:正交化 = 不断减投影。
九、QR 分解
Gram–Schmidt 的矩阵形式就是 QR 分解:把 A 拆成正交矩阵 Q 与上三角 R:
A=QR
它是数值上解最小二乘的首选:Ax=b 的最小二乘解可化简为 Rx=Q⊤b(一个三角系统),比直接解正规方程 A⊤A 数值更稳(避免了条件数被平方)。
十、数字例题(步步算)
把 u=[34] 投影到 v=[10]。
projvu=v⋅vu⋅vv=13[10]=[30]
几何上就是取 u 的 x 分量。垂直残差 u−proj=[04],与 v 内积为 0,正交,符合预期。
再算余弦相似度:cosθ=5⋅13=0.6。
十一、NumPy 代码
import numpy as np
u = np.array([3.0, 4.0])
v = np.array([1.0, 0.0])
proj = (u @ v) / (v @ v) * v
print("投影 =", proj) # [3. 0.]
print("余弦相似度 =", u @ v / (np.linalg.norm(u)*np.linalg.norm(v))) # 0.6
# QR 分解解最小二乘
A = np.array([[1.0, 1], [1, 2], [1, 3]]) # 拟合 y = a + b·x
y = np.array([1.0, 2, 2])
Q, R = np.linalg.qr(A)
beta = np.linalg.solve(R, Q.T @ y)
print("最小二乘解 (截距, 斜率) =", beta)
# 等价的一行写法
print("lstsq =", np.linalg.lstsq(A, y, rcond=None)[0])
十二、动手算一算
- 两个 embedding 余弦相似度为 0 意味着什么?为 -1 呢?
- 为什么推荐系统多用余弦相似度而非欧氏距离?
- 把 [11],[10] 用 Gram–Schmidt 正交化。
答案:(1) 0=语义无关(正交);-1=语义完全相反。(2) 余弦只看方向不看长度,能消除文本长短、向量模长差异的影响。(3) 取 u1=21[11];v2=[10] 减去在 u1 上的投影 21[11] 得 [0.5−0.5],归一化为 21[1−1]。