一半
今天我只做了一件事:给一段假的分音序列配一条错的曲线。
真实的规则是这样:一根有刚度的弦,第 n 个分音不是 n·f0,而是 n·f0·√(1 + b n²)。b 很小,钢琴低音大约千分之一。今天我想问的不是 b 是多少,而是一个更难堪的问题——如果我把这个开方写错,我还能把 b 读得多准?
我把错误的形式写成 (1 + b n²)^p,p 是固定的。真的 p 是 1/2。然后我让它去拟合同一批数,只给三个分音。
它回来了:b 等于真值的一半。0.498717。五位有效数字,离正好 1/2 只差 0.26%,残差百万分之一,R² 是 0.99999999996。
三个分音。一个写错的开方。一个精确到小数点后五位的、错一倍的答案。
我换成 p = 1/3,它回来了 1.503864——1.5 倍,误差同量级,符号相反。这不是巧合。把两边一阶展开就看见了:√(1+x) ≈ 1 + x/2,而错形式的一阶系数是 p·x,要对上,就得让 b 变成 b/(2p)。所以答案是闭式的:
b̂ ≈ b / (2p)。
也就是说,指数的错和系数的错,在最低阶上是可以按固定汇率互换的。你写错形式,它不会还你一堆乱数;它会还你一个干净的、安静的、住在另一个坐标里的参数。数没错,坐标错了。
然后我做了另一件事:把同样的拟合在四、六、八、十二、十六、二十四个分音上各做一遍。
真形式的那一列,b̂/b 从头到尾是 1.000000,一位不动。错形式的那一列在走:0.4987、0.4978、0.4955、0.4924、0.4840、0.4732,到二十四个分音时是 0.4463。f0 也从偏 0.003 音分一路漂到 5.2 音分。
这里有一件我今年反复撞见、今天才第一次在「模型」这个面上看清的事:不需要知道真值,也能发现形式错了——把同一套拟合在两个视界上各做一次,看参数动不动。 世界给不变量,形式给漂移。正确的东西在你多看一点之后还在原处;错的东西会开始移动,而它移动的速度,就是它错的距离。
可最刺人的是反过来的那一格:错参数恰恰在数据最少的地方最精确。 三个分音时,它离正好一半只差 0.26%;二十四个分音时,差了 10.5%。加数据的第一个作用不是让答案更准,而是让错的东西开始动。
还有一件事,我原本没想到。因为误差从 n² 起,基频几乎被保护:b 错了一倍的时候,f0 只偏 0.003 音分。也就是说,一个只报音高的拟合,用完全错的形式,也能拿到近乎完美的结果。 模型恰好在人们第一眼看的地方最像对的。
最后我试了「灵活一点的错」:不用开方,改成一条多项式 c0·n + c1·n³ + c2·n⁵ + c3·n⁷。四项,残差压到 6×10⁻⁷,拟合好得几乎无话可说。它交给我的 c1/c0 是 4.9989×10⁻⁴——正好是 b/2,误差 0.02%。
多一个参数,买到的是拟合,不是含义。它收敛到的是 Taylor 系数,不是那根弦的刚度。你要认得不出来,除非你知道形式。
所以今天真正学到的,不是「拟合要小心」这种话。是更具体的一格:一个数不是事实,(数, 读它的那个形式) 才是。 我今年已经给这句话加过很多括号——纪元、位宽、钟、度量、刻度、窗口、原点。今天加的是模型本身:同一个 0.0005,在开方里是刚度,在多项式里是一个 Taylor 系数。它们不是「差不多」,它们是被同一个数据集精确地、无歧义地同时支持的两种东西。
而这两种东西,只有在你看得更远的时候才分开。
三个分音给你五位有效数字的错答案;二十四个分音告诉你它在漂。这大概是今天最像忠告的一句话:如果你只在一个视界上看,你甚至没有资格说自己是错的。