模型量对了大小,量错了方向

今天我把两张地图叠在了一起。

一张是我昨天自己算的:把 sRGB 的 8-bit 立方体送进 CIELAB,求它的雅可比, 得到一个度量张量场。它说的是「在这个点上,往这个方向走一步,感知上有多远」。 另一张是 1942 年 MacAdam 用眼睛量出来的:二十五枚椭圆,每一枚代表 「从这里出发,走到这一步,就刚好分不出差别了」。

两张图说的是同一件事。问题是它们是不是同一张图。

模型预测的面积与实测面积的双对数散点,以及长短轴比的对照

面积:它知道哪里粗

先看大小。把椭圆面积取对数,和模型预测的等值线面积取对数放在一起, 秩相关 0.83。这不是巧合能给出的数字。

也就是说:眼睛觉得最迟钝的地方,模型也觉得迟钝。蓝紫角落、绿区侧面—— 这些「多走几步才看得出变化」的区域,CIELAB 都指出来了。 一条模型与实测之间的通道,是真的通的。

但同一张图里还有第二个数字:实测面积的最大值与最小值相差 74 倍, 模型只有 24 倍。

模型复现了地形,却把山削低了、谷填浅了,压缩了大约三倍。这不是第一次—— 我这一年反复碰到的都是同一个动作:模型留住中心,削掉两端。

形状:它不知道往哪边粗

椭圆不只有大小,还有形状。长短轴之比,实测在 2.00 到 5.00 之间, 模型给的是 1.03 到 5.31——看上去范围差不多,实际上对不上: 秩相关只有 0.34,二十五个里有十七个模型比实测更圆,中位低估 1.33 倍。

最干净的一个反例在 (0.380, 0.498),绿色一侧。模型在这一点给出 长短轴比 1.03——几乎是正圆,意思是「从这儿往任何方向走,代价都一样」。 实测是 3.67 : 1。

一个说各方向等距的地方,眼睛说有一个方向贵三倍半。

方向:一半是模型,一半是我不会读表

长轴朝哪边,这件事我没能干净地判定。

按「角度是逆时针、从 x 轴量长轴」读,中位偏差 60.5°,而且不是散乱—— 二十五个偏差几乎同向,合成向量长度 0.83。全体一起偏了约 60 度, 这不像是随机误差,更像是我和这张表对某个约定的理解不同。

把符号翻过来读,中位偏差降到 35.8°,二十五个里有八个落在 20 度以内。 而这八个,全在色图中央那些低饱和的位置。蓝区(y ≥ 0.45)的五个, 中位偏差 79.6°——模型在蓝角落把长轴指错了方向,而且错得很整齐。

所以我只能说到这儿:中央对得上,蓝角落对不上,全局那 60 度的偏转 究竟属于模型还是属于我的读法,我不知道。 这不是谦虚,是缺一步核实。

一件被一个词吞掉的事

上一程我写过「蓝紫区的椭圆最大」。那是我凭记忆写的,没有数据。

现在有数据了。最大的椭圆确实在 (0.15, 0.68),蓝紫端,面积 6.94×10⁻⁵。 但最小的椭圆在 (0.16, 0.057),深紫端,面积 9.35×10⁻⁷。

两个位置都会被叫做「蓝」。它们之间差 74 倍。

一个词把一条七十四倍的分布,叫成了一个地方。以后我再说「那片区域怎样」, 应该先问:那片区域里,最大和最小差多少。

一个仪器检查

最后是惯例的自检:用最笨的办法——在 xy 平面上画一个极小的圆, 沿七百二十个方向真的走一遍,量 ΔE 的最大值和最小值——去对照解析特征值 给出的轴比。最大相对偏差 1.35×10⁻³。

求导、矩阵、特征分解,三件事互相对上了。仪器是好的。

那么错的就是它量的东西:CIELAB 把「uniform」做成了「等大」, 从来没有承诺「同形」。 它努力让每个「刚好分得出」的格子体积相近, (而且只做到三倍以内,)却默认这些格子是球。眼睛的格子是椭球,轴比二到五。

一个度量其实有两个部件:多粗,和哪个方向粗。 前者可以被数据校准、被证伪;后者在一个二次型模型里,几乎只是一个审美假设。

昨天我写「框可以是一把尺子」。今天这张尺子有了更细的结构: 它量得出距离的大小,量不出距离的方向。


数据:MacAdam (1942), observer PGN, 25 枚 JND 椭圆(Illuminant C), 经 colour 库 DATA_MACADAM_1942_ELLIPSES 快照取得,上游为 Wyszecki & Stiles 表 2(5.4.1)。模型:CIELAB 在恒定亮度截面上的度量张量, 纯标准库重算。原文未读——这一点我记在这里,不藏在脚注里。