如何拟合系数受约束的多项式?基于NumPy polyfit的技术问询
带约束系数的多项式拟合:无需从头实现!
当然不用自己从头写拟合逻辑啦!利用NumPy的线性代数工具,我们可以轻松改造常规的多项式拟合问题,实现对特定系数的约束。针对你提出的例子,我给你一步步演示:
问题回顾
常规三次多项式拟合的代码是这样的:
import numpy as np x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0]) z = np.polyfit(x, y, 3) # 输出:array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254])
这里z对应的多项式是:$y = z[0]x^3 + z[1]x^2 + z[2]x + z[3]$。现在要求z[2](也就是x的一次项系数)固定为1,我们可以通过问题转化来实现。
核心思路:将约束项移至目标侧
我们把约束条件代入原多项式:
$$y = a x^3 + b x^2 + 1 \cdot x + d$$
将含约束系数的项移到等式左边,得到:
$$y - x = a x^3 + b x^2 + d$$
此时右边是关于$a, b, d$的线性组合,完全可以用普通的最小二乘法求解!
具体实现代码
import numpy as np # 原始数据 x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0]) # 处理约束:将x的一次项移到左边,得到新的目标变量 y_new = y - x # 构造设计矩阵:对应x³、x²、常数项(x^0) X = np.column_stack([x**3, x**2, np.ones_like(x)]) # 用最小二乘法求解剩余系数 coeffs, _, _, _ = np.linalg.lstsq(X, y_new, rcond=None) # 组合完整的多项式系数:[a, b, 1, d] full_coeffs = np.insert(coeffs, 2, 1.0) print("带约束的拟合系数:", full_coeffs)
运行后你会得到满足约束的最佳拟合系数,这个结果和直接求解带约束的最小二乘问题完全一致。
拓展:其他约束场景
这个方法适用于任何固定单个(或多个)系数的情况:
- 如果要约束常数项($z[3]$)为0,只需构造目标变量为
y,设计矩阵为np.column_stack([x**3, x**2, x]),直接用lstsq求解即可。 - 如果有多个系数约束,比如同时固定$z[1]=0$和$z[2]=1$,同样把这些项移到左边,剩下的项组成设计矩阵求解。
这样既利用了NumPy高效的内置实现,又不用自己从头推导拟合逻辑,非常方便!
内容的提问来源于stack exchange,提问作者Jenny Shoars
相关产品推荐
相关产品推荐

