多项式拟合

2019-06-07  本文已影响0人  啊呀哟嘿

转载请注明出处

一元多项式拟合

若我们有n个点(x_i,y_i),i\in[1,n]

我希望用一个m阶多项式来拟合以上的点

使得二乘误差最小:


方法



是最优解的必要条件为。我们令上式对求导并令导数等于零得到:

写成矩阵的形式:

若我们记




此时我们有

多元多项式拟合

多元多项式拟合与上面的一元多项式拟合非常相似,唯一的不同在于我们如何构造XY矩阵。若记我们需要拟合的点为(x_i,y_i,z_i),i\in[1,n],我们希望找到一个函数f^*(x,y)=\sum_{i,j\in[0,m]}a_{i,j}^*x^iy^j 其中a_{i,j}^*\in R , \forall{(i,j)\in[0,m]^2},使得
(a_{i,j}^*)_{(i,j)\in[0,m]^2}={argmin}_{(a_{i,j})_{(i,j)\in[0,m]^2}\in R^{m^2}}l((a_{i,j})_{(i,j)\in[0,m]^2})
这里损失函数同样为二乘误差
l((a_{i,j})_{(i,j)\in[0,m]^2})=\sum_{k\in[1,n]}||f(x_k,y_k)-z_k||^2=\sum_{k\in[1,n]}||\sum_{i,j\in[0,m]}a_{i,j}x_k^iy_k^j-z_k||^2

方法

我们只需要将XY矩阵分别构造为:



其余与一元多项式拟合类似。

代码

我们提供一个二元高阶多项式拟合的python3代码供参考,输入的x,y,z为一维np.array,order为一个整数;输出为拟合的函数和相应的参数。


# two-variable high-order regression

def regression(x,y,z,order):

    # X.A=Y

    # Step 1: Create X

    X = np.ones_like(x)

    for i in range(order):

        for j in range(order):

            tmp = np.zeros(x.shape)

            tmp = x**i*y**j

            if i+j!=0:

                X = np.vstack((X,tmp))

    X = X.T

    print(X)

    Y = z

    A = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)

    def function(x,y):

        tmp = 0

        for i in range(order):

            for j in range(order):       

                tmp += A[i*order+j]*x**i*y**j

        return tmp

    return function,A

补充

这个问题可以泛化为求超定方程组的最小二乘解
对于方程组Ax=b,A=[a_{ij}]_{m\times n},当m> n(方程组中方程的个数多于自变量的个数),称此方程组为超定方程组
r=b-Ax,称使||r||^2_2最小的解x^*为方程组Ax=b最小二乘解
则我们可以证明x^*为方程组Ax=b的最小二乘解的充要条件为:
x^*是方程组A^TAx=A^Tb的解。

上一篇下一篇

猜你喜欢

热点阅读