傅里叶根本不在信号里
前十八章的横轴一直是时间或者位置,很容易让人以为这是一门关于「波」的手艺。这一章走出去。你会看到同一台机器在概率论里一行证完中心极限定理,在物理实验室里由自然界亲自执行,在量子计算机里找出一个周期——而它的入场券从头到尾只有四个字。
拿一个均匀分布(比如 0 到 1 之间的随机数),让 n 个独立的这种随机数相加,看看和的分布长什么样。统计课上说,n 大了就会趋近正态分布,经验法则是「n ≥ 30」。
问:实际上呢?把「和的分布」与「同均值同方差的正态分布」逐点比,最大偏差相对峰值有多少?
一、概率论:一行证明中心极限定理
这本书前面两章已经把所有零件备齐了,这里只需要把它们摆一起:
1. 两个独立随机变量**相加**,密度是两个密度的**卷积** ← 第 13 章
2. 卷积在频域里是**相乘** ← 第 14 章
3. 概率密度的傅里叶变换有个名字,叫**特征函数** φ(t)
于是:n 个独立同分布的变量相加 → 特征函数变成 φ(t)ⁿ
4. 任何一个特征函数在 t=0 附近都长这样(把 e^(itx) 展开取期望):
φ(t) = 1 + iμt − (σ²+μ²)t²/2 + …
取 μ=0、σ=1(标准化),就是 φ(t) ≈ 1 − t²/2 + …
5. 把 n 个标准化之后的加起来(除以 √n 保持方差):
n
( 1 − t²/2n ) → e^(−t²/2) n → ∞
这一步就是那个人人见过的 (1 + x/n)ⁿ → eˣ。
6. 而 e^(−t²/2) 逆变换回去,正是**高斯**。
中心极限定理不是关于「随机」的定理,是关于「反复相乘」的定理。
看第 5 步:无论原来的分布多古怪,它的特征函数在 0 附近总是 1 减去一个二次项(这只需要方差存在)。而一个略小于 1 的数自乘 n 次,会把除了顶点附近之外的一切压成零——n 次方这个动作把所有分布的差异碾平了,只剩下顶点附近那个二次项。
而「顶点附近是二次的」这件事逆变换回去,就是高斯。高斯之所以特殊,是因为它是这个「反复相乘」过程的不动点(第 10 章说过:高斯的傅里叶变换还是高斯)。
本机把它量了出来。均匀分布反复卷积,每一步都和同均值同方差的高斯逐点比:
相加的个数 n 与高斯的最大偏差(相对峰值)
──────────────────────────────────────────
1 68.802% ← 就是一个方块,当然不像
2 7.592% ← 卷一次就成了三角形,已经很像了
3 6.385%
4 3.648%
5 3.186%
6 2.580%
──────────────────────────────────────────
n = 2 就只差 7.6%。那条「n ≥ 30」的经验法则不是这么来的——它是为了兼容那些偏得很厉害或者尾巴很重的分布(收敛速度由三阶矩决定,这叫 Berry–Esseen 定理)。对一个对称的、有界的分布,两三个就够了;对一个重尾分布,三万个都不够(如果方差不存在,永远不够)。
这也解释了一个常见的观察:为什么现实世界里高斯分布到处都是?因为凡是「很多个小的、独立的东西加起来」的量,都逃不掉第 5 步那个碾压。测量误差、身高、噪声——不是它们本身有什么高斯的性质,是「相加」这个动作的性质。
二、物理:这一次是自然界在算
这一节是这本书最深的一层。前面所有地方,傅里叶变换都是我们用来分析数据的工具。而在这里,没有人在算它,是物理本身在算。
远场衍射图样,就是孔径的傅里叶变换。光穿过一个开口,落在很远处的屏幕上,那个明暗图案的数学形式,严格地就是开口形状的二维傅里叶变换。
- 双缝:两条缝的傅里叶变换是一个余弦,所以屏上是等间距的条纹。本机按 λ = 633 nm(氦氖激光)、缝距 d = 0.5 mm、屏距 L = 2 m 算:条纹间距 2.53 mm。
- 单缝:一个矩形的傅里叶变换是 sinc——所以单缝衍射图样中间一个亮的宽条,两边一串越来越暗的次级条纹。那正是第 8 章矩形窗的旁瓣,只不过这次你能用眼睛直接看见。
- 圆孔:变换是贝塞尔函数,图样是一个亮盘加一圈圈环,叫艾里斑。这就是所有望远镜和相机镜头分辨率的极限——第 10 章那条不等式的光学版本。
晶体更彻底:一块晶体是电子密度在三维空间里的周期重复,它的傅里叶变换因此是一组离散的点。X 射线打上去,底片上就是那组点。本机按硅的 (111) 面间距 2.82 Å、铜靶 Kα 1.54 Å 算布拉格角:15.8°。
整个结构生物学就架在这上面。1952 年 Franklin 拍下的「51 号照片」上那个 X 形的图案,是 DNA 双螺旋的傅里叶变换——螺旋的变换正好是 X 形,而 X 的张角直接给出螺距与半径之比。Watson 和 Crick 要做的,是把它逆变换回去。
而这里有一个第 4 章埋下的钉子:底片只记录强度,也就是幅度的平方。相位在测量的那一刻就永久丢失了。而第 4 章那个实验说明,内容主要在相位里。这就是晶体学的「相位问题」,一个折磨了这个领域半个多世纪、拿了好几次诺贝尔奖去解决的难题。
三、算法:Shor 用它拆大整数
Shor 算法能在多项式时间里分解大整数,而它的核心只有一步:找周期。
把 f(x) = aˣ mod N 这个函数的值排成一列,它是周期的,周期记作 r。只要知道 r,分解 N 就是初中数学。难点在于 r 可能极大,经典计算机没法枚举。
量子计算机的做法:把所有 x 的叠加态送进去,然后做一次量子傅里叶变换——测量结果会以极高的概率落在 N/r 的整数倍上。
这一步在经典机器上就能演示。造一个周期 r = 6 的序列(每 6 个点有一个 1),做一次变换:
N = 1024,周期 r = 6 谱上最高的几个峰落在 k = 0 171 341 512 683 853 而 N / r = 1024 / 6 = 170.67 171 ≈ 1×170.67 341 ≈ 2×170.67 512 = 3×170.67 683 ≈ 4×170.67 853 ≈ 5×170.67
周期在时域里要一个一个数,在频域里是一根峰的位置。这就是量子傅里叶变换在 Shor 算法里干的全部事情——量子部分提供的是「能把所有 x 一次性送进去」,而傅里叶部分提供的是「把周期变成一个能一次读出来的位置」。
这么多毫不相干的地方为什么是同一台机器?入场券只有一条:
只要一个结构上有「平移」这个操作,而且规则在平移下不变,那么这个结构上就存在一个傅里叶变换。
- 时间轴可以平移(往后三秒,规则一样)→ 有。
- 空间可以平移(往右一毫米,规则一样)→ 有。
- 整数模 N 可以「加一」(绕回来)→ 有,就是 DFT。
- 晶格可以按晶胞平移 → 有,倒易点阵就是它。
- 一个群可以用元素去乘 → 有,那是群上的傅里叶变换,Shor 用的是这一个。
而复指数之所以永远是那组基,因为它是平移的特征函数——平移它,它只变成自己乘一个常数(第 14 章那条定理的全部依据)。「平移不变」这四个字,就是这本书全部内容的边界。
亲手看中心极限定理收敛(不需要任何随机数,纯卷积):
import numpy as np
dx = 1/256
p0 = np.ones(256) / 256 # 离散化的 U(0,1)
cur = p0.copy()
for n in range(1, 7):
if n > 1:
cur = np.convolve(cur, p0)
x = np.arange(len(cur)) * dx
m = (cur*x).sum() / cur.sum()
sd = np.sqrt((cur*(x-m)**2).sum() / cur.sum())
g = np.exp(-(x-m)**2/(2*sd**2)) / (sd*np.sqrt(2*np.pi)) * dx
print(f'n={n} 与高斯最大偏差 {100*np.abs(cur-g).max()/cur.max():.3f}%')
# n=1 68.802% / n=2 7.592% / n=3 6.385% / n=4 3.648% / n=5 3.186% / n=6 2.580%
把 p0 换成一个偏得厉害的分布(比如 p0 = np.exp(-np.arange(256)*0.05); p0 /= p0.sum(),一个指数分布),再跑一遍——你会看到收敛慢得多。这一步能让你亲手确认「n ≥ 30」为什么是一条经验法则而不是定理。
周期查找(Shor 那一步的经典版):
N, r = 1024, 6 x = np.array([1.0 if n % r == 0 else 0.0 for n in range(N)]) m = np.abs(np.fft.fft(x)) print(sorted(np.argsort(m)[-6:]), ' N/r =', N/r) # [0, 171, 341, 512, 683, 853] N/r = 170.666...
python3 -c "print('条纹间距 %.2f mm' % (1000*633e-9*2.0/0.5e-3))"
在线跑:Google Colab。想亲眼看衍射:一支激光笔加一根头发(头发的宽度大约 0.07 mm),照到几米外的墙上,那串条纹就是矩形的傅里叶变换。测一下条纹间距,你能反推出头发的直径。
- 你的 A/B 测试。「样本量够大时,均值近似正态」这条假设支撑着几乎所有的显著性检验。而它成立的速度取决于你那个指标的分布形状——收入、时长这类重尾指标,收敛慢得多,几千个样本可能还不够。这就是为什么这类指标常要做对数变换或者用非参数方法。这一章解释了那条建议背后的机制。
- 图像的傅里叶光学。一个透镜在焦平面上做的,物理上就是一次傅里叶变换。所以「4f 系统」可以用一块挡板在焦平面上做频域滤波——用一片纸板实现一个低通滤波器。这是光计算最早的形态,今天做光学神经网络的人在重新拾起它。
- 图神经网络。「图上的傅里叶变换」是拉普拉斯矩阵的特征分解,早期的图卷积网络(ChebNet、GCN)就是从这个定义出发的。它成立的理由和这一章一样:图上的「平移」是邻接关系,而拉普拉斯的特征向量正是那个结构的复指数。
- 纠错码。Reed–Muller 码、Walsh–Hadamard 变换、以及布尔函数分析里的「傅里叶谱」,全都是在 (Z/2)ⁿ 这个群上做傅里叶。Grover 和 Deutsch–Jozsa 这些量子算法的核心也是它。
- 晶体学与药物设计。今天绝大多数已知的蛋白质结构,来自 X 射线晶体学或冷冻电镜,两者的重建都绕不开这一章。
「中心极限定理说:只要样本够多,什么东西都会变成正态分布。」
漏掉了两个关键前提,而漏掉它们的代价在金融和风控里是天价。
前提一:方差必须存在。看上面那个证明的第 4 步——展开式里那个 t² 的系数是方差。如果方差是无穷的(比如柯西分布、或者某些幂律尾),那一步就不成立,定理不适用。柯西分布的 n 个样本取平均,分布和单个样本完全一样,加多少个都不会变窄。
前提二:是「相加」,不是别的。定理讲的是和(或者均值)的分布,不是原始数据的分布。身高近似正态,不是因为身高「被平均了」,而是因为它近似是很多个小遗传因素和环境因素相加的结果。而收入不是相加出来的(它更像是相乘出来的),所以收入的分布是对数正态或者幂律,不是正态——相乘的东西取对数才变成相加,这就是为什么对数正态在自然界里同样常见。
判据是:问「这个量是由很多个小的、独立的、方差有限的东西加出来的吗」。三个条件缺一不可,缺了哪个,尾巴就会比你以为的厚,而风险都藏在尾巴里。
正确答案是 C:n = 2 时只差 7.592%,n = 6 差 2.580%。
A、B 「n ≥ 30 / n ≥ 10」——这两个数是经验法则,为的是覆盖那些偏度大、尾巴重的分布,不是收敛的实际速度。对均匀分布这种对称有界的情况,卷一次(n = 2)就已经从方块变成了三角形,肉眼就很像钟形了。把一条为最坏情况准备的经验法则当成定理,是统计课留下的一个普遍误会。 D 「永远不会真的是正态」——这句话本身完全正确:n 个均匀分布的和确实永远是分段多项式(叫 Irwin–Hall 分布),支撑集有限,而高斯的尾巴伸到无穷。但「不等于」和「不像」是两回事——中心极限定理说的从来不是「等于」,是「误差趋于零」。上面那张表就是误差本身:2.580% 而且还在降。这个选项是本书里少有的「说得对但答错了」,因为它答的是另一个问题。这是整本书「换个域看」这个动作最漂亮的一次收尾,因为它换的甚至不是一个「域」——概率密度和特征函数,听起来和时域频域毫无关系。但机制完全一样:一个在这边很难的运算(卷积/积分),在那边是一个简单的运算(乘法/幂)。
而这本书真正想留给你的,是下面这个更一般的问题。以后遇到任何一个难算的运算,先问三句:
- 这个运算是线性的吗?
- 它在某种平移下不变吗?
- 如果是,那对应的「频域」是什么,在那边它会不会变成乘法?
三句都是「是」的时候,你手里就有一台机器。而这三句话,就是这本书的全部。
这一章的一句话
傅里叶不是一门关于波的手艺,是关于「平移不变」的手艺;只要一个结构上有平移这个操作而规则不变,那里就有一台同样的机器——在概率论里它一行证完中心极限定理,在实验室里它由自然界亲自执行。
下一章,也就是最后一章,收尾:一张二十条的错误直觉自查表(把前十九章那些「✗」收成一页),按方向分岔的继续往下走,以及回到第一张图——你现在知道那根针指的是什么了。