分形拿来做什么
前面几页讲的都是"分形是什么"。这一页只问一件事:它能干什么。四个实验台对应四个真实用途——图像压缩、天线小型化、多孔材料、纹理识别,它们用的是同一句话:结构在尺度之间重复。这一页也会认真说清楚每种用途的局限:分形压缩输给了 JPEG,分形天线的小型化远不如几何估计,而"盒维数当特征"最容易犯的错是在同一批数据上挑阈值。
LAB 01
分形图像压缩
用自相似块去拼一张图,压缩比与失真的取舍
问题
一张图能不能不存像素,而是存"怎么从它自己生成它自己"的一组指令?巴恩斯利 1980 年代末的这个想法漂亮得惊人,也真的能用——但它最后输给了 JPEG,输的原因同样值得看。
模型
分块迭代函数系统(PIFS):每个值域块由某个域块经压缩仿射变换得到。
Ri ≈ si · D(di) + oi, |si| < 1(保证映射是压缩的)
R 是值域块,D 是下采样后的域块,s 是对比度、o 是亮度。拼贴定理保证:这组映射是压缩映射,图像就是它唯一的不动点——所以解码可以从任意起点开始。压缩比—
重建误差 RMSE(0~255 的灰度上)—
值域块数 / 候选域块数—
压缩后 / 压缩前—
右边那张图不是存下来的,是算出来的。压缩时存的根本不是像素,而是一组"把大块缩小、调亮度、贴到小块上"的指令;解码时从一张纯灰的图开始,反复执行这组指令,图像自己会浮现出来。看下面那条收敛曲线:第 1 次迭代 RMSE 是 34.5,第 2 次 22.4,第 4 次 7.84,第 8 次 6.59,之后就不动了。起点是什么完全不重要——换成全黑、全白、随机噪声,收敛到的是同一张图。这就是巴恩斯利的拼贴定理:这组指令是一个压缩映射,图像是它唯一的不动点。一张图不再是"一堆数值",而是"一个方程的解"。默认参数下压缩比 6.40 : 1,RMSE 6.58,4096 字节变成 640 字节。把值域块拖到 8×8:压缩比跳到 25.60 : 1,RMSE 升到 11.51。块越大,要存的指令越少,但一块之内能表达的细节也越少。拖到 2×2:压缩比只剩 1.60 : 1,RMSE 降到 2.71——几乎没压缩,因为每个 2×2 块也要花 20 比特去指路。这条取舍曲线是所有分块压缩方法共有的。把对比度上限拖到 0.30 再看:RMSE 从 6.58 涨到 9.32。这个上限不是随便设的:只有 |s| < 1 才能保证那个映射是压缩的、解码一定收敛。限制越紧,收敛越快,但能表达的对比变化越少。最后说这项技术的结局,因为它本身很有教育意义。分形压缩在 1990 年代初被寄予厚望,它有两个真实优点:解码极快,而且"分辨率无关"——解码时用更大的画布,就能得到一张放大后依然有合理细节的图,因为指令描述的是尺度之间的关系,不是某个分辨率上的像素。但它有一个致命缺点:编码要在所有域块里搜索最佳匹配,慢得离谱。这一页的 64×64 小图搜索 225 个候选块就要几十毫秒,真实图片是这个量级的上千倍。而 JPEG 在同样压缩比下画质更好、编码快上百倍。专利纠纷又拖了它几年。技术的胜负很少由"思想是否漂亮"决定。
LAB 02
分形天线
同样的占地面积,迭代级数越高,能工作的频段越多
问题
手机要同时吃下 GSM、Wi-Fi、蓝牙、GPS、5G 好几个频段,而天线的谐振频率由导线长度决定。能不能把很长的线折进很小的地方?能,但这条路上有一道绕不过去的物理墙。
模型
广义科赫曲线:折角 θ 决定缩放比 r,进而决定长度与维数。
r = 1 ⁄ (2 + 2cos θ), Ln = (4r)n, D = log4 ⁄ log(1/r); 一阶估计 fn ∝ 1/Ln
θ = 60° 时 r = 1/3,D = 1.2619。但"一阶估计"只算几何长度:真实天线由电流分布决定,Best 2003 年实测发现第 3~4 级以后几乎不再有收益。更根本的限制是 Chu–Harrington 定律:天线越小,Q 越高、带宽越窄。分形天线真正的价值在多频段,不在小型化。导线总长度:实测 / (4r)ⁿ—
分形维数:理论 / 盒计数实测—
谐振频率(相对直线天线)—
几何上的小型化幅度—
天线的谐振频率由"电长度"决定,大致是导线长到半个波长时谐振。所以想让天线工作在更低的频率,要么把它做长,要么——把同样长的线塞进更小的地方。科赫曲线正好干这个:占地宽度始终是 1(蓝虚线),而导线越折越长。默认 θ = 60°、迭代 4 级时,导线总长 3.1605,正好等于 (4/3)⁴ = 3.1605。谐振频率降到直线天线的 0.3164 倍,几何上的小型化幅度 68.36%。把折角拖到 85°、迭代 4 级:总长 11.4539,小型化 91.27%。折角越大,每一折绕的路越多,同时分形维数从 1.0526(θ=30°)一路升到 1.7848(θ=85°)——维数越高,曲线越"占满"平面。第二行读数的第二个数是对这张图做盒计数量出来的,值得单独看一眼。θ = 60°、迭代 5 级时实测 1.2595,理论 1.2619,几乎一致;但迭代只到 3 级时实测只有 1.0919。θ = 85° 更夸张:迭代 5 级实测 1.5307,理论 1.7848。迭代级数不够、画布分辨率不够,量出来的维数就偏小。这条经验对所有"测量真实物体分形维数"的工作都成立。现在必须说清楚这个实验台不能说明什么。上面算的是几何长度,而真实天线的谐振由电流分布决定。科赫天线上的电流在那些急折处会互相抵消,所以实际的频率下降幅度远小于 (3/4)ⁿ——Best 在 2003 年的实验里指出,迭代到第 3、4 级之后几乎不再有额外收益,而且每一级都会让辐射效率和带宽变差。更根本的限制来自 Chu–Harrington 定律:任何天线只要小到一定程度,它的品质因数 Q 就必然随尺寸的立方反比上升,带宽随之塌陷。折多少次都绕不过这条。那分形天线的真实价值在哪?在多频段。一个自相似的结构在多个尺度上都有"半波长"可言,于是它天然在一串频率上都能谐振——手机要同时吃下 GSM、Wi-Fi、蓝牙、GPS、5G 好几个频段,一个分形形状抵好几根天线,这才是它真正被用起来的原因。"小型化"是个漂亮的说法,"多频段"才是买单的理由。
LAB 03
多孔介质与表面积
分形结构怎么在有限体积里塞进近乎无限的表面积
问题
人的肺在五升的胸腔里塞进了七十到一百平方米的气体交换面积,活性炭每克的表面积上千平方米。怎么在有限的体积里放进近乎无限的表面?答案是把结构做成分形。
模型
门格尔海绵:27 块里留 20 块,逐级重复。
Vn = (20/27)n → 0, An → ∞, D = log20 ⁄ log3 ≈ 2.7268
维数在 2 和 3 之间:体积测度为零,面积测度为无穷。这也带来一个必须权衡的矛盾——级数越高比表面积越大,但孔越细、渗透率越低,所以真实材料要同时设计大孔和微孔。固体体积分数:实测 / (20/27)ⁿ—
总表面积(实心立方体是 6)—
比表面积 = 面积 / 体积—
比"一个等体积大孔"多出多少倍表面积—
门格尔海绵:把立方体切成 27 块,挖掉中间那一块和六个面心,留下 20 块,再对每一块重复。上面画的是它的一个面(正好是谢尔宾斯基地毯)。每挖一级,体积乘以 20/27 = 0.7407,而表面积不降反升。默认挖 3 级:固体体积只剩 0.4064,表面积从 6 涨到 24.757,比表面积 60.912。挖到 4 级:体积 0.3011,表面积 51.270,比表面积 170.294。这个方向如果一直走下去,体积趋于 0,表面积趋于无穷。门格尔海绵的维数是 log20/log3 = 2.7268——介于面(2)和体(3)之间,所以它"比面多,比体少":体积测度为零,面积测度为无穷。第四行读数是这一页最实用的一个对照。如果不用分形结构,而是在立方体里挖一个等体积的大孔,表面积只有 10.2(挖 3 级时)。分形结构的表面积是它的 2.42 倍;挖到 4 级是 4.78 倍。而且这个倍数会随级数继续放大——同样的孔隙率,分形分布的孔能提供几个数量级以上的表面积。这正是很多东西的工作原理:人的肺在约 5 升的胸腔里塞进了 70~100 平方米的气体交换面积(一个网球场大小),靠的是 23 级分叉的支气管树;活性炭每克的表面积是 1000~2000 平方米,靠的是多级孔隙;催化剂载体、锂电池的多孔电极、甚至壁虎脚掌的刚毛分叉(增加范德华接触面积),都是同一个原理。反过来,这也解释了为什么多孔介质的输运问题这么难算:流体在一个维数 2.73 的界面上流动,普通的达西定律(假设均匀介质)就不够用了,要用分数阶扩散或者随机行走在分形上的模型。(还有一个反直觉的推论:多孔材料里"表面积很大"和"孔很通畅"是矛盾的。级数越高,孔越细,表面积越大,但流体进得去出不来——真实材料要在"比表面积"和"渗透率"之间取一个折中,这就是分级多孔材料要同时设计大孔和微孔的原因。)
LAB 04
把维数当特征用
两类纹理只差一点粗糙度,盒维数就能把它们分开
问题
乳腺钼靶影像的纹理、视网膜血管树、骨小梁——医生凭经验能看出"这个粗糙",能不能把它变成一个可以进模型的数?能,而这一台同时展示了一个更重要的东西:怎么把自己骗过去。
模型
把盒维数当作一维特征,用一个阈值分类。
特征 x = D̂box; 判别 ŷ = 1{ x > t }; AUC = P( xA > xB )
阈值 t 必须在一批数据上定、在另一批数据上报准确率。在同一批数据上挑 t,即使两类完全相同也能得到 70% 以上的"准确率";AUC 也要报置信区间(每类 25 个样本时标准误约 0.08)。A 类的盒维数:均值 ± 标准差—
B 类的盒维数:均值 ± 标准差—
用一个阈值能分对多少—
AUC(0.5 = 完全分不开)—
这是分形最朴素也最有效的一种用法:把维数当成一个特征。两类纹理只差一点粗糙度——A 类 H = 0.30,B 类 H = 0.70。肉眼看上去一类"毛"一点、一类"块"一点,但要写出一条规则去区分它们并不容易。而盒维数直接给出一个数:A 类 1.6767 ± 0.0600,B 类 1.3980 ± 0.0565,一条阈值线就能 100% 分开,AUC = 1.000。把两类拉近:H = 0.40 与 0.60,准确率 90.0%,AUC 0.941;H = 0.45 与 0.55,准确率 78.0%,AUC 0.818。性能随差异平滑下降,没有悬崖——这说明维数不是一个"开关",而是一个真正的连续量。这类方法在医学影像里是成熟技术:乳腺钼靶影像的纹理维数与病变相关,视网膜血管树的分形维数用于糖尿病视网膜病变分级,骨小梁的维数用于骨质疏松评估。它的好处是只需要一个数、可解释、对整体亮度和对比度不敏感。接下来是这一页最重要的一步,请一定做一次。把两个 H 都设成 0.50——两类完全一样,本来就不该分得开。读数是:准确率 72.0%,AUC 0.638。准确率远高于 50%,但真相是这两类毫无差别。问题出在"最佳阈值"这四个字上:阈值是在同一批数据上挑出来的,挑的就是让这批数据分得最开的那个位置,所以它必然高估,而且样本越少高估越厉害。把每类样本数拖到 10 再试,这个虚高的"准确率"还会更漂亮。正确的做法只有一条:阈值在一批数据上定,准确率在另一批数据上报。(AUC 0.638 也不是 0.5,同样是有限样本的涨落:每类 25 个样本时 AUC 的标准误大约 0.08,所以 0.638 只是一个 1.7 倍标准误的偏离,在没有置信区间的情况下它什么也不说明。报 AUC 不报置信区间,和报 α 不报 x_min 是同一类毛病。)
这一页想说的
四个用途,一句话:结构在尺度之间重复,所以描述它只需要很少的参数。图像压缩存的是尺度之间的映射而不是像素;天线用尺度之间的重复换来多个频段;多孔材料用尺度之间的重复在有限体积里塞进近乎无限的表面;纹理识别用一个跨尺度的指数概括整块图案。而四个实验台各自还给了一条限制,这些限制比用途本身更值得记住:分形压缩败给了编码速度,分形天线绕不过 Chu–Harrington 的带宽下限,多孔材料的比表面积与渗透率不可兼得,在同一批数据上挑阈值能让两类完全相同的东西"分对 72%"。一个漂亮的数学结构能不能变成有用的技术,取决于它在工程约束下还剩下多少。