SciPy 中最小二乘法初始参数释疑

428 字 · 2499 阅读 · 2019 年 03 月 22 日

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))