已知函数f(x)形式与多组(x,f(x))样本 求解未知参数a/b/c的方法
参数求解可行方案
你考虑用线性回归的思路是可落地的,但原式存在参数的非线性耦合,不能直接套无约束普通线性回归,具体有两类成熟实现路径:
方案1:变量转换为带约束线性最小二乘(计算效率最高)
先把原式做代数展开,平方项拆开后形式如下:
f(x) = a·cos(x) + b²·x + 2bc·(√x · tg(x)) + c²·tg²(x)
展开后式子对中间参数是完全线性的,先做特征变换和参数替换:
- 对每组样本的输入x,计算4个线性特征:
feat1 = cos(x),对应系数 β1 = afeat2 = x,对应系数 β2 = b²feat3 = sqrt(x) * tg(x),对应系数 β3 = 2bcfeat4 = tg(x)**2,对应系数 β4 = c²
此时问题转化为带约束的线性最小二乘问题,优化目标是最小化所有样本的预测值与真实f(x)的残差平方和,约束条件共3个:
β2 ≥ 0
β4 ≥ 0
β3² = 4 * β2 * β4
求解得到β1~β4后,直接反推原始参数即可:
- a = β1
- b = √β2 (如果业务场景明确b为负,可对结果取负,无特殊要求默认取正)
- c = β3 / (2*b) (约束满足时,该值和√β4完全相等)
实现时直接调用数值计算库自带的带约束最小二乘接口即可,不需要手写优化逻辑,求解速度快,对千级以上样本量的适配性很好。
方案2:直接非线性最小二乘(代码逻辑最直观)
如果不想做特征转换和约束配置,直接把a、b、c三个原始参数作为待优化变量,定义损失为所有样本的预测残差平方和:
loss = sum( (a*cos(x_i) + (b*sqrt(x_i) + c*tg(x_i))**2 - f_true_i)**2 )
用高斯-牛顿法、L-BFGS这类通用非线性优化算法直接迭代求解即可。
这个方案不需要做额外的代数转换,代码写起来非常直白;缺点是对初始值有一定敏感度,初次求解可以给a、b、c都设初值为1,如果收敛后残差过大,换几组随机初值重跑,挑残差最小的结果即可。
落地注意事项
- 提前清洗数据中x=π/2 + kπ的样本,这类点tg(x)无定义,会导致计算报错
- 如果有效样本量少于5组,建议在损失里加L2正则项避免过拟合;样本量≥10时普通最小二乘的结果就足够稳定
- 求解完成后可以抽20%左右的样本做校验,确认预测误差在业务可接受范围内即可
内容的提问来源于stack exchange,提问作者Graviada
相关产品推荐
相关产品推荐

