美文网首页
多项式拟合

多项式拟合

作者: 啊呀哟嘿 | 来源:发表于2019-06-07 15:19 被阅读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的解。

    相关文章

      网友评论

          本文标题:多项式拟合

          本文链接:https://www.haomeiwen.com/subject/qvimxctx.html