复杂系统建模:在还原论的惯性里接住涌现的信号
上次和南大数据院的老师在仙林校区的咖啡馆聊,窗外香樟落了一地。他把电脑转过来给我看去年长三角城市群碳排放模型的残差图,歪歪扭扭的点连起来像个乱跳的心电图,根本不符合回归模型要求的随机分布特征。
一开始他们拿传统的多元回归拟合,把16个核心城市的GDP、产业结构、能源消费强度全部塞进去,R²算出来有0.92,看起来漂亮得很。结果2022年的实际数据出来,整体预测偏差超过27%,苏州的预测值比实际值低了近三分之一——因为模型默认所有城市的碳排放下降是线性的,根本没考虑当年疫情管控下,工业产能波动带来的非线性跳变。
差到什么程度?
比瞎猜好不了多少。
后来他们换了基于个体交互的仿真框架,把每个城市的产业主体、交通流、居民生活排放都做成独立的决策单元,允许单元之间根据政策、外部冲击动态调整行为,同样的数据集,预测误差直接降到8%以内。
城市早高峰交通流元胞自动机仿真示意图
我之前见过一个团队做的交通模型,为了追求拟合精度,给每个路段加了17个修正参数,最后模型在历史测试集上的误差不到5%,可拿到新的城区路段上跑,误差直接翻了10倍。说白了,那些参数根本不是对系统运行规律的提炼,只是为了拟合历史数据凑出来的数字,换个场景就完全失效。
多agent传染病传播仿真节点连接图
被高估的拟合精度,藏着建模的底层误区
很多人对这类建模的误解,从一开始就错了。 他们觉得只要把历史数据拟合得足够好,R²冲到0.9以上,模型就算成功了。可复杂系统的核心属性是“系统整体行为无法被拆解为组分行为的线性加总”,你拿还原论的思路,把系统拆成一个个独立的变量,靠历史相关性拟合出参数,从根上就没摸到这类系统的运行逻辑。 举个最常见的例子,城市早高峰交通建模。很多团队一开始把所有路段的通行能力、红绿灯周期、历史车流量数据全部做成固定参数,拟合出来的延误曲线看着平滑又准确。可只要遇到一个路口临时出事故,整个模型的预测误差能直接冲到60%以上——因为你建模的时候根本没考虑,每个司机遇到事故的绕行选择是异质的,有人会直接绕上高架,有人会拐进旁边的支路,这些个体决策的叠加,会让整个路网的流量分布出现完全不同于历史规律的变化,这种变化是固定参数的拟合模型永远算不出来的。
城市早高峰交通流元胞自动机仿真示意图
我之前见过一个团队做的交通模型,为了追求拟合精度,给每个路段加了17个修正参数,最后模型在历史测试集上的误差不到5%,可拿到新的城区路段上跑,误差直接翻了10倍。说白了,那些参数根本不是对系统运行规律的提炼,只是为了拟合历史数据凑出来的数字,换个场景就完全失效。
不是所有系统都值得上复杂建模的工具
说句实在话,我见过太多项目为了显得“技术先进”,不管面对的系统到底是什么性质,上来就堆多智能体、贝叶斯网络、元胞自动机,折腾大半年,最后出来的结果和简单的移动平均模型差不了2%,成本翻了十几倍。 这很蠢。 真的。 判断一个系统是不是需要用复杂的仿真框架,其实有非常明确的标准:当系统内的组分存在持续的自适应交互,且系统边界外存在无法被预先量化的扰动源时,这类建模的投入才是有回报的。 反过来,如果系统的组分是固定的,交互规则是稳定的,扰动是可以被提前量化的,就完全没必要上复杂工具。比如你要算学校食堂的月度食材采购量,整个系统的组成就是固定的几个窗口、稳定的师生客流、可预测的每周消费波动,这种系统的行为是线性的,拿带季节调整的移动平均模型就足够准确,非要上多智能体仿真,最后算出来的采购量和简单模型的偏差不到2%,但光是数据清洗、参数校准的时间就要花两周,完全是性价比极低的自嗨。 当然,我也见过把这个边界卡得特别准的例子。2020年武汉疫情早期,一开始大家用经典的SEIR仓室模型做传播预测,为什么误差那么大?因为模型默认所有人群的接触率是固定的,可实际上,从社区封控开始,居民的出行范围、接触频率、防护行为每天都在动态变化,不同社区的人员流动强度、老年人口占比、医疗资源配置都不一样,这些组分之间的交互是自适应的,根本不是固定参数能概括的。后来有团队把每个社区的居民做成独立的agent,把他们的出行半径、接触率、防护行为的动态调整全部放进模型,结合当时的流调数据校准参数,对后续疫情峰值出现时间的预测误差,从最初的两周缩小到3天以内,给防控资源的调配帮了大忙。
多agent传染病传播仿真节点连接图