精华内容
下载资源
问答
  • matlab编程,用法方程组实现最小二乘拟合四次多项式,算例参考《数值分析》(梅立泉)P176的5.1
  • Matlab最小二乘拟合图像;可以拟合任意数量的数据;可查看截距、斜率;有网格;之线区间可以根据自己实际需求改写,默认600;显示线性度的最大非线性;有图例,说明哪个数据是什么
  • 今天小编就为大家分享一篇在python中利用最小二乘拟合二次抛物线函数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 为了从含噪声的位移场中计算得到可靠的应变场,提出一种基于位移场局部最小二乘拟合的全场应变求解方法。介绍了数字图像相关方法的原理,阐述了基于位移场局部最小二乘拟合的全场应变求解方法,并讨论了计算区域边界、...
  • 此外,它们可用于使用 Zernike 多项式对圆形Kong径内的任何图像执行快速最小二乘拟合,返回拟合中使用的每个多项式的相对系数(或“矩”,如文献所述)。 非常感谢 Chong et。 al 用于提出递归算法来计算多项式的...
  • 最小二乘法高斯曲线拟合,基于最小二乘法拟合高斯曲线,(Least squares Gaussian curve fitting )
  • 本文主要介绍最小二乘拟合的一般方法,并在最后附上MATLAB的代码实现。主要理论分为两个部分: 最小二成拟合的基本理论推导; 添加正则项之后的理论推导;附件主要内容: 推导.docx:给出了主要的理论推导步骤; fit_...
  • 用C语言编写的最小二乘拟合算法,自己编写的,已经经过例子验证结果正确,请放心用!
  • 在分析传统的光斑质心亚像素细分算法误差原因的基础上,提出了一种基于“金字塔思想”分层方式的三次线形插值和最小二乘拟合的质心算法。通过多次插值对光斑图像进行逐层细分,采用最小二乘曲面拟合在每一层内进行...
  • 常用的一些函数的拟合算法,包括多项式、指数、对数和幂函数等;可以设置截距、权重,不依赖第三方库,跨平台运行。
  • 介绍了Savitzky-Golay滤波器的推导方法――多项式的最小二乘拟合法及其推导过程,以及如何由Savitzkv和Golay提出的多项式卷积计算方法进行最小二乘拟合计算,对Savitzky-Golay滤波器的二维算法进行了简单介绍,对其...
  • 最小二乘拟合MATLAB程序-数值分析、最小二乘直线拟合、最小二乘曲线拟合
  • 基于MATLAB的离散数据最小二乘拟合 (1).pdf
  • matlab下实现最小二乘拟合测试,程序中给了部分离散的数据,在此基础上实现拟合,并绘图。
  • 最小二乘拟合及一维数组差值等数据处理方法
  • 3元1次最小二乘拟合

    2014-09-21 09:17:21
    使用fortran的最小二乘拟合,X1,X2,X3为参数,Y为对应行值
  • 函数逼近基础算法,离散试验数据点的线性最小二乘拟合
  • 最小二乘拟合

    千次阅读 2019-08-09 14:23:00
    最小二乘拟合 ​ 假设有一组实验数据(xi,yi),我们事先知道它们之间应该满足某函数关系: yi = f(xi)。通 过这些已知信息,需要确定函数 f()的一些参数。例如,如果函数 f()是线性函数f(x) = kx + b ,那么参数k和...

    最小二乘拟合

    ​ 假设有一组实验数据(xi,yi),我们事先知道它们之间应该满足某函数关系: yi = f(xi)。通 过这些已知信息,需要确定函数 f()的一些参数。例如,如果函数 f()是线性函数f(x) = kx + b ,那么参数k和b 就是需要确定的值。
    ​ 如果用p 表示函数中需要确定的参数,则目标是找到一组P使得函数S 的值最小:

    这种算法被称为最小二乘拟合(least-square fitting)。在 optimize模块中,可以使用leastsq()对数据进行最小二乘拟合计算。leastsq()的用法很简单,只需要将计箅误差的函数和待确定参数的 初始值传递给它即可。下面是用leastsq()对线性函数进行拟合的程序:

    from scipy import optimize
    import numpy as np
    import  matplotlib.pyplot as plt
    import matplotlib
    matplotlib.rcParams['font.family']='FangSong'
    matplotlib.rcParams['font.size']=15
    plt.rcParams['axes.unicode_minus']=False # 解决负号乱码问题
    
    # 最小二乘拟合 
    x = np.array([8.19,2.27,6.39,8.71,4.7,2.66,3.78])
    y = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
    
    def residuals(p):
        "计算以p为参数的直线与原始数据之间的误差"
        k,b = p
        return y-(k*x+b)
    
    # leastsq 使得residuals()的输出数组的平方和最小,参数的初始值[1,0]
    r = optimize.leastsq(residuals,[1,0])
    k,b = r[0]
    print("k=%s,b=%s"%(k,b))
    
    X=np.linspace(-10,10,100)
    plt.plot(X,k*X+b,label=u"拟合直线")
    plt.plot(x,y,"og",label=u"原始数据")
    plt.legend()
    plt.ylabel("y")
    plt.xlabel("x")
    plt.title(u"最小二乘拟合")
    

    14657665-2597b76573e7e0a2.png

     

    ​ 直观地显示了拟合直线以及它们之间的误差。Oresiduals()的参数p 是拟合直线的参数,函数返回的是原始数据和拟合直线之间的误差。其中,数据点到拟合线距离表示误差。leastsq()使得这些误差的平方和最小。

    例子:正弦波数据拟合

    def func(x,p):
        """
        数据拟合所用的函数:A*sin(2*pi*k*x+theta)
        """
        A,k,theta = p
        return A*np.sin(2*np.pi*k*x+theta)
    
    def residuals(p,y,x):
        """
        实验数据x,y和拟合函数之间的差,p为拟合所需要找到的系数
        """
        return y-func(x,p)
    
    x = np.linspace(0,2*np.pi,100)
    A ,k,theta = 10,0.34,np.pi/6 # 真实数据的函数参数
    y0 = func(x,[A,k,theta]) # 真是数据
    
    # 加入噪声之后的实验数据
    np.random.seed(0)
    y1 = y0 + 2*np.random.randn(len(x))
    #print(2*np.random.randn(len(x)))
    p0 = [7,0.4,0] # 第一次猜测的函数拟合参数
    
    # 调用leastsq进行数据拟合
    # residuals为计算误差函数
    # p0为拟合参数的初始值
    # args 为需要拟合的实验数据
    
    plsq = optimize.leastsq(residuals,p0,args=(y1,x))
    
    print("真实参数;%s"%[A,k,theta])
    print("拟合参数:%s"%plsq[0])
    
    plt.figure(figsize=(10,8),dpi=80)
    plt.plot(x,y1,"o",label="带噪声的实验数据")
    plt.plot(x,y0,label="真实数据")
    plt.plot(x,func(x,plsq[0]),label="拟合数据")
    plt.legend()
    
    真实参数;[10, 0.34, 0.5235987755982988]
    拟合参数:[10.25218748  0.3423992   0.50817423]
    

    14657665-e765f8be33c26d7c.png

     

    ​ 程序中,要拟合的目标函数func()是一个正弦函数,它的参数p 是一个数组,包含决定正弦波的三个参数A 、k 、theta, 分別对应正弦函数的振幅、频率和相角。待拟合的实验数据 是一组包含噪声的数据(x,y1) , 其中数组y1为标准正弦波数据y0加上随机噪声。
    ​ 用 leastsq()对带噪声的实验数据(x,y1)进行数据拟合,它可以找到数组x 和 y0之间的正弦关系,即确定A 、k 、theta等参数。和前而的直线拟合程序不同的是,这里我们将(y1,x )传递给 args参数。leastsq()会将这两个额外的参数传递给residuals()。 因此residuals()有三个参数,p 是 正弦函数的参数,y 和 x 是表示实验数据的数组。
    ​ 对于这利用 一维曲线拟合,optimize库还提供了一个curve_fit()函数,下而使用此函数对正弦波数据进行拟合。它的目标函数与leastsq()稍有不同,各个待优化参数直接作为函数的参数传入。

    def func2(x,A,k,theta):
        return A*np.sin(2*np.pi*k*x+theta)
    
    x = np.linspace(0,2*np.pi,100)
    A,k,theta = 10,0.34,np.pi/6 # 真实数据的函数参数
    y0 = func2(x,A,k,theta) # 真实数据
    y1 = y0 + 2*np.random.randn(len(x)) # 加入噪声之后的实验数据
    p0 = [7,0.4,0] # 第一次猜测的函数拟合参数
    popt,_ = optimize.curve_fit(func2,x,y1,p0=p0)
    print(popt)
    
    [10.17528457  0.33765547  0.55404791]
    

    ​ 如果频率的初值和真实值的差别较大,拟合结果中的频率参数可能无法收敛于实际的频率。 在下面的例子中,由于频率初值的选择不当,导致curve_fit()未能收敛到真实的参数。这时可以通过其他方法先估算一个频率的近似值,或者使用全局优化算法。在后面的例子中,我们会使用全局优化算法重新对正弦波数据进行拟合。

    def func2(x,A,k,theta):
        return A*np.sin(2*np.pi*k*x+theta)
    
    x = np.linspace(0,2*np.pi,100)
    A,k,theta = 10,0.34,np.pi/6 # 真实数据的函数参数
    y0 = func2(x,A,k,theta) # 真实数据
    y1 = y0 + 2*np.random.randn(len(x)) # 加入噪声之后的实验数据
    
    popt,_ = optimize.curve_fit(func2,x,y1,p0=[10,1,0])
    print("真实参数%s"%[A,k,theta])
    print("拟合参数%s"%popt)
    
    真实参数[10, 0.34, 0.5235987755982988]
    拟合参数[ 1.30116633  1.04310843 -0.081064  ]
    

    摘自《python科学计算》

    展开全文
  • 用Python做最小二乘拟合
  • 移动最小二乘法拟合数据软件-移动最小二乘拟合软件说明.pdf 本帖最后由 jacket2015 于 2015-2-17 23:09 编辑 移动最小二乘拟合软件(附加任意已知函数最小二乘拟合以及神经网络拟合) 功能描述: 1、 本软件...
  • C语言最小二乘算法.h文件,才用指针编写,计算效率高,可直接嵌入算法之中
  • 该程序能够实现一维离散数据的正交多项式最小二乘拟合
  • 最小二乘法原理以及其平面拟合c++实现代码
  • 最小二乘 拟合 matlab

    2016-05-10 20:00:13
    最小二乘拟合计算量小。
  • C++最小二乘拟合 (高阶最小二乘拟合)(附C++代码)

    万次阅读 多人点赞 2019-03-27 17:20:53
    后续计算需要利用矩阵运算来求解拟合系数,用到Eigen矩阵运算库,配置方法可自行搜索或MacOs可以参考Mac配置Eigen库进行配置。 拟合原理 以二次曲线拟合为例,拟合曲线应满足以下方程: a∗X2+b∗X+c=ya*X^2 + b*X ...

    配置Eigen矩阵运算库

    后续计算需要利用矩阵运算来求解拟合系数,用到Eigen矩阵运算库,配置方法可自行搜索或MacOs可以参考Mac配置Eigen库进行配置。

    拟合原理

    以二次曲线拟合为例,拟合曲线应满足以下方程:

    a ∗ X 2 + b ∗ X + c = y a*X^2 + b*X + c = y aX2+bX+c=y

    如要要拟合的4个点为:

    (3, 6)

    (5, 8)

    (6, 12)

    (7, 4)

    则有:

    在这里插入图片描述

    即有:

    A W = B A W = B AW=B

    A T A W = A T B A^TAW = A^TB ATAW=ATB

    ( A T A ) − 1 A T A W = ( A T A ) − 1 A T B (A^TA)^ {-1}A^TAW = (A^TA)^{-1}A^TB (ATA)1ATAW=(ATA)1ATB

    W = ( A T A ) − 1 A T B W = (A^TA)^{-1}A^TB W=(ATA)1ATB

    由上面最后一个等式利用矩阵的转置与求逆,则可以得出其拟合曲线的系数W矩阵。

    准备数据

    由于PythonMatplotlib库可以很好地可视化数据,所以选用Python来生成数据文件——points.txt

    代码如下,程序中设置的系数为a = 2.2, b = 1.4, c = -1.3

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # 设置点数
    num = 100
    
    # 设置噪声系数
    rate = 0
    
    # 生成数据
    x = np.linspace(-10, 10, num)
    y = []
    a = 2.2
    b = 1.4
    c = -1.3
    
    for i in x:
        noise = np.random.random()
        temp = i + noise * rate
        y.append(a * pow(temp, 2) + b * temp + c)
    
    # 绘制曲线
    plt.plot(x, y)
    plt.show()
    
    # 写入文件
    with open("./points.txt", 'w') as f:
        for i in range(num):
            f.write(str(x[i]))
            f.write("\t")
            f.write(str(y[i]))
            f.write("\n")
    

    曲线为:

    在这里插入图片描述

    程序会在当前目录下生成points.txt文件。

    在这里插入图片描述

    C++最小二乘拟合代码

    以下代码理论上可以完成N阶的曲线拟合,需要对参数N进行设置,并提供正确的数据点。

    #include <Eigen/Core>
    #include <Eigen/Dense>
    #include <Eigen/Geometry>
    #include <Eigen/Eigenvalues>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <cmath>
    
    using namespace std;
    
    
    int main() {
        // txt点数据文件路径
        const string fileName = "./points.txt";
        
        // 设置是几次拟合
        const int N = 2;
        
        // 创建两个vector
        vector<float> x, y;
        
        // 读取文件
        ifstream f(fileName);
        
        if (!f) {
            cout << "数据文件打开失败" << endl;
            exit(EXIT_FAILURE);
        }
        
        float tempx, tempy;
        
        while (f >> tempx >> tempy) {
            x.push_back(tempx);
            y.push_back(tempy);
        }
        
        if (x.size() != y.size()) {
            cout << "数据文件内容有误" << endl;
            exit(EXIT_FAILURE);
        }
        
        // 创建A矩阵
        Eigen::MatrixXd A(x.size(), N + 1);
        
        for (unsigned int i = 0; i < x.size(); ++i) {  // 遍历所有点
            
            for (int n = N, dex = 0; n >= 1; --n, ++dex) {  // 遍历N到1阶
                A(i, dex) = pow(x[i], n);
            }
            
            A(i, N) = 1;  //
        }
        
        // 创建B矩阵
        Eigen::MatrixXd B(y.size(), 1);
        
        for (unsigned int i = 0; i < y.size(); ++i) {
            B(i, 0) = y[i];
        }
      	
        // 创建矩阵W
        Eigen::MatrixXd W;
        W = (A.transpose() * A).inverse() * A.transpose() * B;
        
      	// 打印W结果
        cout << W << endl;
    }
    

    结果

    程序输出为

    2.2
    1.4
    -1.3

    与设置的系数相吻合,但这是建立在噪声为0的情况下的结果,想要体验不同噪声对拟合结果的朋友可以在给出的Python程序中对rate参数进行修改。

    展开全文
  • 使用最小二乘拟合得近似解。 误差函数: R=∑i=1n[∑j=1maijxj−bi]2R = \sum_{i = 1}^n \left [ \sum_{j = 1}^m a_{ij}x_j - b_i \right ]^2R=i=1∑n​[j=1∑m​aij​xj​−bi​]2 最小化误差函数,偏导数: ∂R∂...

    最小二乘法求解矛盾方程组

    矛盾方程组:方程个数多于未知数个数,不能得到精确解析解。

    使用最小二乘拟合得近似解。

    误差函数:
    L = ∑ i = 1 n [ ∑ j = 1 m a i j x j − b i ] 2 L = \sum_{i = 1}^n \left [ \sum_{j = 1}^m a_{ij}x_j - b_i \right ]^2 L=i=1n[j=1maijxjbi]2
    最小化误差函数,偏导数:
    ∂ L ∂ x k = 2 ∑ i = 1 n [ ∑ j = 1 m a i j x j − b i ] a i k = 2 ∑ j = 1 m ( ∑ i = 1 n a i j a i k ) x j − 2 ∑ i = 1 n a i k b i = 0 \begin{aligned} \frac{\partial L}{\partial x_k} & = 2\sum_{i = 1}^n \left [ \sum_{j = 1}^m a_{ij}x_j-b_i \right ]a_{ik} \\ & = 2\sum_{j = 1}^m \left ( \sum_{i = 1}^n a_{ij}a_{ik}\right ) x_j - 2\sum_{i = 1}^na_{ik}b_i \\ & = 0\\ \end{aligned} xkL=2i=1n[j=1maijxjbi]aik=2j=1m(i=1naijaik)xj2i=1naikbi=0

    这样就能得到正规方程组(m个方程,m个未知数):
    ∑ j = 1 m ( ∑ i = 1 n a i j a i k ) x j = ∑ i = 1 n a i k b i \sum_{j = 1}^m \left ( \sum_{i = 1}^n a_{ij}a_{ik}\right ) x_j = \sum_{i = 1}^na_{ik}b_i j=1m(i=1naijaik)xj=i=1naikbi

    稍微化简一下:
    ∑ j = 1 m c i k x j = ∑ i = 1 n d j \sum_{j = 1}^m c_{ik} x_j = \sum_{i = 1}^n d_j j=1mcikxj=i=1ndj
    A ⊤ A x = A ⊤ b A^{\top}Ax=A^{\top}b AAx=Ab

    例题,矛盾方程组 { x 1 − x 2 = 1 − x 1 + x 2 = 2 2 x 1 − 2 x 2 = 3 − 3 x 1 + x 2 = 4 \left\{\begin{matrix} x_1 - x_2 = 1 \\ -x_1 + x_2 = 2 \\ 2x_1-2 x_2 = 3 \\ -3x_1+ x_2 = 4 \end{matrix}\right. x1x2=1x1+x2=22x12x2=33x1+x2=4

    A = [ 1 − 1 − 1 1 2 − 2 − 3 1 ] , b = [ 1 2 3 4 ] A=\begin{bmatrix}1 & -1\\-1 & 1\\2 & -2\\-3 & 1\end{bmatrix},b=\begin{bmatrix}1\\2\\3\\4\end{bmatrix} A=11231121,b=1234

    A ⊤ A = [ 15 − 9 − 9 7 ] , A ⊤ b = [ − 7 − 1 ] A^{\top}A=\begin{bmatrix}15&-9\\-9&7\end{bmatrix},A^{\top}b=\begin{bmatrix}-7\\-1\end{bmatrix} AA=[15997],Ab=[71]

    则正规方程组为
    { 15 x 1 − 9 x 2 = − 7 − 9 x 1 + x 2 = − 1 \left\{\begin{matrix} 15x_1 - 9x_2 = -7 \\ -9x_1 + x_2 = -1 \\ \end{matrix}\right. {15x19x2=79x1+x2=1

    联立方程组解得:
    x 1 = − 29 12 , x 2 = − 39 12 x_1=-\frac{29}{12},x_2=-\frac{39}{12} x1=1229,x2=1239


    最小二乘拟合多项式

    多项式的基函数(线性无关)取:
    1 , x , x 2 , ⋯   , x m 1,x,x^2,\cdots,x^m 1,x,x2,,xm

    拟合多项式:
    P ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a m x m P(x)=a_0 + a_1x + a_2 x^2 + \cdots + a_m x^m P(x)=a0+a1x+a2x2++amxm

    将 n 个数据 ( x i , y i ) (x_i,y_i) (xi,yi) 代入 多项式 就得到 n 个方程和 m+1 个未知数的矛盾方程组:
    { a 0 + a 1 x 1 + a 2 x 1 2 + ⋯ + a m x 1 m = y 1 a 0 + a 2 x 1 + a 2 x 2 2 + ⋯ + a m x 2 m = y 2 ⋮ a 0 + a 2 x n + a 2 x n 2 + ⋯ + a m x n m = y 3 \left\{\begin{matrix} a_0 + a_1 x_1 + a_2 x_1^2 + \cdots + a_m x_1^m = y_1 \\ a_0 + a_2 x_1 + a_2 x_2^2 + \cdots + a_m x_2^m = y_2 \\ \vdots \\ a_0 + a_2 x_n + a_2 x_n^2 + \cdots + a_m x_n^m = y_3 \end{matrix}\right. a0+a1x1+a2x12++amx1m=y1a0+a2x1+a2x22++amx2m=y2a0+a2xn+a2xn2++amxnm=y3

    记:
    A = [ 1 x 1 x 1 2 ⋯ x 1 m 1 x 2 x 2 2 ⋯ x 2 m ⋮ 1 x n x n 2 ⋯ x n m ] A = \begin{bmatrix} 1& x_1 & x_1^2 & \cdots & x_1^m \\ 1& x_2 & x_2^2 & \cdots & x_2^m \\ \vdots\\ 1& x_n & x_n^2 & \cdots & x_n^m \\ \end{bmatrix} A=111x1x2xnx12x22xn2x1mx2mxnm

    α = ( a 0 , a 1 , ⋯   , a m ) ⊤ \alpha = (a_0,a_1,\cdots,a_m)^{\top} α=(a0,a1,,am)
    y = ( y 0 , y 1 , ⋯   , y m ) ⊤ y = (y_0,y_1,\cdots,y_m)^{\top} y=(y0,y1,,ym)

    则可写出矩阵形式:
    A α = y A \alpha = y Aα=y

    正规方程组:
    A ⊤ A α = A ⊤ y A^{\top}A \alpha = A^{\top}y AAα=Ay

    A ⊤ A = [ 1 1 1 ⋯ 1 x 1 x 2 x 3 ⋯ x n x 1 2 x 2 2 x 3 2 ⋯ x n 2 ⋯ x 1 m x 2 m x 3 m ⋯ x n m ] [ 1 x 1 x 1 2 ⋯ x 1 m 1 x 2 x 3 2 ⋯ x 2 m ⋮ 1 x n x n 2 ⋯ x n m ] = [ n ∑ i = 1 n x i ∑ i = 1 n x i 2 ⋯ ∑ i = 1 n x i m ∑ i = 1 n x i ∑ i = 1 n x i 2 ∑ i = 1 n x i 3 ⋯ ∑ i = 1 n x i m + 1 ⋮ ⋮ ⋮ ⋱ ⋮ ∑ i = 1 n x i m ∑ i = 1 n x i m + 1 ∑ i = 1 n x i m + 2 ⋯ ∑ i = 1 n x i 2 m ] \begin{aligned} A^{\top}A &=\begin{bmatrix} 1&1&1& \cdots &1\\ x_1&x_2&x_3&\cdots &x_n \\ x_1^2&x_2^2&x_3^2&\cdots &x_n^2 \\ \cdots \\ x_1^m&x_2^m&x_3^m&\cdots &x_n^m \end{bmatrix} \begin{bmatrix} 1& x_1 & x_1^2 & \cdots & x_1^m \\ 1& x_2 & x_3^2 & \cdots & x_2^m \\ \vdots\\ 1& x_n & x_n^2 & \cdots & x_n^m \\ \end{bmatrix}\\ &=\begin{bmatrix} n&\sum_{i=1}^n x_i &\sum_{i=1}^n x_i^2 & \cdots &\sum_{i=1}^n x_i^m\\ \sum_{i=1}^n x_i&\sum_{i=1}^n x_i^2 &\sum_{i=1}^n x_i^3 & \cdots &\sum_{i=1}^n x_i^{m+1}\\ \vdots &\vdots &\vdots& \ddots &\vdots\\\\ \sum_{i=1}^n x_i^m&\sum_{i=1}^n x_i^{m+1} &\sum_{i=1}^n x_i^{m+2} & \cdots &\sum_{i=1}^n x_i^{2m}\\ \end{bmatrix} \end{aligned} AA=1x1x12x1m1x2x22x2m1x3x32x3m1xnxn2xnm111x1x2xnx12x32xn2x1mx2mxnm=ni=1nxii=1nximi=1nxii=1nxi2i=1nxim+1i=1nxi2i=1nxi3i=1nxim+2i=1nximi=1nxim+1i=1nxi2m

    A ⊤ y = [ 1 1 1 ⋯ 1 x 1 x 2 x 3 ⋯ x n x 1 2 x 2 2 x 3 2 ⋯ x n 2 ⋯ x 1 m x 2 m x 3 m ⋯ x n m ] [ y 0 y 1 y 2 ⋮ y m ] = [ ∑ i = 1 n y i ∑ i = 1 n y i x i ∑ i = 1 n y i x i 2 ⋯ ∑ i = 1 n y i x i m ] \begin{aligned} A^{\top}y &=\begin{bmatrix} 1&1&1& \cdots &1\\ x_1&x_2&x_3&\cdots &x_n \\ x_1^2&x_2^2&x_3^2&\cdots &x_n^2 \\ \cdots \\ x_1^m&x_2^m&x_3^m&\cdots &x_n^m \end{bmatrix} \begin{bmatrix}y_0\\y_1\\y_2\\\vdots \\y_m \end{bmatrix}\\ &=\begin{bmatrix} \sum_{i=1}^n y_i\\ \sum_{i=1}^n y_i x_i\\ \sum_{i=1}^n y_i x_i^2\\ \cdots \\ \sum_{i=1}^n y_i x_i^{m} \end{bmatrix} \end{aligned} Ay=1x1x12x1m1x2x22x2m1x3x32x3m1xnxn2xnmy0y1y2ym=i=1nyii=1nyixii=1nyixi2i=1nyixim

    可以看到 A ⊤ A A^{\top}A AA A ⊤ y A^{\top}y Ay 只与输入数据有关,因此可以解得 α = ( a 0 , a 1 , a 2 , ⋯   , a m ) \alpha=(a_0, a_1,a_2,\cdots , a_m) α=(a0,a1,a2,,am) ,多项式表达式如下
    P ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a m x m P(x)=a_0 + a_1x + a_2 x^2 + \cdots + a_m x^m P(x)=a0+a1x+a2x2++amxm


    例题

    x i x_i xi1234678
    y i y_i yi2367532

    用最小二乘法求多项式曲线,取
    P ( x ) = a 0 + a 1 x + a 2 x 2 P(x) = a_0 + a_1 x + a_2 x^2 P(x)=a0+a1x+a2x2

    首先计算

    n n n ∑ i = 1 7 x i \sum_{i=1}^7 x_i i=17xi ∑ i = 1 7 x i 2 \sum_{i=1}^7 x_i^2 i=17xi2 ∑ i = 1 7 x i 3 \sum_{i=1}^7 x_i^3 i=17xi3 ∑ i = 1 7 x i 3 \sum_{i=1}^7 x_i^3 i=17xi3
    73117911718147
    ∑ i = 1 7 y i \sum_{i=1}^7 y_i i=17yi ∑ i = 1 7 y i x i \sum_{i=1}^7 y_i x_i i=17yixi ∑ i = 1 7 y i x i 2 \sum_{i=1}^7 y_i x_i^2 i=17yixi2
    28121635

    { 7 a 0 + 31 a 1 + 179 a 2 = 28 31 a 0 + 179 a 1 + 1171 a 2 = 121 179 a 0 + 1171 a 1 + 8147 a 2 = 635 \left\{\begin{matrix} 7a_0 + 31a_1 + 179a_2 = 28 \\ 31a_0 + 179a_1 + 1171a_2 = 121 \\ 179a_0 + 1171a_1 + 8147a_2 = 635 \end{matrix}\right. 7a0+31a1+179a2=2831a0+179a1+1171a2=121179a0+1171a1+8147a2=635

    联立方程得:
    a 0 = − 1.3185 , a 1 = 3.4321 , a 2 = − 0.3864 a_0=-1.3185,a_1=3.4321,a_2=-0.3864 a0=1.3185,a1=3.4321,a2=0.3864

    P ( x ) = − 1.3185 + 3.4321 x − 0.3864 x 2 P(x)=-1.3185 + 3.4321x - 0.3864x^2 P(x)=1.3185+3.4321x0.3864x2


    正交多项式

    正规方程组(法方程)不一定是线性方程组。

    设多项式为
    D ( x ) = a 0 φ 0 ( x ) + a 1 φ 2 ( x ) + ⋯ + a m φ m ( x ) D(x) = a_0 \varphi_0(x) + a_1 \varphi_2(x) + \cdots + a_m \varphi_m(x) D(x)=a0φ0(x)+a1φ2(x)++amφm(x)

    假设有 n 组数据 ( x i , y i ) (x_i, y_i) (xi,yi) i = 1 , 2 , ⋯   , n i=1,2,\cdots,n i=1,2,,n,那么误差函数表示为
    L = ∑ i = 1 n [ a 0 φ 0 ( x i ) + a 1 φ 2 ( x i ) + ⋯ + a m φ m ( x i ) − y i ] 2 L = \sum_{i=1}^n [a_0 \varphi_0(x_i) + a_1 \varphi_2(x_i) + \cdots + a_m \varphi_m(x_i) - y_i]^2 L=i=1n[a0φ0(xi)+a1φ2(xi)++amφm(xi)yi]2

    目标是最小化误差函数,求误差函数关于参数 a 0 , a 1 , ⋯   , a m a_0,a_1,\cdots,a_m a0,a1,,am的偏导数:

    ∂ L ∂ a 0 = 2 ∑ i = 1 n [ a 0 φ 0 ( x i ) + a 1 φ 2 ( x i ) + ⋯ + a m φ m ( x i ) − y i ] φ 0 ( x i ) = 0 ∂ L ∂ a 1 = 2 ∑ i = 1 n [ a 0 φ 0 ( x i ) + a 1 φ 2 ( x i ) + ⋯ + a m φ m ( x i ) − y i ] φ 1 ( x i ) = 0 ⋮ ∂ L ∂ a m = 2 ∑ i = 1 n [ a 0 φ 0 ( x i ) + a 1 φ 2 ( x i ) + ⋯ + a m φ m ( x i ) − y i ] φ m ( x i ) = 0 \frac{\partial L}{\partial a_0} = 2 \sum_{i=1}^n [a_0 \varphi_0(x_i) + a_1 \varphi_2(x_i) + \cdots + a_m \varphi_m(x_i) - y_i]\varphi_0(x_i) = 0\\ \frac{\partial L}{\partial a_1} = 2 \sum_{i=1}^n [a_0 \varphi_0(x_i) + a_1 \varphi_2(x_i) + \cdots + a_m \varphi_m(x_i) - y_i]\varphi_1(x_i) = 0\\ \vdots \\ \frac{\partial L}{\partial a_m} = 2 \sum_{i=1}^n [a_0 \varphi_0(x_i) + a_1 \varphi_2(x_i) + \cdots + a_m \varphi_m(x_i) - y_i]\varphi_m(x_i) = 0 a0L=2i=1n[a0φ0(xi)+a1φ2(xi)++amφm(xi)yi]φ0(xi)=0a1L=2i=1n[a0φ0(xi)+a1φ2(xi)++amφm(xi)yi]φ1(xi)=0amL=2i=1n[a0φ0(xi)+a1φ2(xi)++amφm(xi)yi]φm(xi)=0

    整理一下:
    ∂ L ∂ a k = 2 ∑ i = 1 n [ a 0 φ 0 ( x i ) + a 1 φ 2 ( x i ) + ⋯ + a m φ m ( x i ) − y i ] φ k ( x i ) = 0 k = 0 , 1 , ⋯   , m \frac{\partial L}{\partial a_k} = 2 \sum_{i=1}^n [a_0 \varphi_0(x_i) + a_1 \varphi_2(x_i) + \cdots + a_m \varphi_m(x_i) - y_i]\varphi_k(x_i) = 0\\ k = 0,1,\cdots,m akL=2i=1n[a0φ0(xi)+a1φ2(xi)++amφm(xi)yi]φk(xi)=0k=0,1,,m

    a 0 ∑ i = 1 n φ 0 ( x i ) φ k ( x i ) + a 1 ∑ i = 1 n φ 1 ( x i ) φ k ( x i ) + ⋯ + a m ∑ i = 1 n φ m ( x i ) φ k ( x i ) = ∑ i = 1 n y i φ k ( x i ) k = 0 , 1 , ⋯   , m a_0 \sum_{i=1}^n \varphi_0(x_i) \varphi_k(x_i) + a_1 \sum_{i=1}^n \varphi_1(x_i) \varphi_k(x_i) + \cdots+ a_m \sum_{i=1}^n \varphi_m(x_i) \varphi_k(x_i) =\sum_{i=1}^n y_i \varphi_k(x_i)\\ k = 0,1,\cdots,m a0i=1nφ0(xi)φk(xi)+a1i=1nφ1(xi)φk(xi)++ami=1nφm(xi)φk(xi)=i=1nyiφk(xi)k=0,1,,m

    其中, ∑ i = 1 n φ j ( x i ) φ k ( x i ) \sum_{i=1}^n \varphi_j(x_i) \varphi_k(x_i) i=1nφj(xi)φk(xi) 表示 φ j ( x ) \varphi_j(x) φj(x) φ k ( x ) \varphi_k(x) φk(x) 的卷积,简记为 ( φ j , φ k ) (\varphi_j, \varphi_k) (φj,φk),如果 φ j ( x ) \varphi_j(x) φj(x) φ k ( x ) \varphi_k(x) φk(x) 是正交关系,则它们的卷积为零,即 ∑ i = 1 n φ j ( x i ) φ k ( x i ) = 0 \sum_{i=1}^n \varphi_j(x_i) \varphi_k(x_i) = 0 i=1nφj(xi)φk(xi)=0

    a 0 ( φ 0 , φ k ) + a 1 ( φ 1 , φ k ) + ⋯ + a m ( φ m , φ k ) = ( f , φ k ) k = 0 , 1 , ⋯   , m a_0 (\varphi_0, \varphi_k) + a_1 (\varphi_1, \varphi_k) + \cdots+ a_m (\varphi_m, \varphi_k) = (f, \varphi_k) \\ k = 0,1,\cdots,m a0(φ0,φk)+a1(φ1,φk)++am(φm,φk)=(f,φk)k=0,1,,m

    矩阵表示:
    [ ( φ 0 , φ 0 ) ( φ 0 , φ 1 ) ⋯ ( φ 0 , φ m ) ( φ 1 , φ 0 ) ( φ 1 , φ 1 ) ⋯ ( φ 1 , φ m ) ⋮ ⋮ ⋱ ⋮ ( φ m , φ 0 ) ( φ m , φ 1 ) ⋯ ( φ m , φ m ) ] [ a 0 a 1 ⋮ a m ] = [ ( f , φ 0 ) ( f , φ 1 ) ⋮ ( f , φ m ) ] \begin{bmatrix} (\varphi_0, \varphi_0) & (\varphi_0, \varphi_1) & \cdots &(\varphi_0, \varphi_m) \\ (\varphi_1, \varphi_0) & (\varphi_1, \varphi_1) & \cdots &(\varphi_1, \varphi_m) \\ \vdots & \vdots & \ddots & \vdots\\ (\varphi_m, \varphi_0) &(\varphi_m, \varphi_1) & \cdots &(\varphi_m, \varphi_m) \end{bmatrix} \begin{bmatrix} a_0\\ a_1\\ \vdots\\ a_m \end{bmatrix}= \begin{bmatrix} (f,\varphi_0)\\ (f,\varphi_1) \\ \vdots \\ (f,\varphi_m) \end{bmatrix} (φ0,φ0)(φ1,φ0)(φm,φ0)(φ0,φ1)(φ1,φ1)(φm,φ1)(φ0,φm)(φ1,φm)(φm,φm)a0a1am=(f,φ0)(f,φ1)(f,φm)

    因为在正交函数系中,相同函数的卷积大于零,不同函数卷积等于零。证明过程请移步至《傅立叶级数与变换》。所以有
    [ ( φ 0 , φ 0 ) ( φ 1 , φ 1 ) ⋱ ( φ m , φ m ) ] [ a 0 a 1 ⋮ a m ] = [ ( f , φ 0 ) ( f , φ 1 ) ⋮ ( f , φ m ) ] \begin{bmatrix} (\varphi_0, \varphi_0) & & \\ & (\varphi_1, \varphi_1) & \\ & & \ddots &\\ & & &(\varphi_m, \varphi_m) \end{bmatrix} \begin{bmatrix} a_0\\ a_1\\ \vdots\\ a_m \end{bmatrix}= \begin{bmatrix} (f,\varphi_0)\\ (f,\varphi_1) \\ \vdots \\ (f,\varphi_m) \end{bmatrix} (φ0,φ0)(φ1,φ1)(φm,φm)a0a1am=(f,φ0)(f,φ1)(f,φm)

    那么能得到正交多项式的系数(参数)
    a 0 = ( f , φ 0 ) ( φ 0 , φ 0 ) = ∑ i = 1 n y i φ 0 ( x i ) ∑ i = 1 n φ 0 2 ( x i ) a_0 = \frac{ (f,\varphi_0)}{(\varphi_0, \varphi_0)} = \frac{\sum_{i=1}^n y_i \varphi_0(x_i)}{\sum_{i=1}^n \varphi_0^2(x_i)} a0=(φ0,φ0)(f,φ0)=i=1nφ02(xi)i=1nyiφ0(xi)
    a 1 = ( f , φ 1 ) ( φ 1 , φ 1 ) = ∑ i = 1 n y i φ 1 ( x i ) ∑ i = 1 n φ 1 2 ( x i ) a_1 = \frac{ (f,\varphi_1)}{(\varphi_1, \varphi_1)} = \frac{\sum_{i=1}^n y_i \varphi_1(x_i)}{\sum_{i=1}^n \varphi_1^2(x_i)} a1=(φ1,φ1)(f,φ1)=i=1nφ12(xi)i=1nyiφ1(xi)
    a m = ( f , φ m ) ( φ m , φ m ) = ∑ i = 1 n y i φ m ( x i ) ∑ i = 1 n φ m 2 ( x i ) a_m = \frac{ (f,\varphi_m)}{(\varphi_m, \varphi_m)} = \frac{\sum_{i=1}^n y_i \varphi_m(x_i)}{\sum_{i=1}^n \varphi_m^2(x_i)} am=(φm,φm)(f,φm)=i=1nφm2(xi)i=1nyiφm(xi)

    a k = ( f , φ k ) ( φ k , φ k ) = ∑ i = 1 n y i φ k ( x i ) ∑ i = 1 n φ k 2 ( x i ) a_k = \frac{ (f,\varphi_k)}{(\varphi_k, \varphi_k)} = \frac{\sum_{i=1}^n y_i \varphi_k(x_i)}{\sum_{i=1}^n \varphi_k^2(x_i)} ak=(φk,φk)(f,φk)=i=1nφk2(xi)i=1nyiφk(xi)


    还有一个问题没解决,就是函数系的正交性,许多教材使用三项递推公式构造,这里也是仅介绍这种构造方式,别问是怎么构造的,问就是施密特正交化。
    { φ 0 ( x ) = 1 φ 1 ( x ) = ( x − A 1 ) φ 0 ( x ) ⋮ φ k + 1 ( x ) = ( x − A k + 1 ) φ k ( x ) − B k φ k − 1 ( x ) \left\{\begin{array}{l} \varphi_0(x) = 1 \\ \varphi_1(x) = (x-A_1)\varphi_0(x) \\ \vdots\\ \varphi_{k+1}(x) = (x -A_{k+1})\varphi_k(x) - B_k \varphi_{k-1}(x) \end{array}\right. φ0(x)=1φ1(x)=(xA1)φ0(x)φk+1(x)=(xAk+1)φk(x)Bkφk1(x)

    其中, A k + 1 = ∑ i = 1 n x i φ k 2 ( x i ) ∑ i = 1 n φ k 2 ( x i ) = ( x φ k ( x ) , φ k ( x ) ) ( φ k ( x ) , φ k ( x ) ) k = 1 , 2 , ⋯   , m − 1 A_{k+1} = \frac{\sum_{i=1}^n x_i \varphi_k^2(x_i)}{\sum_{i=1}^n \varphi_k^2(x_i)}=\frac{(x \varphi_k(x),\varphi_k(x))}{(\varphi_k(x),\varphi_k(x))} \quad k=1,2,\cdots,m-1 Ak+1=i=1nφk2(xi)i=1nxiφk2(xi)=(φk(x),φk(x))(xφk(x),φk(x))k=1,2,,m1
    B k = ∑ i = 1 n φ k 2 ( x i ) ∑ i = 1 n φ k − 1 2 ( x i ) = ( φ k ( x ) , φ k ( x ) ) ( φ k − 1 ( x ) , φ k − 1 ( x ) ) k = 1 , 2 , ⋯   , m − 1 B_{k} = \frac{\sum_{i=1}^n \varphi_k^2(x_i)}{\sum_{i=1}^n \varphi_{k-1}^2(x_i)}=\frac{( \varphi_k(x),\varphi_k(x))}{(\varphi_{k-1}(x),\varphi_{k-1}(x) )} \quad k=1,2,\cdots,m-1 Bk=i=1nφk12(xi)i=1nφk2(xi)=(φk1(x),φk1(x))(φk(x),φk(x))k=1,2,,m1


    验证构造的函数系(多项式)的 正交性

    φ 0 \varphi_0 φ0 φ 1 \varphi_1 φ1 求积分:
    ∑ φ 0 φ 1 = ∑ i ( x i − A 1 ) φ 0 = ∑ i ( x i − ( x i φ 0 , φ 0 ) ( φ 0 , φ 0 ) ) φ 0 = ∑ i ( x i − x i ( φ 0 , φ 0 ) ( φ 0 , φ 0 ) ) φ 0 = 0 \begin{aligned}\sum \varphi_0 \varphi_1 &= \sum_i (x_i-A_1) \varphi_0 \\ & = \sum_i (x_i-\frac{(x_i \varphi_0,\varphi_0)}{(\varphi_0,\varphi_0)}) \varphi_0 \\ & = \sum_i (x_i-x_i\frac{( \varphi_0,\varphi_0)}{(\varphi_0,\varphi_0)}) \varphi_0 \\ & = 0 \end{aligned} φ0φ1=i(xiA1)φ0=i(xi(φ0,φ0)(xiφ0,φ0))φ0=i(xixi(φ0,φ0)(φ0,φ0))φ0=0

    φ 0 \varphi_0 φ0 φ 1 \varphi_1 φ1 积分为零,所以它们是正交的。

    φ 1 \varphi_1 φ1 φ k + 1 \varphi_{k+1} φk+1 求积分:
    ∑ φ 1 φ k + 1 = ∑ i ( ( x i − A k + 1 ) φ k ⋅ φ 1 − B k φ k − 1 ⋅ φ 1 ) = ∑ i ( ( x i − ( x i φ k , φ k ) ( φ k , φ k ) ) φ k ⋅ φ 1 − ( φ k , φ k ) ( φ k − 1 , φ k − 1 ) φ k − 1 φ 1 ) = ∑ i ( 0 − ( φ k , φ k ) ( φ k − 1 , φ k − 1 ) φ k − 1 φ 1 ) = ( φ k , φ k ) ( φ k − 1 , φ k − 1 ) ∑ i φ k − 1 φ 1 \begin{aligned}\sum \varphi_1 \varphi_{k+1} &= \sum_i( (x_i-A_{k+1}) \varphi_k \cdot\varphi_1 - B_k \varphi_{k-1} \cdot\varphi_1) \\ & = \sum_i ((x_i-\frac{(x_i \varphi_k,\varphi_k)}{(\varphi_k,\varphi_k)}) \varphi_k \cdot\varphi_1 - \frac{( \varphi_k,\varphi_k)}{(\varphi_{k-1},\varphi_{k-1} )} \varphi_{k-1} \varphi_1)\\ & = \sum_i (0-\frac{( \varphi_k,\varphi_k)}{(\varphi_{k-1},\varphi_{k-1} )} \varphi_{k-1} \varphi_1)\\ & = \frac{( \varphi_k,\varphi_k)}{(\varphi_{k-1},\varphi_{k-1} )}\sum_i \varphi_{k-1} \varphi_1 \end{aligned} φ1φk+1=i((xiAk+1)φkφ1Bkφk1φ1)=i((xi(φk,φk)(xiφk,φk))φkφ1(φk1,φk1)(φk,φk)φk1φ1)=i(0(φk1,φk1)(φk,φk)φk1φ1)=(φk1,φk1)(φk,φk)iφk1φ1

    可以看出, ∑ φ 1 φ k + 1 ⟶ ∑ φ 1 φ k − 1 ⟶ ⋯ ∑ φ 1 φ 0 = 0 \sum \varphi_1 \varphi_{k+1} \longrightarrow \sum \varphi_1\varphi_{k-1} \longrightarrow \cdots \sum \varphi_1 \varphi_0=0 φ1φk+1φ1φk1φ1φ0=0

    因此 ∑ φ 1 φ k + 1 = 0 \sum \varphi_1 \varphi_{k+1}=0 φ1φk+1=0, 即 φ 1 \varphi_1 φ1 φ k + 1 \varphi_{k+1} φk+1正交。


    参考资料

    1. 最小二乘曲线拟合
    2. 河南理工大学 正交多项式
    3. 正交多项式与最小二乘拟合
    展开全文
  • 曲线拟合——最小二乘拟合(附代码)

    万次阅读 多人点赞 2020-04-17 21:28:00
    曲线拟合——最小二乘拟合1 曲线拟合——一元函数的最小二乘拟合1.1 线性回归(直线的最小二乘拟合)1.1.2 直线的最佳拟合方法1.1.2 如何计算1.1.2 误差量化分析1.2 多项式回归(多项式的最小二乘拟合)1.3 非线性...

    曲线拟合

    先介绍一下拟合和插值的区别。插值,插值曲线必须经过所给定的插值点;拟合,拟合曲线不一定必须经过所给定的点。
    (很多书里面对拟合、插值和逼近定义时讲,拟合包含:插值和逼近。这种说法对不对这里不做辩论,我只讲拟合和插值的方法与实现。)

    拟合又包括一元函数和多元函数的拟合,通俗的讲,就是对一个变量(一维)和多个变量(多维)拟合的区别。对一个变量拟合叫曲线拟合,对两个变量的拟合可以称为曲面拟合。

    本文主要讲一元函数的拟合(曲线拟合),包括直线的最小二乘拟合和多项式的最小二乘拟合;和多元函数的线性最小二乘拟合,对于非线性拟合会简单提及。

    ps:关于非线性拟合,由于方法不太一样,会在另一篇文章中非线性回归——非线性函数最小二乘拟合讲到;关于函数插值,后续也会有更新。

    1 一元函数的最小二乘拟合

    1.1 线性回归(直线的最小二乘拟合)

    1.1.1 直线的最佳拟合方法

    根据一组二维坐标点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) … ( x n , y n ) (x_1, y_1), (x_2, y_2), (x_3, y_3)…(x_n, y_n) (x1,y1),(x2,y2),(x3,y3)(xn,yn),将其进行拟合成一条直线。直线的数学表达式为:
    y = a 0 + a 1 x y = a_0+a_1x y=a0+a1x
    其中, a 0 a_0 a0 a 1 a_1 a1为系数,分别表示截距和斜率。

    给定若干个点坐标,可以有很多种拟合成直线的方式,哪一种拟合效果最好呢?
    如下图所示,给定7个点,随意给出了几种拟合直线,如黑色、蓝色、紫色三条直线,哪一条效果最理想?如何衡量拟合结果好坏呢?
    在这里插入图片描述

    这里我们给出一个定义:误差(或残差)。
    误差(或残差),就是y的真实值与由线性方程预测的近似值 a 0 + a 1 x a_0+a_1x a0+a1x之差。用 e e e表示,可得: e = y − a 0 − a 1 x e=y-a_0-a_1x e=ya0a1x

    “最佳”拟合准则:通过数据点拟合一条“最佳”直线,使所有数据点的残差的平方和最小。

    之所以选用残差的平方和最小,是因为:如果选残差的和最小,或者残差的绝对值之和最小,都会导致拟合效果不好,且结果不唯一。具体如下:

    1. 如果选残差的和最小:如图(a)所示,它描述的是对两个点的直线拟合结果。显然,最佳拟合的结果就是连接这两个点的直线。然而,任何通过连线中点的直线(除了正好与连线垂直的直线外)都能使式(17.2)的结果为0,因为这样的直线与两个点的误差刚好大小相等但符号相反,所以刚好抵销了。
      在这里插入图片描述
    2. 如果残差的绝对值之和最小:图(b)说明了为什么这个准则还是不充分的。对于图中的四个点,位于两条虚线之间的任何直线,都会使上式中的绝对值之和最小。因此,使用这个准则也不能得到唯一的最优拟合直线。
      在这里插入图片描述
      啰嗦了这么多,最后我们终于选定了将残差的平方和最小作为“最佳”拟合准则。
      也就是使Sr的值最小:
      在这里插入图片描述

    1.1.2 如何计算

    那么怎么计算直线的系数 a 0 a_0 a0 a 1 a_1 a1,才能保证直线最优呢。
    方法如下:
    在这里插入图片描述
    令这些偏导数等于0,就可以得到残差平方和Sr的一个最小值。令这些偏导数等于0后,上面的方程
    变为:
    在这里插入图片描述
    在这里插入图片描述
    联立解方程组可得:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.1.3 误差量化分析

    残差的平方和Sr为:
    在这里插入图片描述
    引入回归直线的“标准差”的概念和计算公式:
    在这里插入图片描述
    此外,还有“相关系数”也用来衡量直线拟合好坏(感兴趣可以查阅相关资料了解),如下:
    在这里插入图片描述
    其中, S t S_t St表示因变量(在本例中为 y i y_i yi)的均值的误差平方和,即 S t = ∑ i = 1 n ( y i − y ˉ ) 2 S_t = \sum_{i=1}^{n} {(y_i-\bar{y})^2} St=i=1n(yiyˉ)2 y ˉ \bar{y} yˉ y i y_i yi的平均值。

    本文在最后附录里面给出了一元线性回归的伪代码及C++实现,可供参考。

    1.2 多项式回归(多项式的最小二乘拟合)

    1.2.1 推导过程和计算方法

    最小二乘过程很容易推广到用史高阶多项式拟合数据的情况。例如,假设要拟合一个二次多项式:
    y = a 0 + a 1 x + a 2 x 2 y = a_0+a_1x+a_2x^2 y=a0+a1x+a2x2
    残差平方和Sr计算为:
    S r = ∑ i = 1 n ( y i − a 0 − a 1 x − a 2 x 2 ) 2 S_r = \sum_{i=1}^{n} {(y_i-a_0-a_1x-a_2x^2)^2} Sr=i=1n(yia0a1xa2x2)2

    对该式关于多项式的每个未知系数取导数,得到:
    在这里插入图片描述
    令导数为0,整理后得到:
    在这里插入图片描述
    方程组3个方程是线性的,有3个未知数: a 0 a_0 a0, a 1 a_1 a1 a 2 a_2 a2,可以通过解方程组得到 a 0 a_0 a0, a 1 a_1 a1 a 2 a_2 a2的值。

    二次多项式的情况很容易推广到m次多项式的情况:
    y = a 0 + a 1 x + a 2 x 2 + … + a m x m y = a_0+a_1x+a_2x^2+…+a_mx^m y=a0+a1x+a2x2++amxm
    残差平方和Sr计算为:
    S r = ∑ i = 1 n ( y i − a 0 − a 1 x − a 2 x 2 − … − a m x m ) 2 S_r = \sum_{i=1}^{n} {(y_i-a_0-a_1x-a_2x^2-…-a_mx^m)^2} Sr=i=1n(yia0a1xa2x2amxm)2
    同样求偏导令其为0,可以得到m+1个线性方程的方程组,联立解线性方程组可以得到系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, … , a m a_m am的值。

    1.2.2 误差量化分析

    同样,标准差的计算公式为:
    在这里插入图片描述
    “相关系数”计算公式如下:
    在这里插入图片描述
    其中, S t S_t St表示因变量(在本例中为 y i y_i yi)的均值的误差平方和,即 S t = ∑ i = 1 n ( y i − y ˉ ) 2 S_t = \sum_{i=1}^{n} {(y_i-\bar{y})^2} St=i=1n(yiyˉ)2 y ˉ \bar{y} yˉ y i y_i yi的平均值。

    本文在最后附录里面给出了一元多项式回归的伪代码,可供参考。

    2 多元函数的最小二乘拟合

    2.1 多元线性回归

    2.1.1 推导过程和计算方法

    对于两个或多个自变量的情况,就是一个自变量的推广。对于两个自变量(二维)的情况,回归“直线”就变成了回归“平面”,如下图所示:
    在这里插入图片描述
    对于两个自变量的情况,设方程为:
    y = a 0 + a 1 x 1 + a 2 x 2 y = a_0+a_1x_1+a_2x_2 y=a0+a1x1+a2x2

    同样的,残差平方和Sr计算为:
    S r = ∑ i = 1 n ( y i − a 0 − a 1 x 1 − a 2 x 2 ) 2 S_r = \sum_{i=1}^{n} {(y_i-a_0-a_1x_1-a_2x_2)^2} Sr=i=1n(yia0a1x1a2x2)2

    在这里插入图片描述
    令这些偏微分的值等于零,并采用矩阵形式表示,可得:
    在这里插入图片描述
    解该线性方程组可以得到系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2的值。

    同样的,前面的二维情况很容易扩展到m维,即:
    y = a 0 + a 1 x 1 + a 2 x 2 + … + a m x m y = a_0+a_1x_1+a_2x_2+…+a_mx_m y=a0+a1x1+a2x2++amxm
    也是同样的求偏微分,令其为0,解线性方程组,从而得到系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, … , a m a_m am的值。

    2.1.2 误差量化分析

    多元函数线性回归的标准差的计算公式,于一元函数多显示回归的一模一样;相关系数计算公式也一样。

    标准差的计算公式:
    在这里插入图片描述
    “相关系数”计算公式:
    在这里插入图片描述
    其中, S t S_t St表示因变量(在本例中为 y i y_i yi)的均值的误差平方和,即 S t = ∑ i = 1 n ( y i − y ˉ ) 2 S_t = \sum_{i=1}^{n} {(y_i-\bar{y})^2} St=i=1n(yiyˉ)2 y ˉ \bar{y} yˉ y i y_i yi的平均值。

    2.2 多元多项式回归?

    很多人想着,既然有一元线性回归,有一元多项式回归,有多元线性回归,那是不是应该也有多元多项式回归

    答案却是,不存在的。或者说,大多数书里面是没有的。

    细细思考一下,就知道,多元多项式回归?其实没那么简单:
    如果说,
    一元线性回归,有一个变量 x x x,两个系数 a 0 a_0 a0, a 1 a_1 a1
    一元多项式回归,有一个变量 x x x,m+1个系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, … , a m a_m am
    多元线性回归,有m个变量 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, … , x m x_m xm,m+1个系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, … , a m + 1 a_{m+1} am+1
    那么,对于多元线性回归,如果m个变量相互独立(就是不存在 x i p x j q {x_i}^p{x_j}^q xipxjq这种形式),那么对于m个变量的n次多项式,也会存在m*n+1个系数,解方程组计算量庞大;而如果m个变量不相互独立,那就更。。。复杂了。

    3 线性回归小结

    线性最小二乘的一般矩阵形式

    前面介绍了三种类型的回归方法:简单线性回归、多项式回归和多元线性回归。

    事实上,这三种回归方法都属于一般形式的线性最小了二乘模型:
    y = a 0 + a 1 z 1 + a 2 z 2 + … + a m z m y = a_0+a_1z_1+a_2z_2+…+a_mz_m y=a0+a1z1+a2z2++amzm
    其中, z 1 , z 2 , … , z m z_1, z_2, …,z_m z1,z2,,zm为m个基函数(basis function) 。

    很容易看出,简单线性回归和多元线性回归归为这个模型;如果基函数是简单的单项式,即: z 1 = x 1 , z 2 = x 2 , … , z m = x m z_1=x^1, z_2=x^2, …,z_m=x^m z1=x1,z2=x2,,zm=xm,那么多项式回归也可以归为该类模型。

    若将给定的n个点坐标代入 y = a 0 + a 1 z 1 + a 2 z 2 + … + a m z m y = a_0+a_1z_1+a_2z_2+…+a_mz_m y=a0+a1z1+a2z2++amzm,可得到n个线性方程组,表示为矩阵的形式:
    Y = [ Z ] A {Y}=[Z]{A} Y=[Z]A
    在这里插入图片描述
    其中,m是模型中变量的个数,n是数据点的个数。
    在这里插入图片描述
    因为大多数情况下,n>m+1,所以[Z]不是一个方阵。因此,这个方程组属于过约束,不能直接求解。要计算相对条件下的最优解,就是使残差平方和最小的解。

    而模型的残差平方和可以定义如下:
    在这里插入图片描述
    同样的,为了使Sr达到最小,需要对关于该式的每个系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, … , a m + 1 a_{m+1} am+1取偏导数,并令得到的每个方程等于0。于是可以表示成如下简洁的矩阵形式:
    在这里插入图片描述
    然后求解该方程组,即可得到系数 a 0 a_0 a0, a 1 a_1 a1, a 2 a_2 a2, … , a m + 1 a_{m+1} am+1的值。
    (感兴趣的可以用前面介绍的简单线性回归、多项式回归及多元线性的函数来验证。)

    4* 非线性回归

    4.1 非线性关系的线性化

    非线性模型中有3种类型可以线性化:指数方程,幂方程,饱和增长率方程。分别如下:
    1.指数方程:
    y = a 1 e a 2 x y = a_1e^{a_2x} y=a1ea2x
    2.幂方程:
    y = a 1 x a 2 y = a_1x^{a_2} y=a1xa2
    2.饱和增长率方程:
    y = a 1 x x + a 2 y = a_1\frac{x}{x+a_2} y=a1x+a2x

    对上述3种形式,可取自然对数将其线性化,结果如下:
    指数方程取自然对数: l n y = l n a 1 + a 2 x lny = lna_1+a_2x lny=lna1