Python中如何用SciPy实现可自定义阶数的通用多项式曲线拟合
这个需求完全可以实现,无需绕开SciPy的入参规则,直接用Python的可变参数就能适配curve_fit的要求。
实现方案
你不需要动态生成固定参数名的函数,直接定义接收可变参数的通用多项式目标函数即可:
def poly_objective(x, *coeffs): # coeffs 顺序:x^1系数、x^2系数……x^n系数、常数项 result = 0 # 遍历前n个系数,对应x的1到n次幂 for power, coeff in enumerate(coeffs[:-1], start=1): result += coeff * (x ** power) # 加上最后一位常数项 result += coeffs[-1] return result
curve_fit会自动根据你传入的初始值p0的长度,给目标函数传递对应数量的参数,比如要做5阶多项式拟合,只要传入长度为6的初始值(5个次幂系数+1个常数项)即可,调用示例如下:
import numpy as np from scipy.optimize import curve_fit # 模拟测试数据 x = np.linspace(0, 10, 100) # 真实5阶多项式加噪声:y = 0.1x^5 + 0.5x^4 + 1.5x^3 + 3x^2 + 2x +10 y = 2 * x + 3 * x**2 + 1.5 * x**3 + 0.5 * x**4 + 0.1 * x**5 + 10 + np.random.normal(0, 5, size=x.shape) # 指定拟合阶数 order = 5 # 生成对应长度的初始值,可根据实际场景调整初始值提高拟合精度 p0 = np.ones(order + 1) popt, _ = curve_fit(poly_objective, x, y, p0=p0) # 输出拟合结果,顺序为x^1系数、x^2系数……x^5系数、常数项 print(popt)
更简洁的替代写法
你也可以直接用NumPy内置的polyval方法实现,代码更短,只是系数顺序反过来(从最高次幂到常数项):
def poly_objective_np(x, *coeffs): # coeffs 顺序:x^n系数、x^(n-1)系数……x^1系数、常数项 return np.polyval(coeffs, x)
内容的提问来源于stack exchange,提问作者Abbas Mohammed
相关产品推荐
相关产品推荐

