首页 / 模块 1 · 线性代数与微积分 / 第 1 课(共 10 课)

向量——机器学习的原子

从零到前沿 ML 自学课程 · 阶段0:数学与工具基础 · 能力点:向量化思维——一切建模的起点(数据点/嵌入/权重都是向量)

读完这一课,你将能够

  • 把一个样本说成向量,并在"数据行 / 几何箭头 / 坐标列"三种视角间自由切换。
  • 手算范数 \(\|a\|=\sqrt{\sum a_i^2}\),并预测 \(2a\)、\(-0.5a\)、\(0\cdot a\) 的长度与方向。
  • 判断两个向量张成的是一条过原点的直线还是整个平面,并说清线性相关与无关的区别。
  • 用 \(\sum a_i b_i\) 和 \(\|a\|\|b\|\cos\theta\) 两种方式算出同一个点积,并说出它度量"方向有多接近"。
  • 从点积推出余弦相似度,解释它为什么是语义检索 / RAG 的核心。

1. 开场:为什么从向量讲起

如果把机器学习(machine learning)拆到最底层,你会发现一个反复出现的"原子"——向量 vector。无论是一个数据点、一张图片、一个词的语义、还是模型自己的参数,在计算机眼里它们统统是一串有序的数。理解了向量,你就拿到了打开后面所有内容(矩阵、梯度、神经网络、注意力机制)的钥匙。

先看四个真实例子,感受"万物皆向量":

记住这句话:一个样本 = 一个向量;一个特征维度 = 向量的一个坐标分量。从此"数据集"在你脑中应该变成"一堆点"或"一摞向量"。本课所有内容,都是在为"如何度量、组合、变换这些点"打地基。

2. 向量的三种视角:同一个对象,三种语言

同一个向量,可以用三种完全不同的语言来说,它们指的是同一个东西。以二维向量 \(v=[3,2]\) 为例:

视角长什么样什么时候最好用
数据行 data row表格里的一行:身高=3, 体重=2处理数据集时——这正是 pandas / NumPy 里的一行
几何箭头 arrow从原点 \((0,0)\) 指向 \((3,2)\) 的有向箭头想理解方向、长度、相似度、变换时
坐标列 column\(\begin{bmatrix}3\\2\end{bmatrix}\),竖排的数做矩阵运算、写权重 \(w\) 时
同一个向量 [3,2] 的三种视角:数据表行、平面箭头、坐标列同一个向量,三种语言数据表的一行x1x232平面上的箭头xyO123412332v=[3,2]坐标列向量32
同一个向量 [3,2] 的三种视角:数据表的一行、二维平面上从原点出发的箭头、竖排的坐标列

三者可以自由切换:数据行强调"它是一条记录",几何箭头强调"它有方向和长度",坐标列强调"它能参与代数运算"。会切换视角,是学好线性代数的核心技能——很多看起来难的问题,换个视角就一目了然。

记号约定:向量用粗体或带箭头表示,本课写作 \(v=[v_1, v_2, \dots, v_n]\),其中 \(n\) 是维度 dimension。习惯上向量默认是"列向量",写成一行只是为了排版方便;后面我们会看到,把列向量"转置"成行,正好用来写点积。

ML 和 ML 的联系

这三种视角在代码和模型里天天出现:数据行视角对应 df.iloc[0] 取出的一行样本;坐标列视角对应神经网络里的权重列向量 \(w\);几何箭头视角对应词嵌入在语义空间里的位置——"猫"和"狗"的箭头方向相近,"猫"和"火箭"则相差很远。同一份数据,工程时当它是行,建模时当它是列,理解时当它是箭头。

3. 向量的长度、加法与数乘

向量的长度:范数 norm

在做加法、数乘之前,先把一个最基础的量讲清楚:向量有多"长"。一个向量的长度叫作它的范数 norm,记作 \(\|v\|\)。在二维里,它就是从原点到箭头尖的距离,由勾股定理给出:

\[ \|[a_1,a_2]\|=\sqrt{a_1^2+a_2^2} \]

推广到 \(n\) 维,就是把所有分量平方求和再开根号:

\[ \|a\|=\sqrt{a_1^2+a_2^2+\cdots+a_n^2}=\sqrt{\sum_{i=1}^{n} a_i^2} \]

例如 \(\|[3,4]\|=\sqrt{3^2+4^2}=\sqrt{25}=5\)。范数衡量的就是"这个箭头有多长",后面讲数乘的伸缩、点积的几何定义、投影和余弦相似度时都要反复用到它,所以先把它放在最前面。

向量加法:尖尾相接 / 平行四边形

两个向量相加,代数上就是对应分量相加

\[ a+b=[a_1,a_2]+[b_1,b_2]=[a_1+b_1,\ a_2+b_2] \]

几何上有两种等价画法:

数乘:沿方向伸缩或翻转

一个数(标量 scalar)\(c\) 乘以向量,就是把每个分量都乘以 \(c\):

\[ c\,a=[c\,a_1,\ c\,a_2] \]

几何意义非常直观(这里"长度翻倍/减半"指的就是上面讲的范数 \(\|a\|\)):

向量加法的平行四边形法则与向量数乘示意图 x y O 向量加法 · 平行四边形法则 a b a+b x y O 向量数乘 · 同线缩放 a 2a -0.5a 2a:方向不变,长度 ×2 -0.5a:反向,长度 ×0.5
左:平行四边形法则演示 a+b;右:数乘 2a(拉长)与 -0.5a(反向且减半)

留意 \(c=0\) 这一档:任何向量乘以 \(0\) 都得到零向量(原点)。更一般地,把一组向量的线性组合系数全取为 \(0\),结果也是零向量。这件小事在下一节很关键——它意味着用一组向量"搭"出来的所有点(它们的 span)必然包含原点,所以我们后面才会反复说"过原点的直线/平面"。

ML 和 ML 的联系

数乘 = 参数更新的一步。梯度下降里,参数更新写作 \(w \leftarrow w - \eta\,\nabla L\),其中 \(\eta\) 是学习率 learning rate(一个标量),\(\nabla L\) 是梯度(一个向量)。\(\eta\,\nabla L\) 就是数乘——决定这一步沿梯度方向迈多大。
加法 = 嵌入相加。Transformer 里,每个 token 的表示 = 词嵌入 + 位置编码(position embedding),两个向量逐分量相加,既保留"是什么词"又注入"在第几个位置"。

4. 线性组合、张成 span 与基 basis

有了加法和数乘,就能做线性组合 linear combination——这是整门线性代数最核心的操作。给定向量 \(v_1,v_2,\dots,v_k\) 和标量 \(c_1,c_2,\dots,c_k\),下式就是一个线性组合:

\[ c_1 v_1 + c_2 v_2 + \cdots + c_k v_k \]

当 \(c_i\) 取遍所有可能的实数时,所有能"搭"出来的向量构成的集合,叫作这组向量的张成 span。(回忆上一节:当所有 \(c_i=0\) 时得到零向量,所以任何 span 都包含原点。)

二维直觉:两个不共线向量张成整个平面

取两个标准向量 \(e_1=[1,0]\) 和 \(e_2=[0,1]\)。任何二维向量 \([x,y]\) 都能写成 \(x\,e_1+y\,e_2\)。所以 \(\{e_1,e_2\}\) 的 span 就是整个平面 \(\mathbb{R}^2\)。其实只要两个向量不共线(不指向同一条直线),它们就能张成整个平面。

反过来,如果两个向量共线,比如 \([1,2]\) 和 \([2,4]\)(后者是前者的 2 倍),那它们的所有线性组合都落在同一条过原点的直线上——span 只是一条直线,覆盖不了整个平面。这种"一个能被另一个表示出来"的情形叫线性相关 linearly dependent;反之,谁也表示不了谁,叫线性无关 linearly independent

张成空间与基:线性无关张成平面,线性相关只张成一条直线 左图两个不共线向量 e1、e2 张成整个平面 R²;右图两个共线向量 v 与 2v 只能张成一条过原点的直线。 x y O e₁ e₂ span = 整个平面 R² 线性无关 x y O 2v v span = 一条直线 线性相关
左:两个不共线向量张成整个平面(线性组合网格);右:两个共线向量只能张成一条直线

一组线性无关且能张成整个空间的向量,就叫这个空间的一组基 basis。基是空间的"最小骨架":二维平面的基恰好需要 2 个向量,多了冗余,少了不够。基里向量的个数,就是空间的维度 dimension

这里正好把第 2 节的"维度"和这里的"维度"打通:第 2 节说维度是分量个数 \(n\),这里说维度是基向量个数——两者一致,正是因为标准基 \(e_1,\dots,e_n\) 恰好有 \(n\) 个向量。还有一个关键直觉:基不是唯一的。同一个平面有无穷多组基(任意两个不共线的向量都能当基),"换一组基"本质上就是"换一个坐标系"——这正是下一课矩阵变换、以及 PCA 选主轴的出发点。

要点

  • 线性组合:用加法和数乘把一组向量"搭"成新向量。
  • span:所有能搭出来的向量的集合(一条线、一个面、或更高维空间),必过原点。
  • 线性无关:组里没有哪个向量是其他向量的线性组合(没有冗余)。
  • 基 basis:线性无关 + 张成全空间;基向量个数 = 维度;同一空间的基不唯一。

ML 和 ML 的联系

神经元输出就是线性组合。单个神经元先算 \(w^\top x = w_1x_1+w_2x_2+\cdots+w_nx_n\),这正是输入特征以权重为系数的线性组合。
嵌入空间的类比。著名现象"国王 − 男人 + 女人 ≈ 王后"——一个概念可以由已知向量线性组合得到,这正是 span 思想的体现。需要提醒的是:这种漂亮的线性结构在词向量中常被观察到,但并非处处成立,近年研究也指出它部分依赖具体的训练和后处理方式,不必把它当成铁律。理解 span,能帮你理解为什么模型有时能"组合"出训练中没直接见过的概念。

5. 点积的两副面孔

点积 dot product(又叫内积 inner product)是机器学习里出现频率最高的运算,几乎没有之一。它有两个等价的定义。

代数定义

\[ a\cdot b=\sum_{i=1}^{n} a_i b_i = a_1b_1+a_2b_2+\cdots+a_nb_n \]

把对应分量相乘再求和,得到一个数(标量)。

记号小桥:\(w^\top x\) 是什么?

ML 文献里点积常写成 \(w^\top x\)。这里的 \(^\top\) 是转置 transpose,意思就是"行列互换":把列向量 \(w\) 转置成一行,再与列向量 \(x\) 逐分量相乘求和。所以 \(w^\top x\)、\(w\cdot x\)、\(\sum_i w_i x_i\) 是同一个数,只是写法不同。下面 ML 框里出现的 \(q^\top k\) 同理。

你只需要知道的三角

下面的几何定义会用到夹角 \(\theta\) 和 \(\cos\theta\)。不熟三角也没关系,你只需要记住 \(\cos\theta\) 衡量"两个方向有多接近",并记牢三个锚点:

  • 夹角 \(0^\circ\)(同向):\(\cos 0^\circ=1\)(最接近)。
  • 夹角 \(90^\circ\)(垂直):\(\cos 90^\circ=0\)(互不相干)。
  • 夹角 \(180^\circ\)(反向):\(\cos 180^\circ=-1\)(最相反)。

角度从 \(0^\circ\) 增大到 \(180^\circ\),\(\cos\theta\) 就从 \(1\) 平滑地下降到 \(-1\)。直角三角形里"邻边比斜边"就是 \(\cos\),这点直觉足够支撑本课所有内容。

几何定义

\[ a\cdot b=\|a\|\,\|b\|\cos\theta \]

其中 \(\|a\|=\sqrt{a\cdot a}=\sqrt{\sum_i a_i^2}\) 就是第 3 节讲过的范数(长度),\(\theta\) 是两向量之间的夹角。这个定义告诉我们:点积衡量的是"两个向量有多大程度指向同一个方向"。

点积的代数定义与几何定义等价 二维坐标系中向量 a 与 b 的夹角 θ,以及 b 在 a 上的投影长度 ‖b‖cosθ,并标注 a·b 的两种等价定义。 x y θ a b O ‖b‖cosθ a · b = Σ aᵢbᵢ = ‖a‖‖b‖cosθ 代数定义 = 几何定义(两副面孔等价)
向量 a、b 的夹角 θ 与 b 在 a 上的投影长度 ‖b‖cosθ,标注两副面孔等价

两个定义为什么等价? 这里给一个直觉版理由,不是严格证明。我们先承认一个事实:点积只跟两个向量的长度和夹角有关,与坐标系怎么摆放无关(即点积在旋转坐标系下不变)。既然如此,我们干脆把坐标轴转一下,让 \(a\) 正好躺在 \(x\) 轴上,于是 \(a=[\|a\|,\,0]\)。此时 \(b\) 与 \(x\) 轴的夹角正好是 \(\theta\),由直角三角形分解,它的水平分量是 \(\|b\|\cos\theta\)、竖直分量是 \(\|b\|\sin\theta\),即 \(b=[\|b\|\cos\theta,\ \|b\|\sin\theta]\)。代入代数定义:

\[ a\cdot b=\|a\|\cdot\|b\|\cos\theta+0\cdot\|b\|\sin\theta=\|a\|\,\|b\|\cos\theta \]

两副面孔合二为一。(这里"旋转不变性"被当作直觉前提,严格证明留待后面学了正交矩阵再补。)

易错

点积的结果是一个标量,不是向量!\(a\cdot b\) 算完是一个数。另外别把点积和"逐分量相乘"混为一谈——逐分量相乘 \([a_1b_1, a_2b_2]\) 仍是向量(NumPy 里是 a*b),而点积要再求和(a@bnp.dot)。

ML 和 ML 的联系

点积是 ML 计算的"基本粒子":单个神经元的加权和 \(w^\top x\) 是点积;Transformer 注意力机制里 query 和 key 的打分 \(q^\top k\) 是点积;线性回归的预测 \(\hat y=w^\top x\) 是点积。当你看到矩阵乘法时,记住它无非是大量点积的批量打包。

6. 从点积到投影、夹角与余弦相似度

投影:标量投影与投影向量

把 \(b\) 投影到 \(a\) 的方向上,先看标量投影 scalar projection——也就是 \(b\) 在 \(a\) 方向上的"影子"长度(带符号):

\[ \text{标量投影}=\|b\|\cos\theta=\frac{a\cdot b}{\|a\|} \]

它回答的问题是:"沿着 \(a\) 这个方向看,\(b\) 有多大成分?" 注意这个值可正可负:当夹角 \(\theta>90^\circ\)(\(\cos\theta<0\))时它为负,负号表示投影落在 \(a\) 的反方向,并不是"长度为负"。

很多场景(最小二乘、正交分解、PCA)真正要的是投影向量 projection vector——\(b\) 沿 \(a\) 方向的那个分量向量,它把上面的标量再乘回 \(a\) 的单位方向:

\[ \operatorname{proj}_a(b)=\frac{a\cdot b}{\|a\|^2}\,a=\frac{a\cdot b}{a\cdot a}\,a \]

几何上,\(\operatorname{proj}_a(b)\) 就是把 \(b\) 投到 \(a\) 所在直线上得到的那支箭头;\(b\) 减去它,剩下的部分恰好与 \(a\) 正交——这就是"正交分解"的雏形,后面 PCA、最小二乘都是它的放大版。

夹角与余弦相似度

把几何定义反解出 \(\cos\theta\),就得到余弦相似度 cosine similarity

\[ \cos\theta=\frac{a\cdot b}{\|a\|\,\|b\|} =\frac{\sum_i a_i b_i}{\sqrt{\sum_i a_i^2}\,\sqrt{\sum_i b_i^2}} \]

它的取值范围是 \([-1, 1]\),含义是"两个向量方向有多接近",与长度无关——这是它相比裸点积的关键优势:只比方向,不比大小。

余弦相似度三种情形:同向、正交、反向cosθ ≈ 1Oab高度相似cosθ = 0.98cosθ = 0Oab不相关 / 正交cosθ = 0.00cosθ ≈ -1Oab强烈相反cosθ = -0.97
三组向量分别展示 cosθ≈1(同向)、cosθ≈0(正交)、cosθ≈-1(反向)对应的余弦相似度

ML 和 ML 的联系

余弦相似度是语义检索的引擎。把每个文档/句子编码成嵌入向量后,要找"和查询最相关的内容",就是找与 query 向量夹角最小(余弦相似度最大)的那些向量。这正是 RAG(检索增强生成)召回、语义搜索、"猜你喜欢"推荐相似商品背后的核心计算。用余弦而非欧氏距离,是因为我们关心"主题方向"而非"向量大小"——一篇长文和一篇短文只要主题一致,方向就该接近。

例题

例题 1:向量的和、范数与点积

设 \(a=[3,4]\),\(b=[4,3]\)。

(1) 求 \(a+b\):

\[a+b=[3+4,\ 4+3]=[7,\ 7]\]

(2) 求范数:

\[\|a\|=\sqrt{3^2+4^2}=\sqrt{9+16}=\sqrt{25}=5\] \[\|b\|=\sqrt{4^2+3^2}=\sqrt{16+9}=\sqrt{25}=5\]

(3) 求点积(代数定义):

\[a\cdot b=3\times4+4\times3=12+12=24\]

例题 2:夹角的余弦(接例题 1)

用余弦相似度公式计算 \(a=[3,4]\) 与 \(b=[4,3]\) 的夹角余弦:

\[ \cos\theta=\frac{a\cdot b}{\|a\|\,\|b\|}=\frac{24}{5\times5}=\frac{24}{25}=0.96 \]

所以 \(\theta=\arccos(0.96)\approx 16.26^\circ\)。两个向量方向相当接近,余弦相似度 \(0.96\),说明高度相似。

验证两副面孔等价:几何定义应给出 \(\|a\|\|b\|\cos\theta=5\times5\times0.96=24\),与代数定义算出的点积 \(24\) 完全一致。

例题 3:正交与反向(体会余弦的三种情形)

设 \(u=[1,0]\),\(v=[0,1]\),\(w=[-1,0]\)。

  • \(u\cdot v=1\times0+0\times1=0\),故 \(\cos\theta=0\),二者正交(夹角 \(90^\circ\)),不相关。
  • \(u\cdot w=1\times(-1)+0\times0=-1\),而 \(\|u\|=\|w\|=1\),故 \(\cos\theta=-1\),二者完全反向(夹角 \(180^\circ\))。

调一调,观察现象

下面三个小实验都只用 numpy 和 print,几秒就能跑完。建议你先猜结果,再运行对照——"猜错"的地方往往就是直觉需要修正的地方。

实验 1:数乘只缩放长度,方向感由符号决定

改什么:把同一个向量 \(a=[3,4]\) 分别乘以 \(2、0.5、-1、0\)。
预期看到:范数依次变成 \(10、2.5、5、0\)(即原长 \(5\) 的 \(2、0.5、1、0\) 倍);\(-1\) 那档长度没变但每个分量都翻了号(变成 \([-3,-4]\)),\(0\) 那档变成零向量。
为什么:数乘 \(c\,a\) 把范数缩放 \(|c|\) 倍,所以 \(c=-1\) 长度不变、只是反向;\(c=0\) 把向量压到原点。

import numpy as np
a = np.array([3.0, 4.0])
for c in [2, 0.5, -1, 0]:
    v = c * a
    print("c=", c, "vec=", v, "norm=", np.linalg.norm(v))
# norm 依次: 10.0, 2.5, 5.0, 0.0  (= 原长5 的 2,0.5,1,0 倍)
# vec  依次: [6. 8.], [1.5 2.], [-3. -4.], [0. 0.]

实验 2:转动第二个向量,看点积如何从正穿过零再变负

改什么:固定 \(u=[1,0]\),让 \(v\) 依次取同向、垂直、钝角、反向四种方向。
预期看到:夹角依次约 \(0^\circ、90^\circ、135^\circ、180^\circ\),余弦依次约 \(1、0、-0.707、-1\),点积符号跟着由正 → 零 → 负。
为什么:点积 \(=\|u\|\|v\|\cos\theta\),符号完全由 \(\cos\theta\) 决定——垂直时点积恰为 \(0\)(正交),这正是课文里的三个锚点。

import numpy as np
u = np.array([1.0, 0.0])
for v in [[1,0], [0,1], [-1,1], [-1,0]]:
    v = np.array(v, float)
    d = u @ v
    cos = d / (np.linalg.norm(u) * np.linalg.norm(v))
    deg = np.degrees(np.arccos(np.clip(cos, -1, 1)))
    print("v=", v, "dot=", d, "cos=", round(cos,3), "deg=", round(deg,1))
# dot: 1.0, 0.0, -1.0, -1.0 ; cos: 1.0, 0.0, -0.707, -1.0 ; deg: 0, 90, 135, 180

实验 3:共线就"塌成一条线"——用面积判 span

改什么:用 \(2\times2\) 行列式(= 两向量张成的平行四边形带符号面积)判断三组向量。
预期看到:\(\{[1,0],[0,1]\}\) 行列式 \(=1\),\(\{[2,1],[4,2]\}\) 行列式 \(=0\),\(\{[1,1],[1,-1]\}\) 行列式 \(=-2\)。
为什么:行列式为 \(0\) 说明面积塌没了、两向量共线,span 只是一条过原点的直线;非 \(0\) 则不共线,张成整个平面。(行列式的正负号只反映两向量的左右次序,判 span 只看它是不是 \(0\)。)

import numpy as np
sets = {
    "e1,e2":    ([1,0], [0,1]),
    "collinear":([2,1], [4,2]),
    "indep":    ([1,1], [1,-1]),
}
for name, (p, q) in sets.items():
    M = np.array([p, q], float).T   # 两向量作为列
    print(name, "det=", round(np.linalg.det(M), 3))
# det: 1.0(平面), 0.0(直线), -2.0(平面)

动手练习

  1. 手算热身:设 \(a=[1,2,2]\),\(b=[2,2,1]\)。手算 \(a+b\)、\(\|a\|\)、\(\|b\|\)、\(a\cdot b\) 与 \(\cos\theta\)。(提示:\(\|a\|=3\),\(a\cdot b=8\),\(\cos\theta=8/9\approx0.889\)。)
  2. 三视角切换:把向量 \([5,-2]\) 分别写成"数据表里的一行"、"坐标列",并用一句话描述它作为几何箭头的方向(指向第几象限)。
  3. span 判断:判断下面每组向量张成什么——是一条直线还是整个平面?(a) \([1,0]\) 与 \([0,1]\);(b) \([2,1]\) 与 \([4,2]\);(c) \([1,1]\) 与 \([1,-1]\)。(提示:判断共线的代数判据是"是否存在常数 \(k\) 使一个向量等于另一个的 \(k\) 倍"——存在则共线,span 是直线;不存在则不共线,span 是整个平面。)
  4. 进阶:高维与"必相关":(a) 判断三维向量 \([1,2,3]\) 与 \([2,4,6]\) 是否共线(提示:找有没有公共倍数 \(k\))。(b) 给定三个二维向量 \([1,0]\)、\([0,1]\)、\([1,1]\),它们的 span 是什么?想一想:在二维平面里,三个向量为什么必然线性相关(总有一个能被另外两个表示出来)?
  5. NumPy 小实验:补全下面的代码骨架,用 NumPy 计算范数、点积、夹角与余弦相似度,并验证它和你手算的结果一致。
import numpy as np

# 构造两个向量
a = np.array([3.0, 4.0])
b = np.array([4.0, 3.0])

# 1) 向量加法与数乘
print("a + b      =", a + b)          # 期望 [7. 7.]
print("2 * a      =", 2 * a)          # 期望 [6. 8.]
print("-0.5 * a   =", -0.5 * a)       # 期望 [-1.5 -2.]
print("0 * a      =", 0 * a)          # 期望 [0. 0.]  零向量,落在原点

# 2) 范数(L2 长度)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
print("||a|| =", norm_a, " ||b|| =", norm_b)   # 期望 5.0 5.0

# 3) 点积:以下三种写法等价
dot1 = np.dot(a, b)
dot2 = a @ b
dot3 = np.sum(a * b)                  # 注意 a*b 是逐分量相乘,再求和
print("dot =", dot1, dot2, dot3)      # 期望 24.0

# 4) 余弦相似度与夹角
cos_sim = (a @ b) / (norm_a * norm_b)
theta_rad = np.arccos(np.clip(cos_sim, -1.0, 1.0))
print("cosine similarity =", cos_sim)              # 期望 0.96
print("angle (deg)       =", np.degrees(theta_rad))# 期望 ~16.26

# 5) 动手:换成你自己的两个向量,验证手算结果
# c = np.array([...]); d = np.array([...])
# ...

掌握自检

要点:小结与下一课预告

本课我们确立了 ML 的"原子"——向量,掌握了三种视角、范数(长度)、加法与数乘的几何(含零向量)、线性组合 / span / 基这套地基,以及点积的两副面孔和由它衍生的投影与余弦相似度。下一课:矩阵 = 线性变换。如果说向量是空间里的"点",那么矩阵就是"移动整个空间的动作"——旋转、拉伸、投影。我们会看到,"换一组基 = 换坐标系"如何用矩阵表达,以及神经网络的每一层,本质上就是一次"矩阵变换 + 非线性"。