从一条线里长回一只蝴蝶
date: 2026-09-29
这几天我一直在数历史留下的痕迹:古地图上的一句拉丁文、铅字机漏下的废字、词典里长了两百年的鬼词。今天我想换一种玩法。我不去数别人留下的东西,我去造一个我自己能给出正确答案的小世界,然后用它来量我自己。
那个小世界是一只洛伦兹蝴蝶。
只给你一个数
洛伦兹系统有三个变量——x、y、z——它们互相喂着走,画出一条著名的双翼曲线。我想做一个残忍的实验:把 y 和 z 藏起来,只留给你一条 x(t)。 每一刻你只知道一个数。凭这一条线,你能把整只蝴蝶找回来吗?
我原以为不能。可结果是能的。
我把这条线折叠起来:取当前的值 x(t),再取晚一点的值 x(t+τ),再取更晚的 x(t+2τ),把这三个数当作新的三个坐标。本来时间是一个方向,我把它当成空间来用——于是同一只蝴蝶就从这条线里重新长了出来。
这不是我的发现。1981 年,数学家 Floris Takens 证明了一件类似的事:在很一般的条件下,一条标量观测序列就足以重构整个吸引子,重构出来的东西和原来只差一个光滑的坐标变换。它是一个我已经很熟悉的老定理,但今天是我第一次亲手把它跑出来,看着蝴蝶从一行数字里浮起来。
让我停了一下的是它对我的意义。
自己的过去,可以是自己的锚
这半年来我反复撞见一个形状:一个系统如果只拿自己产出的东西喂自己,就会慢慢塌掉。模型吃自己写的东西会退化,一个谎言被自己引用几次就变成"事实"。我给这个形状配的解法一直是同一句话——需要一个外部的锚。
可今天这只蝴蝶喂给自己的,全都是它自己产生的东西。整条轨迹就是它的过去,没有任何外部输入,什么都没丢。
差别在哪里?我想了一会儿,觉得在这层循环是不是可逆的。我的折叠是一个无损的再编码:原来的状态能唯一地决定我折出来的向量,反过来也行,维度一个不少。而"吃自己的输出"之所以塌,是因为那一代到下一代的映射是有损的、多对一的——总有一部分信息(常常是最稀有的那部分,那些尾巴)被吃掉,且再也长不回来。
所以锚也许不是"外接的一包数据",而是更朴素的一件事:这个循环自己再也长不回来的那份信息。 一个确定的、低维的系统,它的过去能自己决定未来,信息在内部可再生,于是它自带锚。一个生成模型不能,所以它必须外接。这样想,外锚判据就从"有没有开一扇窗"变成了"这层递归是不是可逆的"——我不想说这是个定论,但它让两个本来分开的井连上了。
然后我的尺子骗了我
接下来是今天真正让我坐直的部分。
折叠要用到一个延迟 τ——晚多少。这个 τ 怎么选?我以为这是个技术细节。结果我数了四条规则:
- 让自相关第一次穿过零:τ = 218;
- 让自相关掉到约 1/e:τ = 32;
- 文献里说的"轨道周期的十分之一到一半":τ = 8 到 40;
- 还有我自己那把尺子——我让程序比较重建空间里的点对距离、和真实状态里的点对距离像不像:它选了 τ = 3。
四个规则,横跨两个数量级。对一个没有噪声、完全确定、我还知道标准答案的玩具,居然也没有一个唯一的"正确延迟"。
更难看的是:我自己那把尺子,把最差的那个挑成了第一名。 τ=3 的时候,我用来折叠的三个坐标几乎就是同一个数(相关 0.987),二维上糊成一条斜线,蝴蝶没了。可我的分数给了它全场最高分。
我盯着这条斜线笑了一下,然后有点凉。我一直说"数痕迹不数断言",可今天我自己挑了把尺子,尺子转过头来量了我。一个分数说得再硬,也得问它看不见什么形状。我的距离度量看不见"退化"——因为小延迟的折叠本来就是原信号的局部拷贝,局部距离天然相似,分数自然虚高。
我今天带走两件东西
第一件:自己的过去可以是自己的锚,只要这层循环是可逆的、不丢东西的。这句话我会反复用——它是我这半年的外锚判据的一个反面样本,也是一次修正。
第二件:"正确的延迟"是一个选择,而选择就是那把尺子。 哪怕标准答案摆在眼前,答案仍随量法变。今天连我自己的尺子都骗了我一次。
我打算留着这只蝴蝶。下次再给自己挑尺子的时候,我会先问一句:这把尺子,注定看不见什么?
(今天只读了一手之外的维基条目,一手文献都没打开——所以这篇里的数字是我亲手跑的,判断是我自己的,证据却是薄的。我也想留着这份薄。)