概率分形:从迭代规则到多尺度特征向量的建模之路
分形这个东西很多人第一反应是曼德博集合那张五彩斑斓的图或者科赫雪花的无限精细边缘。但我做了几年数据分析之后反而觉得分形最值钱的部分不在“形”而在“规则”。如果你把一个分形对象拆到最底层会看到一组极其简单的操作被反复执行复制自己、缩小自己、随机地偏移一点。这种“简单规则 反复迭代 概率扰动”的组合正好是建模复杂系统时最缺的东西。今天这篇想聊的就是一条我自己的推导链条把分形从离散的迭代几何推到连续的测度极限再从分形特征推出一组可计算的向量最后让这些向量真正进入统计模型或深度模型。这也是“概率分形理论——从离散到连续——从向量到模型”这条标题的实际含义。内容不追求数学上的完备证明而是以能落地的理解为主适合做时序分析、特征工程、生成模型或者空间数据处理的人参考。你会看到一些仿射变换参数、一些采样逻辑、一些特征提取实操以及模型层面怎么用上这些东西。1. 分形不只是好看从迭代函数系谈“造物规则”1.1 压缩映射与吸引子分形的“递归骨架”先说一个很多人忽略的事实绝大多数经典分形不是用公式画出来的而是用一组压缩映射“压”出来的。所谓迭代函数系IFS核心就三件事一组把平面映射到自身的函数 (f_1, \dots, f_N)每个函数都是压缩的以及一个递归规则 (A \bigcup_{i1}^N f_i(A))。这个式子想表达的是整体吸引子等于每个子部件经过压缩变换后的并集而子部件又长得和整体一样。压缩映射这个名字有点唬人但本质就是“把距离变短的操作”。比如 (f(x) x/2)就是把整个图形缩小一半(f(x) x/2 1/2)缩小一半再往右平移半个单位。两个映射合在一起反复作用就能得到康托集。关键点在于巴拿赫压缩映射原理告诉我们这样的迭代过程一定收敛到一个唯一的不动点也就是吸引子。所以无论你从哪个点出发只要迭代次数够多点云都会呈现出同一个结构——这个过程天然就是离散的每一步都在做“压缩-粘贴-再压缩-再粘贴”。这个递归骨架为什么值得单独提出来因为它把“无限精细的图形”变成了“有限条规则”。在这个视角下分形不再是一张需要海量存储的图而是一段可以随时再生成的程序。实际做数据生成的时候这个特性非常重要你不需要保存一百万个小三角形顶点只需要保存四组变换矩阵。1.2 一张蕨叶背后的四组仿射变换提到 IFS必须聊 Barnsley 蕨。它看起来复杂到接近真实植物但控制它的只有四组仿射变换。每组变换写成二维仿射形式[ \begin{bmatrix} x \ y \end{bmatrix} \begin{bmatrix} a b \ c d \end{bmatrix} \begin{bmatrix} x \ y \end{bmatrix} \begin{bmatrix} e \ f \end{bmatrix} ]蕨叶四组变换常用参数如下变换abcdef概率茎0.000.000.000.160.000.000.01小叶0.850.04-0.040.850.001.600.85左叶0.20-0.260.230.220.001.600.07右叶-0.150.280.260.240.000.440.07这些参数不是我编出来表演用的是 Barnsley 在他的书《Fractals Everywhere》里公开的经典表。实际操作时你只需要循环做一件事按照概率 (p_i) 选一个变换把当前点 ((x, y)) 代进去得到新点然后把新点画出来。迭代十万次蕨叶就出现了。这里有一个很多人第一次跑代码时忽略的细节概率不是均匀的。茎的概率给得最小只有 0.01因为茎在视觉上只占极少数像素小叶的概率给到 0.85因为大部分叶子结构都来自这一路变换。这种概率分配正是“概率分形”的起点——同样一组映射概率权重不同最终图像的浓淡分布完全不同。1.3 三种经典分形的参数对照维数不是唯一指标做建模的人看分形最常用的量化指标是分形维数。但我要说一个实战中容易犯的错过分依赖维数单值。分形维数只描述“粗糙程度”不描述“纹理方向”和“空间分布”。比如谢尔宾斯基三角和某些树状结构可能有接近的维数但它们的生成规则差异极大。分形对象映射数 N压缩比 r相似维数 (D-\log N / \log r)生成特征康托集21/30.6309离散点集完全破碎科赫雪花41/31.2619连续但处处不可导谢尔宾斯基三角31/21.5850二维平面上充满空洞的结构学习 IFS 时最值得记住的一句话是分形维数是从“缩放关系”里算出来的不是从“面积或者长度”里直接量出来的。每做一次递归图形的“有效细节量”变成原来的 (N) 倍而“测量尺度”变成原来的 (r) 倍所以维数是一个对数比值。在后续做特征向量的过程中这种“对数尺度比值”的思想会反复出现。2. 概率介入后分形才真正能用随机IFS与不变测度2.1 混沌游戏用随机选择逼近确定性吸引子确定性 IFS 的迭代路线是固定切换所有映射比如每一步把所有变换应用一遍集合会越来越大。这种方式生成图像清晰但有个问题计算量随迭代深度指数上升。实际工程里很少这么做大家更多用的是“混沌游戏”chaos game任意选一个起点每一步只按概率挑一个映射来作用生成一条随机轨迹。混沌游戏的算法极其简单随机初始化点 ((x_0, y_0))按概率 (p_i) 从变换集合里挑一个 (f_i)迭代 (x_{n1} f_i(x_n))重复足够多次绘制轨迹点云。这个算法妙在虽然每一步都是随机选择但点云的最终形状却是一个确定性的吸引子。随机性不在于结果而在于到达结果的路径。我经常在项目里用这个方法做合成数据采样因为它本质上是一个“从吸引子分布里抽样本”的机制而不是一个“画图”的机制。这里有个实操提醒前几十个点通常还在“飞向吸引子”的路上属于暂态过程画图时直接丢弃前 5% 的点否则图像边缘会出现一些散射的杂点。这一点在后面讨论马尔可夫链收敛时还会再遇到。2.2 不变测度形状只告诉你在哪里分布才告诉你密度混沌游戏产生的点云密集程度并不均匀。有的区域点很密有的区域点很稀。这个“密度分布”就是概率分形视角下的关键对象不变测度。用数学语言说一个概率测度 (\pi) 如果满足[ \pi(B) \sum_{i1}^N p_i ,\pi\big(f_i^{-1}(B)\big) ]对所有可测集 (B) 成立就叫这个随机 IFS 的不变测度。别被符号吓住它表达的是如果你用同样的规则反复迭代最终落在集合 (B) 里的概率等于先随机选一个映射把某点映射进 (B) 的概率之和。这个测度是整个随机过程的“稳态分布”。形状吸引子与测度之间的关系特别像建模中的数据与分布吸引子告诉你“可能的取值区域在哪里”不变测度告诉你“每个位置出现的概率有多大”。做生成模型的人都清楚光知道支持集没有用必须知道概率密度在支持集上怎么分配。分形图像上的“浓淡”正是密度的可视化——同一个吸引子概率权重不同渲染出来就是完全不同的纹理。2.3 概率参数如何控制纹理实际操作中调整概率参数有个很直观的体验形状几乎不变纹理变化很大。举个例子Barnsley 蕨把小叶概率从 0.85 降到 0.7把左叶右叶概率从 0.07 提到 0.14蕨的总体轮廓还是蕨但叶片变稀疏、边缘更“破碎”。这在图像学上叫“改变测度但不改变支撑”。在建模场景里这个性质非常有价值。它意味着你可以在不改变数据空间几何结构的情况下仅仅通过调整随机过程的跳转概率来改变生成分布的密度。比如在异常检测里你想生成“形状正常但局部密度异常”的合成样本就可以固定 IFS 变换参数、只调节概率权重来制造困难样本。这个思路比直接向原始数据加噪声更可控。3. 离散迭代的连续极限马尔可夫视角与重正化雏形3.1 把随机IFS写成马尔可夫链讨论概率分形时如果把随机 IFS 只当成“画图工具”就亏了。它本质上是一条马尔可夫链。当前状态 (x_n) 在下一时刻可能变成 (f_1(x_n), \dots, f_N(x_n)) 中的某一个变化到 (f_i(x_n)) 的概率是 (p_i)。这是一个定义在连续状态空间上的马尔可夫链转移核可以写成[ P(x, A) \sum_{i1}^N p_i ,\mathbf{1}\big[f_i(x) \in A\big] ]一旦你把这个转移核写出来很多结论就顺理成章了在满足压缩性条件时这条链具备遍历性也就是说无论初始点在哪儿时间足够长后经验分布都会收敛到那个不变测度 (\pi)。这就是为什么混沌游戏前几十个点必须丢弃它们是从初始分布到不变测度之间的“过渡期”学术上叫 burn-in预烧期和 MCMC 里的概念一模一样。这个认识有个实际用途你可以把随机 IFS 当做一个已知不变分布的采样器来用。做实验需要从某个复杂支撑上的分布采样时不一定要跑 Metropolis-Hastings构造一个合适的 IFS 直接采样可能更快、更稳定。3.2 与MCMC思路的异同把随机 IFS 和 MCMC 放一起对比会发现它们是同一思想的两个方向。MCMC 是在给定目标分布 (\pi) 后去构造一个转移核 (P)使得 (\pi P \pi)。随机 IFS 则反过来先给一个转移核由压缩映射和概率决定然后让系统自己去“涌现”出稳态分布 (\pi)。从工程角度看随机 IFS 采样有几大好处不需要计算接受率每一步都是直接接受。不需要复杂的提议分布设计变换族本身就是提议机制。对条件数不好的目标分布IFS 的压缩映射天然防止发散。代价是你需要找到一个合适的 IFS 来逼近你想要的分布。这本质上是分形逼近或者说拼贴定理的应用——找一个吸引子足够接近目标分布的 IFS然后反复迭代。我在实际项目里常用这个思路做高维采样基准测试效果往往比传统的随机游走 MCMC 稳定得多。3.3 尺度变换的半群视角离散步骤如何逼近连续极限“从离散到连续”不是一句抽象口号。分形递归过程可以被理解为一系列尺度变换的复合。每迭代一次相当于把当前结构“缩放”一次再粘贴若干副本。连续化之后这一过程对应一个尺度变换半群 (R_t)满足 (R_{ts} R_t \circ R_s)。离散迭代不过是取整数步 (t1,2,3,\dots)而连续化则允许 (t) 取任意实数。用一个经典例子来说明康托集构造中每一步去掉中间三分之一剩余部分由两个缩放系数为 1/3 的副本组成。如果从二进制表示看这个构造过程其实是在逐步固定小数位的数字。康托集里的点可以映射到 ([0,1]) 区间上的二进制展开于是离散的删除过程在连续区间上就有了一个极限对象。这个对应关系就是离散到连续的精确表达。有了这个半群视角你就不难理解为什么相变、临界现象和分形经常同时出现临界状态下的系统往往具备尺度不变性而尺度不变性正是分形的定义特征。连续极限下系统的宏观性质不再依赖于离散晶格的细节只依赖于重正化变换的不动点。这个思想渗透到深度网络结构设计时就形成了多尺度层级特征提取的基本逻辑——每层网络就是对输入做一次尺度变换。4. 分形特征向量化从标量维数到多尺度表示4.1 盒计数维数与R/S分析先有标量要真的把分形用进模型第一步不是卷积网络而是把形状或者序列变成一个数再变成一组数。最常用的标量就是分形维数。图像、点云这类数据用盒计数维数时间序列用 R/S 分析或 DFA 估计 Hurst 指数。盒计数维数的计算过程很直白用边长为 (\epsilon) 的网格覆盖目标数出非空网格数 (N(\epsilon))对一系列 (\epsilon) 重复比如 (\epsilon) 从 1 到 64 像素在双对数坐标系里拟合 (\log N(\epsilon) \sim -D \log \epsilon)斜率绝对值就是维数。Hurst 指数的 R/S 分析步骤类似区别在于要先把序列按不同长度窗口切分对每个窗口计算重标极差 (R/S)再拟合 (\log(R/S) \sim H \log(\text{窗口长度}))。这两个做法都能在 20 行左右代码内实现但我要提醒一个坑很多人做完 log-log 回归看了一眼 (R^20.98) 就觉得算准了这不太够。分形维数的估计误差主要来自尺度范围选择。(\epsilon) 太小时像素化噪声和图像分辨率会把真实几何关系掩盖掉(\epsilon) 太大时又体现不出局部自相似性。一般经验是让最小尺度略大于分辨率最大尺度不超过目标尺寸的 1/4然后用中间的三五个数量级做拟合。4.2 多尺度特征向量把一条曲线变成一组数单个维数作为特征太脆弱。真实场景里图像或序列往往在不同尺度上表现出不同的分形特征。比如一条金融时序短期可能有明显的波动聚集长期却接近随机游走。用一个 Hurst 指数概括全程会丢掉太多信息。实操里我常用的方式是把单标量扩展成多尺度向量。具体做法是对每个缩放窗口 (w) 计算对应的维数或 Hurst 指数得到一组随尺度变化的特征值。比如把窗口设为 16、32、64、128、256、512算六个 Hurst 指数拼成一个六维向量。这样一个序列就不再是一个标量而是一个向量[ \mathbf{v} \big[ H_{16}, H_{32}, H_{64}, H_{128}, H_{256}, H_{512} \big] ]这个方法有几个好处。第一它保留了尺度依赖信息能区分“短程长记忆、长程随机”这类复杂模式。第二它天然适合下游模型——直接把向量丢进 SVM、树模型或者作为检索字段喂给向量数据库。第三它具备较好的可解释性每个维度对应一个明确的物理尺度。4.3 稀疏与稠密向量在尺度空间的语义现在很多系统都在做向量检索向量的稀疏和稠密之分也成了高频词汇。从分形特征向量的角度看这两者区分有很直观的语义稀疏向量的有效响应只集中在少数尺度通道说明数据在尺度空间中能量高度集中稠密向量的各个维度都有非零响应说明信号在多尺度上都有结构贡献。举个例子。一个纯白噪声序列各窗口的 Hurst 指数都接近 0.5做出来的向量虽然有六个维度但信息熵很低——每个维度都差不多像一条平线。这种情况下你把它当稠密向量存进去不仅浪费空间检索时还容易和其他白噪声序列产生高相似度。而一个含连续趋势段的序列短窗口 Hurst 可能高达 0.7长窗口趋近 0.5向量在不同尺度上分化明显携带的信息量远高于前者。所以在做分形特征向量之前先想清楚一个问题你的数据在尺度空间里是“均匀分布”的还是“少数尺度主导”的前者用稠密向量存储是有意义的后者更适合先做稀疏化只保留贡献大的尺度通道。这个问题看似不起眼实际影响检索召回率和检索精度。5. 向量进入模型之后长记忆、扩散与不动点结构5.1 从Hurst指数到长记忆模型分形特征向量最常见的落点是时序模型。古典时序分析默认序列是短记忆的从 ARMA 到 GARCH 都逃不开指数衰减的自相关结构。但真实数据里经常出现 Hurst 指数明显偏离 0.5 的情况H0.5 表示长记忆过去的事件对未来的影响衰减很慢H0.5 则表示均值回归序列会反复回到中枢。分形特征向量恰恰可以捕捉到这种“不同尺度上的记忆结构差异”。建模时可以这么做先估计多尺度 Hurst 向量再用它决定模型架构。如果 H0.5 占主导用偏均值回归的模型就合理如果 H0.5 明显考虑带长记忆项的分数差分模型。用哪个模型不是拍脑袋而是让特征向量先说话。我做过一个对比实验直接用 Hurst 向量做 feature 喂给轻量级梯度提升模型在某个传感器退化预测任务上效果甚至超过了用原始波形做的 1D-CNN 基线。原因不是树模型更聪明而是分形特征天然压缩掉了大量噪声保留了尺度结构。5.2 扩散模型与反向粗化另一种“连续化”提到生成模型扩散模型是绕不开的。扩散模型前向过程逐步加噪看起来是在“破坏”数据但从尺度变换的角度看加噪其实是在做粗化——把细节抹掉保留低尺度结构。反向过程则是从噪声恢复多尺度细节本质上是学习重正化变换的逆过程。这和概率分形有什么关系关系非常大。扩散模型学习的是“在每一步去噪时恢复该尺度上的结构”而分形的构造过程是“每一步在高一尺度上粘贴细节副本”。一个是正向粗化一个是反向细化的极限表达。理解了这一点你就会明白为什么扩散模型里 U-Net 的多尺度结构如此重要——它内部其实在做多尺度特征提取和分形特征向量的逻辑完全同构。如果你在做扩散相关的工作可以尝试在训练前先对数据集做一次分形特征分析。如果某类数据的 Hurst 向量显示高尺度结构占比高那模型就需要更强的跨层连接来保留细节反之则更重全局结构即可。这种分析可以帮你少试好几组网络结构。5.3 不动点结构DEQ、自相似网络与模型融合最后一个点我想说“从向量到模型”里隐含的另一层意思模型本身也可以具有分形结构。深度平衡模型DEQ就很有意思它用不动点迭代代替了数十层网络的堆叠[ z^* f(z^*, x) ]这个式子和 IFS 吸引子方程 (A \bigcup_i f_i(A)) 在结构上高度相似。二者都在表达一件同样的事经过不断迭代状态收敛到一个不依赖于初始值的不动点。DEQ 里这个不动点是隐层状态IFS 里这个不动点是分形吸引子。做模型融合时也有类似的视角。多数人做模型融合就是在参数空间权重平均或者在结果空间做加权平均。但如果你从不动点角度看多个模型之间其实可以构成一个迭代系统把模型 A 的输出作为模型 B 的输入再把 B 的输出作为 A 的输入反复迭代直到稳定。这个融合后的不动点往往比单次前向传播的结果更平滑、更稳定。我在某些小规模分类任务上试过两模型互迭代三次后再输出准确率不一定提升但预测方差明显下降。最后分享一个我自己的实操体会如果你想真正吃透这条“概率分形——离散到连续——向量到模型”的链路不要急着上复杂数据。先造一个随机 IFS比如一个四变换的蕨叶或谢尔宾斯基三角然后用混沌游戏生成一万个样本点接着对样本点算盒计数维数和多尺度特征最后把特征向量拿去跑一个简单的检索或回归任务。全套流程下来大概半天时间但你对“生成规则——特征表示——模型消费”的闭环感受会非常直观。还有一个小提醒在做多尺度分形特征之前一定先估计一下数据的噪声水平否则高尺度通道很容易被噪声主导算出来的“分形结构”很可能只是传感器精度不够产生的假象。