🧠 Brainstorming Beyond Textbooks
Brainstorming
这篇小记起源于 2025 年 4 月 3 日的 MAT 2041 课堂上的一次让我走神的思考。
如何求求反三角矩阵的行列式?
行列式计算:行或列两两交换时,结果乘 -1; 统计学:一列队伍从矮到高排序经过交换变成从高到矮排序在冒泡排序下交换次数是:$${n(n-1)\over2}\ (排序因子)$$ 把矩阵列空间含0多的向量想象成较矮的人,那么两个问题本质上是等价的。已知三角矩阵行列式均为 1,反三角矩阵行列式就为: $$ (-1)^{\frac{n(n-1)}{2}} \cdot\prod_{i=1}^na_{(i,\ n-i+1)}\ (反对角线元素之积) $$
最速降线与微积分的雏形
伽利略一生没能解答的谜题:从任意较高点到较低点间,用时最短的路径是什么?
光的折射:由于费马原理(最短时间原理),光在不同介质中速度不同,在临界面折射前后与平面法线的夹角正弦比为折射前后的速度比,这让光在介质不同的两点间用最短的时间运动——这是光的最速线: $$ {sin(\theta_1)\over sin(\theta_2)}={v_1\over v_2}\ (斯涅尔定律) $$
伯努利发现,光的速度变化是离散的(瞬时的),而宏观物体运动是连续的,如果让光经过依次一层层的不同介质,越往下,让光速均匀降低。当介质数趋于无穷,光运动的折线会趋于一条平滑曲线,此时它就是最速降线。
这是微积分思维的最早雏形。
矩阵与图片
一张灰度图片,本质上可以看成一个矩阵 $A=(a_{ij})$,其中每个元素 $a_{ij}$ 对应一个像素的亮度。彩色图片则通常可以理解为三个矩阵叠在一起,分别表示 RGB 三个通道。这样一来,图片就不再只是“视觉对象”,而是一个可以被数学操作的结构。
我印象最深的是,很多在线性代数里看起来抽象的变换,到了图像里会变得非常具体。比如旋转,本质上就是把坐标向量乘上一个旋转矩阵: $$ \begin{bmatrix} x’\\ y’ \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta\\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} $$
缩放、拉伸、剪切也都可以用类似的方法理解。缩放也是一样。如果把横向放大 s_x 倍、纵向放大 s_y 倍,那么可以写成: $$ \begin{bmatrix} x’\\ y’ \end{bmatrix} = \begin{bmatrix} s_x & 0\\ 0 & s_y \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} $$
一个简单的均值模糊核可以写成: $$ K=\frac{1}{9} \begin{bmatrix} 1&1&1\\ 1&1&1\\ 1&1&1 \end{bmatrix} $$ 它在图像上滑动时,相当于把一个像素替换成周围像素的平均值。这样理解之后,我第一次觉得“模糊”并不神秘,它只是局部加权平均。相反,锐化和边缘检测其实是在强调差异,本质上和离散形式的导数有关。
矩阵压缩
比起旋转、缩放这些几何变换,更让我觉得“矩阵真的有用”的,其实是压缩。
因为一张图片如果看成一张庞大的矩阵,那么一个很自然的问题就是:这么大个矩阵,其中每个数字都同样重要吗?储存起来会不会很占地?
答案往往是否定的。
很多图片虽然看起来细节很多,但从矩阵的角度看,其中有不少信息其实是“重复的”或者“高度相关的”。这就意味着,我们未必需要把整个矩阵完整存下来,而可以只保留最重要的部分。
一个最典型的,简朴的想法就是低秩近似。
假设一张灰度图对应矩阵 $A\in\mathbb{R}^{m\times n}$。
如果它可以被写成几个简单矩阵的叠加,那么我们就不一定要存整个 A,而只需要存这些“主要成分”。
最经典的写法是奇异值分解(SVD): $$ A = U\Sigma V^{T} $$ 其中:
- U 和 V 可以理解为两组重要方向;
- $\Sigma$ 里放的是这些方向的重要程度;
- 越大的奇异值,通常代表越重要的结构。
如果只保留前 k 个最大的奇异值,就得到一个近似矩阵: $$ A_k = \sum_{i=1}^{k}\sigma_i,u_i v_i^{T} $$ 这个式子第一次让我很震撼,因为它的意思其实是:
原来一张复杂图片,可以看成若干张“基础图片”的叠加,而压缩就是只保留最重要的那几层。
一个简单的例子——低秩
$$ A= \begin{bmatrix} 2 & 2\\ 1 & 1 \end{bmatrix} $$
这个矩阵的四个元素看起来很多,但其实它的结构非常简单:每一行都一样。
它本质上可以写成 $$ A= \begin{bmatrix} 1\\ 1 \end{bmatrix} \begin{bmatrix} 2 & 1 \end{bmatrix} $$ 也就是说,它其实只需要一个列向量和一个行向量就能恢复,这就是一个秩为 1 的矩阵。这种图像在视觉上对应的是“纵向纹理重复”,列与列之间高度相关。
原来要存 4 个数:2, 2, 1, 1;
现在如果利用它的结构,只需要存: $$ \begin{bmatrix} 1\\ 1 \end{bmatrix} ,\ \begin{bmatrix} 2 & 1 \end{bmatrix} $$ 从“结构”的角度看,它其实比表面上简单得多。
这让我第一次意识到,压缩并不只是“删东西”,而是发现:有些矩阵虽然看起来大,但本质上很低维。
再看一个更复杂的例子——近似低秩
比如考虑下面这个矩阵: $$ A= \begin{bmatrix} 100 & 102 & 101\\ 98 & 100 & 99\\ 101 & 103 & 102 \end{bmatrix} $$
这个矩阵显然不像前面的例子那样“每一行都完全一样”。
但如果仔细看,会发现三行其实非常接近:
- 第一行大约是 100,102,101
- 第二行整体略低一点
- 第三行整体略高一点
也就是说,这个矩阵虽然不是严格的 rank-1,但它有一种很明显的结构:它主要像一张“基础模板”,再叠加一点小幅波动。
第一步:先抓住主结构
我们先取一个平均行向量: $$ r= \begin{bmatrix} 99.67 & 101.67 & 100.67 \end{bmatrix} $$ 然后把三行都看成这个模板的放大或缩小。
于是主结构可以近似写成一个外积: $$ A_1= \begin{bmatrix} 1\\ 1\\ 1 \end{bmatrix} \begin{bmatrix} 99.67 & 101.67 & 100.67 \end{bmatrix} = \begin{bmatrix} 99.67 & 101.67 & 100.67\\ 99.67 & 101.67 & 100.67\\ 99.67 & 101.67 & 100.67 \end{bmatrix} $$ 这就是一个 rank-1 近似。
整张图的大部分亮度结构,其实可以先用 “一种主要模式” 描述。但它当然还不够准确,因为原矩阵每一行并不完全一样。
第二步:再看误差矩阵
原矩阵和这个近似之间的差是: $$ E=A-A_1 = \begin{bmatrix} 0.33 & 0.33 & 0.33\\ -1.67 & -1.67 & -1.67\\ 1.33 & 1.33 & 1.33 \end{bmatrix} $$ 这个误差矩阵很有意思。它说明剩下的差别,其实主要不是“列结构变了”,而是“每一行整体抬高或降低了一点”。
换句话说,误差本身也还是有结构的。它还可以再写成一个外积: $$ E= \begin{bmatrix} 0.33\\ -1.67\\ 1.33 \end{bmatrix} \begin{bmatrix} 1 & 1 & 1 \end{bmatrix} $$ 于是原矩阵就可以写成:A = A1 + E $$ A= \begin{bmatrix} 1\\ 1\\ 1 \end{bmatrix} \begin{bmatrix} 99.67 & 101.67 & 100.67 \end{bmatrix} + \begin{bmatrix} 0.33\\ -1.67\\ 1.33 \end{bmatrix} \begin{bmatrix} 1 & 1 & 1 \end{bmatrix} $$ 这就是一个很好的例子:矩阵并不是“每行每列都一样”,但仍然可以拆成少数几个简单结构的叠加。
虽然这个例子没体现出存储开销的节省,但当矩阵很大时,只要它能被少数几个主结构逼近,分解后存储就会比原矩阵便宜很多。
- 比如对一个 1000 x 1000 的矩阵,如果只保留前 k=10 个主要成分,那么所需存储量大约从 1000 x 1000 = 106 降到 10(1000+1000+1)=20010。
数量级差别就体现出来了。
这就表示:第 1 项抓住最主要的整体结构,第 2 项补充第二重要的变化,第 3 项再补充更细的细节……后面越来越小的项,往往只对应较细碎的纹理或噪声。
所以更真实的图片压缩,不是因为图片“每一行都一样”,而是因为:虽然它不是完全规则的,但大部分能量集中在少数几个主要方向上。
这就是“近似低秩”的意思,我们只是在手工模拟 SVD 而已。
SVD 与奇异值
$$ A= \begin{bmatrix} 3 & 0\\ 4 & 0 \end{bmatrix} $$
我们想把它写成 $$ A=U\Sigma V^T $$ 其中:
- U 是左奇异向量组成的正交矩阵
- \Sigma 是奇异值对角矩阵
- V 是右奇异向量组成的正交矩阵
第一步:求 ATA
$$ A^TA= \begin{bmatrix} 3 & 4\\ 0 & 0 \end{bmatrix} \begin{bmatrix} 3 & 0\\ 4 & 0 \end{bmatrix} = \begin{bmatrix} 25 & 0\\ 0 & 0 \end{bmatrix} $$
它的特征值很明显是: $$ \lambda_1=25,\quad \lambda_2=0 $$ 所以奇异值就是特征值开根号: $$ \sigma_1=\sqrt{25}=5,\quad \sigma_2=\sqrt{0}=0 $$ 因此 $$ \Sigma= \begin{bmatrix} 5 & 0\\ 0 & 0 \end{bmatrix} $$
第二步:求 V
因为 ATA 已经是对角矩阵,所以它的标准特征向量就是: $$ v_1= \begin{bmatrix} 1\\ 0 \end{bmatrix}, \quad v_2= \begin{bmatrix} 0\\ 1 \end{bmatrix} $$ 所以: $$ V= \begin{bmatrix} 1 & 0\\ 0 & 1 \end{bmatrix} $$ 这里刚好就是单位矩阵。
第三步:求 U
用公式 $$ u_1=\frac{1}{\sigma_1}Av_1 $$ 先算 $$ Av_1= \begin{bmatrix} 3 & 0\\ 4 & 0 \end{bmatrix} \begin{bmatrix} 1\\ 0 \end{bmatrix} = \begin{bmatrix} 3\\ 4 \end{bmatrix} $$ 所以 $$ u_1=\frac{1}{5} \begin{bmatrix} 3\\ 4 \end{bmatrix} = \begin{bmatrix} 3/5\\ 4/5 \end{bmatrix} $$ 再找一个和它正交、长度为 1 的向量,可以取 $$ u_2= \begin{bmatrix} -4/5\\ 3/5 \end{bmatrix} $$ 于是 $$ U= \begin{bmatrix} 3/5 & -4/5\\ 4/5 & 3/5 \end{bmatrix} $$ 所以这个矩阵的一个 SVD 分解是: $$ A= \begin{bmatrix} 3/5 & -4/5\\ 4/5 & 3/5 \end{bmatrix} \begin{bmatrix} 5 & 0\\ 0 & 0 \end{bmatrix} \begin{bmatrix} 1 & 0\\ 0 & 1 \end{bmatrix}^T $$
因为 V=I,所以也可以直接写成: $$ A= \begin{bmatrix} 3/5 & -4/5\\ 4/5 & 3/5 \end{bmatrix} \begin{bmatrix} 5 & 0\\ 0 & 0 \end{bmatrix} $$
SVD 最妙的地方在于,它不是随便拆,而是按“重要程度”排序。
如果奇异值满足 $$ \sigma_1 \ge \sigma_2 \ge \cdots \ge \sigma_r > 0 $$ 那通常说明:
- $\sigma_1$ 对应最主要的整体结构;
- 后面的奇异值对应越来越细的变化;
- 很小的奇异值往往只对应细碎纹理、噪声或者次要差别。
所以压缩时只保留前 k 项: $$ A_k = \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \cdots + \sigma_k u_k v_k^T $$ 直观上就是:大轮廓留下来,很细的局部变化被舍弃一部分。这也是为什么低秩近似压缩后的图片,通常会先失去细节,但大体轮廓还在。
这一部分最大的收获是:我开始意识到线性代数处理的是“结构”,微积分处理的是“变化”,而计算机视觉正好是在离散世界里同时处理这两件事。以前我觉得数学、图像、计算机是不同学科,后来发现它们其实只是同一个问题的不同表达。
计算机分层记忆与笔记结构
我觉得最有启发的一部分,是把计算机里的缓存层级和个人知识体系联系起来。
在计算机里,寄存器、Cache、内存、磁盘形成了一个典型的分层结构。越靠近处理器,速度越快,但容量越小;越远的存储容量越大,但访问更慢。系统性能的关键,不是把所有数据都放在最快的地方,而是让最常用、最关键的数据尽量离处理器更近。
这一点和学习其实非常像。一个人的知识也可以分层:
- 最顶层是随手就能调用的定义、公式和框架;
- 中间层是理解过程、易错点、不同知识点之间的联系;
- 更底层才是课本、讲义、论文和完整笔记。
我以前做笔记时,经常默认“越详细越好”。结果就是资料存了很多,但真到做题或写东西的时候,反而调不出来。现在回头看,这其实像是把所有知识都堆在“硬盘”里,却没有设计自己的 cache。
所以我后来会更有意识地把笔记分成三层。第一层只放最常用的核心内容,尽量短,像自己的快速调用区;第二层补充推导、联系和误区,帮助理解;第三层才是完整资料,用来回溯。这种结构让我感觉知识不是单纯“存起来”,而是更像被组织成了一个可以高频调用的系统。
我觉得这也是我最近比较大的一个改变:以前我总担心自己学得不够多,现在更关注的是,自己能不能把真正重要的东西放在最容易调用的位置。
小结
这几部分内容给我的感觉,不是“又学了几个新公式”,而是让我开始更清楚地看到不同学科之间其实有很多共通结构。
以前我总觉得课程是分开的,现在越来越觉得,它们其实一直在反复讨论类似的问题:怎么表示结构,怎么处理变化,怎么在复杂信息里保留最重要的部分。
不需要害怕“天马行空”,思考不会是浪费时间;反而,只有不愿思考才是粗浅的得过且过。