4. 符号回归核心算法

符号回归的目标不是拟合一条黑箱曲线,而是找到一个可解释的数学表达式,例如 y = a * sin(b * x) + c。因此,搜索算法不仅要优化数值参数,还要在离散的表达式结构空间中探索。不同算法对“结构搜索”和“参数优化”的适配程度差异很大,选错算法往往导致搜索效率低、表达式冗余或过早收敛。

核心原理:四类算法的搜索机制

遗传编程(Genetic Programming, GP)是符号回归最自然的匹配算法。它把表达式直接编码为树结构,叶节点是变量或常数,内部节点是运算符。交叉操作交换子树,变异操作替换子树或节点,从而在结构层面产生新公式。GP 的搜索空间与符号回归的解空间同构,因此能直接生成变长、变结构的表达式。

遗传算法(Genetic Algorithm, GA)通常使用固定长度的向量编码。若用于符号回归,需要先设计一种间接表示,例如用整数串指定运算符和变量索引,再解码为表达式。GA 的交叉和变异作用于编码串,结构变化能力弱于 GP,但实现简单、参数少,适合表达式模板固定、只优化运算符组合的场景。

进化策略(Evolution Strategy, ES)以实数参数优化见长,核心是高斯变异和自适应步长。它本身不擅长离散结构搜索,但在符号回归中常作为“参数优化器”嵌入外层循环:外层用 GP 或随机搜索确定表达式结构,内层用 ES 优化常数系数。这种混合策略能显著提升数值精度。

粒子群优化(Particle Swarm Optimization, PSO)通过个体历史最优和群体最优引导粒子移动,适合连续参数空间。PSO 直接用于符号回归时,需要将表达式编码为定长向量,结构灵活性受限;更常见的用法是作为常数优化器,与 GP 或 GA 结合。

方法流程:以 GP 为主线的符号回归流程

下面给出一个典型的 GP 符号回归流程,其他算法可视为其中某些环节的替换或补充。

  1. 定义终端集与函数集:终端集包括变量 x1, x2, ... 和常数;函数集包括 + - * / sin cos exp log 等。
  2. 初始化种群:随机生成一批表达式树,控制初始深度。
  3. 适应度评估:计算表达式在训练数据上的误差,常用均方误差或决定系数。
  4. 选择:采用锦标赛选择或轮盘赌选择,保留较优个体。
  5. 交叉与变异:交换子树、替换节点,产生新表达式。
  6. 复杂度控制:限制树深度、节点数,或加入复杂度惩罚项。
  7. 迭代:重复评估、选择、变异,直到达到最大代数或误差阈值。

关键点:符号回归的适应度函数通常由两部分组成——误差项 + 复杂度惩罚项。例如:fitness = MSE + λ * node_count。λ 越大,越倾向于简单表达式。

案例/场景:不同算法的适用性对比

假设我们要从 200 个样本中恢复公式 y = 2.5 * x1 * sin(x2) + 0.8。数据含少量噪声,要求表达式可解释且不过拟合。

算法 结构搜索能力 参数优化能力 典型适用场景 主要风险
遗传编程 GP 强,直接搜索表达式树 中等,常数需同步进化 未知结构、变长表达式 膨胀、过拟合、计算量大
遗传算法 GA 中等,依赖编码设计 中等 模板固定、运算符组合有限 编码冗余、结构僵化
进化策略 ES 弱,不擅长离散结构 强,适合连续常数 已知结构后的系数精调 单独使用难以发现新结构
粒子群 PSO 弱,需定长编码 强,收敛快 连续参数优化、混合框架内层 易早熟、结构表达受限

在该案例中,若直接使用 GP,通常能在几十代内找到接近 2.5 * x1 * sin(x2) + 0.8 的结构,但常数可能略有偏差。若采用“GP + ES”混合策略,外层 GP 负责发现 x1 * sin(x2) 结构,内层 ES 优化系数,最终误差更小。若只用 PSO 或 ES,则必须先假定表达式形式,否则无法有效搜索结构。

误区/复盘:常见错误与改进方向

误区一:用 PSO 直接做符号回归,却使用定长编码。这会把结构搜索退化为参数搜索,难以发现变长表达式。改进:将 PSO 限定为内层常数优化器,外层用 GP 或随机搜索。

误区二:GP 不控制复杂度,导致表达式膨胀。种群中会出现大量冗余子树,适应度提升但可解释性下降。改进:设置最大深度、节点数上限,或加入 λ * node_count 惩罚。

误区三:GA 编码设计过于复杂。若整数串到表达式的映射不直观,交叉变异容易产生无效个体。改进:采用语法引导的编码,或直接改用 GP。

复盘建议:先明确任务是“结构未知”还是“结构已知、仅调参”。结构未知优先 GP;结构已知优先 ES 或 PSO;若两者兼有,采用“GP 外层 + ES/PSO 内层”的混合框架。评估时同时报告训练误差、测试误差和表达式节点数,避免只看拟合精度。

参数配置示例

以下是一个 GP 符号回归的典型参数配置片段,可用于复现实验或作为调参起点。

population_size = 500
generations = 50
tournament_size = 7
crossover_rate = 0.9
mutation_rate = 0.1
max_depth = 6
parsimony_coefficient = 0.001
function_set = ["add", "sub", "mul", "div", "sin", "cos"]
terminal_set = ["x1", "x2", "const"]

若改用“GP + ES”混合策略,可在每代评估前对每个个体的常数节点执行 ES 局部优化:

for individual in population:
    constants = extract_constants(individual)
    optimized = es_optimize(constants, data, iterations=50)
    individual = replace_constants(individual, optimized)
    fitness = mse(individual, data) + parsimony_coefficient * node_count(individual)

总结来看,遗传编程在符号回归中具有最强的结构搜索能力,是首选算法;遗传算法适合编码可控的模板搜索;进化策略和粒子群优化更适合作为参数优化器嵌入混合框架。理解四者的分工,才能在符号回归中同时兼顾精度、复杂度和可解释性。