SciPy 中最小二乘法初始参数释疑
SciPy 提供了封装好的最小二乘法函数 scipy.optimize.leastsq()
。根据其 官方文档 显示的完整参数所示,使用该函数时需要传入 func
损失函数,x0
初始化参数以及通过 args=()
传入样本。
scipy.optimize.leastsq(func, x0, args=(), Dfun=None,
full_output=0, col_deriv=0, ftol=1.49012e-08,
xtol=1.49012e-08, gtol=0.0, maxfev=0,
epsfcn=None, factor=100, diag=None)
其中,func
很好理解,我们可以定义一个残差函数。而 x0
让人产生疑惑,其在官方文档中的含义是 The starting estimate for the minimization.
,字面意思是最小化的初始参数。
对于最小二乘法来说,其最终求解的是解析解,而不会涉及到从某个参数开始迭代的过程。那这里的 x0
有什么作用呢?
实际上,这里的 x0
的具体取值不会影响求解结果,所以我们可以传入随机值。但是,其值的个数决定了最终多项式的次数。具体来说,$n$ 个值表明所求解的多项式总共包含 $n$ 个参数,最终求解出的是 $n-1$ 次多项式。
一个完整的使用示例如下:
from scipy.optimize import leastsq
def func(p, x):
# 定义一个 2 次多项式函数
w0, w1, w2 = p
f = w0 + w1*x + w2*x*x
return f
def err_func(p, x, y):
# 残差函数
ret = func(p, x) - y
return ret
p_init = np.random.randn(3) # 生成 3 个随机数
# 使用 Scipy 提供的最小二乘法函数得到最佳拟合参数
parameters = leastsq(err_func, p_init, args=(x, y))