欢迎光临散文网 会员登陆 & 注册

【银蛇出品】数学漫谈14——关于最小二乘拟合的一些思考

2022-10-13 15:31 作者:山舞_银蛇  | 我要投稿

前置知识:线性代数、插值、数值逼近

前言:最小二乘拟合是进行数值逼近的常用手段。本文主要考虑两个问题,其一是最小二乘拟合与插值之间的关系,其二是如何利用已知点各阶导数值的信息做最小二乘拟合。在最后还将附上针对第二个问题的Matlab代码。

关键内容:最小二乘拟合、插值、导数值


一、最小二乘拟合的范数与内积观点

    假设我们已知点

(x_i%2Cf(x_i))%2Ci%3D1%2C2%2C%5Ccdots%2Cn

选择基函数

%5C%7B%5Cvarphi_i%3D%5Cvarphi_i(x)%3Ai%3D1%2C2%2C%5Ccdots%2Cm%5C%7D

进行拟合。按照范数的观点,我们应该寻找一个

%5Cvarphi%3D%5Csum_%7Bj%3D1%7D%5E%7Bm%7Dc_j%5Cvarphi_j

使得%5C%7C%5Cvarphi-f%5C%7C达到最小,这只需令%5Cfrac%7B%5Cmathrm%7Bd%7D%5C%7C%5Cvarphi-f%5C%7C_p%5Ep%7D%7B%5Cmathrm%7Bd%7Dc_j%7D%3D0。由于考虑的是离散点,我们按如下方式取范数:

%5C%7Cf%5C%7C_p%3D%5Cleft(%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%7Cf(x_i)%7C%5Ep%5Cright)%5E%5Cfrac%7B1%7Dp%7B%7D

计算可得

%5Cfrac%7B%5Cmathrm%7Bd%7D%5C%7C%5Cvarphi-f%5C%7C_p%5Ep%7D%7B%5Cmathrm%7Bd%7Dc_j%7D%3Dp%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Cleft(%7C%5Cvarphi(x_i)-f(x_i)%7C%5E%7Bp-2%7D(%5Cvarphi(x_i)-f(x_i))%5Cvarphi_j(x_i)%5Cright)%3D0

如果取p%3D2,上式就比较简单

%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Cleft(%5Csum_%7Bk%3D1%7D%5Em%20c_k%5Cvarphi_k(x_i)-f(x_i)%5Cright)%5Cvarphi_j(x_i)%3D0

这也是我们通常选择2-范数构建最小二乘拟合方程的原因。

    同时我们注意到,按这种取法的2-范数满足平行四边形公式,因此可以由它诱导出一种内积。事实上我们知道这种内积就应该是:

(f%2Cg)%3D%5Csum_%7Bi%3D1%7D%5Enf(x_i)g(x_i)

那么,可不可以直接用内积的观点看最小二乘拟合呢?这个问题实际上就是在%5Cmathrm%7Bspan%7D%5C%7B%5Cvarphi_i%5C%7D上寻找f的投影,即

(f-%5Cvarphi%2C%5Cvarphi_j)%3D0

容易验证,这与基于2-范数给出的拟合方程是一致的。


二、最小二乘拟合与插值的联系

    插值所做的事情可以描述为:仍假设已知n个点,但给定n个简单函数%5Cvarphi_i%3D%5Cvarphi_i(x),找到其线性组合使得其刚好通过所有给定点。记

%5Cboldsymbol%5Cvarphi_i%5E%5Cmathrm%7BT%7D%3D(%5Cvarphi_i(x_1)%2C%20%5Cvarphi_i(x_2)%2C%5Ccdots%2C%5Cvarphi_i(x_n))

%5Cboldsymbol%7Bf%7D%5E%5Cmathrm%7BT%7D%3D(f(x_1)%2C%20f(x_2)%2C%5Ccdots%2Cf(x_n))

则寻找线性组合系数%5Cboldsymbol%7Bc%7D%5E%5Cmathrm%7BT%7D%3D(c_1%2Cc_2%2C%5Ccdots%2Cc_n)事实上就是求解线性方程组

(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Ccdots%2C%5Cboldsymbol%7B%5Cvarphi%7D_n)%5Cboldsymbol%7Bc%7D%3D%5Cboldsymbol%7Bf%7D

当基函数选为%5Cvarphi_i(x)%3Dx%5E%7Bi-1%7D时,系数矩阵事实上就是Vandermonde矩阵,只要所给两点横坐标不相同,那么该方程就有且只有唯一解。(若选择多项式形式的基函数,总可在此基础上通过适当的可逆变换实现,从而说明这种情况也是有且只有唯一解的。对于更一般的非多项式形式,应该需要额外验证。)

    通过观察能够发现,做拟合相较于做插值,就是所给基函数的个数少于已知点的个数,这导致前边的方程组变为

(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Ccdots%2C%5Cboldsymbol%7B%5Cvarphi%7D_m)%5Cboldsymbol%7Bc%7D%3D%5Cboldsymbol%7Bf%7D

系数矩阵的行数大于列数,说明这是个超定方程,一般情况下是无解的。这时可以寻求其最佳最小二乘解,在左右两边同时左乘系数矩阵的转置得

%5Cleft(%5Cbegin%7Barray%7D%7Bc%7D%0A%5Cboldsymbol%7B%5Cvarphi%7D_1%5E%5Cmathrm%7BT%7D%5C%5C%0A%5Cboldsymbol%7B%5Cvarphi%7D_2%5E%5Cmathrm%7BT%7D%5C%5C%0A%5Cvdots%5C%5C%0A%5Cboldsymbol%7B%5Cvarphi%7D_m%5E%5Cmathrm%7BT%7D%0A%5Cend%7Barray%7D%5Cright)(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Ccdots%2C%5Cboldsymbol%7B%5Cvarphi%7D_m)%5Cboldsymbol%7Bc%7D%3D%5Cleft(%5Cbegin%7Barray%7D%7Bc%7D%0A%5Cboldsymbol%7B%5Cvarphi%7D_1%5E%5Cmathrm%7BT%7D%5C%5C%0A%5Cboldsymbol%7B%5Cvarphi%7D_2%5E%5Cmathrm%7BT%7D%5C%5C%0A%5Cvdots%5C%5C%0A%5Cboldsymbol%7B%5Cvarphi%7D_m%5E%5Cmathrm%7BT%7D%0A%5Cend%7Barray%7D%5Cright)%5Cboldsymbol%7Bf%7D

由于(%5Cboldsymbol%7B%5Cvarphi%7D_i%2C%5Cboldsymbol%7B%5Cvarphi%7D_j)%3D%5Cboldsymbol%7B%5Cvarphi%7D_i%5E%5Cmathrm%7BT%7D%5Cboldsymbol%7B%5Cvarphi%7D_j,上式进一步整理就成为了

%5Cleft(%5Cbegin%7Barray%7D%7Bcccc%7D%0A(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7B%5Cvarphi%7D_1)%20%26%20%0A(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7B%5Cvarphi%7D_2)%20%26%20%5Ccdots%20%26%0A(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7B%5Cvarphi%7D_m)%5C%5C%0A(%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Cboldsymbol%7B%5Cvarphi%7D_1)%20%26%20%0A(%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Cboldsymbol%7B%5Cvarphi%7D_2)%20%26%20%5Ccdots%20%26%0A(%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Cboldsymbol%7B%5Cvarphi%7D_m)%5C%5C%0A%5Cvdots%20%26%20%5Cvdots%20%26%20%26%20%5Cvdots%5C%5C%0A(%5Cboldsymbol%7B%5Cvarphi%7D_m%2C%5Cboldsymbol%7B%5Cvarphi%7D_1)%20%26%20%0A(%5Cboldsymbol%7B%5Cvarphi%7D_m%2C%5Cboldsymbol%7B%5Cvarphi%7D_2)%20%26%20%5Ccdots%20%26%0A(%5Cboldsymbol%7B%5Cvarphi%7D_m%2C%5Cboldsymbol%7B%5Cvarphi%7D_m)%0A%5Cend%7Barray%7D%5Cright)%5Cboldsymbol%7Bc%7D%3D%5Cleft(%5Cbegin%7Barray%7D%7Bc%7D%0A(%5Cboldsymbol%7B%5Cvarphi%7D_1%2C%5Cboldsymbol%7Bf%7D)%5C%5C%0A(%5Cboldsymbol%7B%5Cvarphi%7D_2%2C%5Cboldsymbol%7Bf%7D)%5C%5C%0A%5Cvdots%5C%5C%0A(%5Cboldsymbol%7B%5Cvarphi%7D_m%2C%5Cboldsymbol%7Bf%7D)%0A%5Cend%7Barray%7D%5Cright)

这与最小二乘拟合方程完全一致。于是说明,某种意义下,最小二乘拟合是插值的最佳最小二乘解。

    反过来,如果给定的基函数与已知点个数一样多,那么此时插值问题的解与其最佳最小二乘解一致,这时拟合问题可以退化为插值问题。


三、利用已知点各阶导数值的信息做最小二乘拟合

    如果已知一些点导数值信息,能否在做最小二乘拟合时将它们用上呢?只要能够构造一种适当的内积,其中包含导数值信息就可以了。我们先来构造这样一个运算:

(f%2Cg)_1%3D%5Cint_a%5Eb%20f'(x)g'(x)%5C%2C%5Cmathrm%7Bd%7Dx

容易验证,该运算是双线性、对称、正定的(但可能是退化的,例如对于f(x)%5Cequiv%20c就有(f%2Cf)_1%3D0),将它与我们熟知的函数内积做一线性组合:

(f%2Cg)_1%5E%5Cprime%3D%5Cint_a%5Eb%20(f(x)g(x)%2Bf'(x)g'(x))%5Cmathrm%7Bd%7Dx

可以验证,该运算满足内积的定义。由于其中包含了导数值信息,所以它是有可能实现我们的想法的。不过该内积是对连续函数来说的,下边直接给出其针对离散点的版本:

(f%2Cg)_1%5E%5Cprime%3D%5Csum_%7Bi_0%3D1%7D%5E%7Bn_0%7Df(x_%7Bi_0%7D)g(x_%7Bi_0%7D)%2B%5Csum_%7Bi_1%3D1%7D%5E%7Bn_1%7Df'(x_%7Bi_1%7D)g'(x_%7Bi_1%7D)%2C%5Cquad%20n_0%2Bn_1%3Dn

    此时,已知点的信息也要作出相应调整:

(x_%7Bi_0%7D%2Cf(x_%7Bi_0%7D))%2Ci_0%3D1%2C2%2C%5Ccdots%2Cn_0

(x_%7Bi_1%7D%2Cf'(x_%7Bi_1%7D))%2Ci_1%3D1%2C2%2C%5Ccdots%2Cn_1

如何验证这样构造的内积实现的拟合效果的准确性呢?前边提到过在适当情况下,拟合问题可以退化为插值问题,而对于已知某点导数信息做插值的问题,我们可以使用Hermite插值。所以我们只要用这个内积验证一道Hermite插值的例题就能证明其准确的必要性了。

例1. 已知

f%5Cleft(%5Cfrac%7B1%7D%7B4%7D%5Cright)%3D%5Cfrac%7B1%7D%7B8%7D%2Cf(1)%3D1%2Cf%5Cleft(%5Cfrac%7B9%7D%7B4%7D%5Cright)%3D%5Cfrac%7B27%7D%7B8%7D%2Cf'(1)%3D%5Cfrac%7B3%7D%7B2%7D

求其三次Hermite插值多项式。

    插值问题不是我们研究的重点,略去步骤,直接给出插值的结果为:

P(x)%3D-%5Cfrac%7B14%7D%7B225%7Dx%5E3%2B%5Cfrac%7B263%7D%7B450%7Dx%5E2%2B%5Cfrac%7B233%7D%7B450%7Dx-%5Cfrac%7B1%7D%7B25%7D

按照前边定义的内积,构建出的拟合方程为

%5Cleft(%5Cbegin%7Barray%7D%7Bcccc%7D%0A3%20%26%20%5Cdfrac%7B7%7D%7B2%7D%20%26%20%5Cdfrac%7B49%7D%7B8%7D%20%26%20%5Cdfrac%7B397%7D%7B32%7D%5C%5C%0A%5Cdfrac%7B7%7D%7B2%7D%20%26%20%5Cdfrac%7B57%7D%7B8%7D%20%26%20%5Cdfrac%7B461%7D%7B32%7D%20%26%20%5Cdfrac%7B3793%7D%7B128%7D%5C%5C%0A%5Cdfrac%7B49%7D%7B8%7D%20%26%20%5Cdfrac%7B461%7D%7B32%7D%20%26%20%5Cdfrac%7B3921%7D%7B128%7D%20%26%20%5Cdfrac%7B33109%7D%7B512%7D%5C%5C%0A%5Cdfrac%7B397%7D%7B32%7D%20%26%20%5Cdfrac%7B3793%7D%7B128%7D%20%26%20%5Cdfrac%7B33109%7D%7B512%7D%20%26%20%5Cdfrac%7B286201%7D%7B2048%7D%0A%5Cend%7Barray%7D%5Cright)%5Cleft(%5Cbegin%7Barray%7D%7Bc%7D%0Ac_1%20%5C%5C%20c_2%20%5C%5C%20c_3%20%5C%5C%20c_4%0A%5Cend%7Barray%7D%5Cright)%3D%5Cleft(%5Cbegin%7Barray%7D%7Bc%7D%0A%5Cdfrac%7B9%7D%7B2%7D%20%5C%5C%20%5Cdfrac%7B81%7D%7B8%7D%20%5C%5C%20%5Cdfrac%7B675%7D%7B32%7D%20%5C%5C%20%5Cdfrac%7B5625%7D%7B128%7D%0A%5Cend%7Barray%7D%5Cright)

解得

c_1%3D-%5Cfrac%7B1%7D%7B25%7D%2Cc_2%3D%5Cfrac%7B233%7D%7B450%7D%2Cc_3%3D%5Cfrac%7B263%7D%7B450%7D%2Cc_4%3D-%5Cfrac%7B14%7D%7B225%7D

与Hermite插值给出的结果一致。

    至于该方法能否推出Hermite插值的结果,笔者没有尝试,但猜测应该是成立的,感兴趣的读者可以尝试证明。

    如果已知的是更高阶导数的信息呢?通过测试,笔者给出如下形式的内积:

(f%2Cg)_l%5E%5Cprime%3D%5Csum_%7Bj%3D0%7D%5E%7Bl%7D%5Csum_%7Bi_j%3D1%7D%5E%7Bn_j%7D(l!)%5E2f%5E%7B(l)%7D(x_%7Bi_0%7D)g%5E%7B(l)%7D(x_%7Bi_0%7D)%2C%5Cquad%20%5Csum_%7Bj%3D0%7D%5E%7Bl%7Dn_j%3Dn

对于l%3D2%2C3的情形,笔者进行了类似前例的测试,结果是准确的。笔者比较感兴趣的是(l!)%5E2这个系数是从何而来的,由于时间所限,笔者无法进行进一步的论证,也将这个问题留给读者思考。


附代码(Matlab):


【银蛇出品】数学漫谈14——关于最小二乘拟合的一些思考的评论 (共 条)

分享到微博请遵守国家法律