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 符号回归流程,其他算法可视为其中某些环节的替换或补充。
- 定义终端集与函数集:终端集包括变量
x1, x2, ...和常数;函数集包括+ - * / sin cos exp log等。 - 初始化种群:随机生成一批表达式树,控制初始深度。
- 适应度评估:计算表达式在训练数据上的误差,常用均方误差或决定系数。
- 选择:采用锦标赛选择或轮盘赌选择,保留较优个体。
- 交叉与变异:交换子树、替换节点,产生新表达式。
- 复杂度控制:限制树深度、节点数,或加入复杂度惩罚项。
- 迭代:重复评估、选择、变异,直到达到最大代数或误差阈值。
关键点:符号回归的适应度函数通常由两部分组成——误差项 + 复杂度惩罚项。例如: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)
总结来看,遗传编程在符号回归中具有最强的结构搜索能力,是首选算法;遗传算法适合编码可控的模板搜索;进化策略和粒子群优化更适合作为参数优化器嵌入混合框架。理解四者的分工,才能在符号回归中同时兼顾精度、复杂度和可解释性。