精华内容
下载资源
问答
  • 最小二乘法拟合曲线

    2014-09-15 02:09:06
    数值分析实验报告, 最小二乘法拟合曲线c语言代码
  • 最小二乘法拟合曲线(也叫最佳平方逼近),拟合次数可选,最多到20次,不必懂原理,拷贝到项目中直接用,纯C代码+注解
  • 最小二乘法拟合曲线matlab实现 拟合 最小二乘法 matlab 示例
  • 使用最小二乘法拟合曲线并对过拟合进行正则化处理 引言 高斯于1823年在误差????1,…,????????独立同分布的假定下,证明了最小二乘法的一个最优性质:在所有无偏的线性估计类中,最小二乘方法是其中方差最小的! 对于...

    使用最小二乘法拟合曲线并对过拟合进行正则化处理


    引言

    高斯于1823年在误差𝑒1,…,𝑒𝑛独立同分布的假定下,证明了最小二乘法的一个最优性质:在所有无偏的线性估计类中,最小二乘方法是其中方差最小的!

    对于数据(𝑥𝑖,𝑦𝑖)(𝑖=1,2,3…,𝑚),拟合出函数ℎ(𝑥)有误差,即残差:𝑟𝑖=ℎ(𝑥𝑖)−𝑦𝑖,此时𝐿2范数(残差平方和)最小时,ℎ(𝑥)和 𝑦相似度最高,说明两者最具有拟合性。

    一般的𝐻(𝑥)为𝑛次的多项式,
    H(x)=w0+w1x+w2x2++wnxn H(x)=w_0+w_1 x+w_2 x^2+⋯+w_n x^n

    (w0+w1x+w2x2++wnxn) (w_0+w_1 x+w_2 x^2+⋯+w_n x^n)为参数

    最小二乘法就是要找到一组

    实例

    我们用目标函数𝑦=𝑠𝑖𝑛2𝜋𝑥,加上一个正态分布的噪音干扰,用多项式去拟合

    import numpy as np
    import scipy as sp
    from scipy.optimize import leastsq
    import matplotlib.pyplot as plt
    
    # 1.目标函数,进行拟合的数据点都分布在这条正弦曲线附近
    def real_func(x):
        return np.sin(2*np.pi*x)
    
    # 2.多项式  numpy.poly1d([1,2,3]) 生成1𝑥^2+2𝑥^1+3𝑥^0,p为多项式的参数,x为下面linspace(0, 1, 10)取得的点
    def fit_func(p, x):
        f = np.poly1d(p)
        return f(x)
    
    # 3.残差 误差函数,所谓误差就是指我们拟合的曲线的值对应真实值的差
    def residuals_func(p, x, y):
        ret = fit_func(p, x) - y
        return ret
    
    # 4.十个点
    x = np.linspace(0, 1, 10) #linspace均分计算指令,用于产生x1,x2之间的N点行线性的矢量 0到10以1为步长或者可以表达为(0,10,10):0到10输出10个值
    x_points = np.linspace(0, 1, 1000)
    # 加上正态分布噪音的目标函数的值
    y_ = real_func(x)
    y = [np.random.normal(0, 0.1) + y1 for y1 in y_]
    
    # 5.关于拟合的曲线的函数
    def fitting(M=0):
        # M为多项式的次数,随机初始化多项式参数,生成M+1个随机数的列表,这样poyld函数返回的多项式次数就是M
        p_init = np.random.rand(M + 1)
        # 最小二乘法,三个参数:误差函数、函数参数列表,数据点
        p_lsq = leastsq(residuals_func, p_init, args=(x, y))
        print('Fitting Parameters:', p_lsq[0])
    
        # 可视化
        plt.plot(x_points, real_func(x_points), label='real')
        plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
        plt.plot(x, y, 'bo', label='noise')
        plt.legend() #图例
        plt.show()
        return p_lsq
    

    下面分别为选取多项式次数M不同时的运行结果:

    p_lsq_0= fitting(M=0)
    

    p_lsq_0= fitting(M=1)
    

    p_lsq_0= fitting(M=3)
    

    p_lsq_0= fitting(M=9)
    

    由上图运行结果可以发现:

    M=0,多项式曲线是一个常数,数据拟合效果很差

    M=1,多项式曲线是一条直线,数据拟合效果也很差

    M=9,多项式曲线通过每个数据点,训练误差为0(“通过每个数据点”,在这里的数据点指的是真正曲线加了噪声的数据点)。对给定训练数据拟合的角度来说,效果是最好的,但是,因为训练数据本身存在噪声,这种拟合曲线对未知数据的预测能力往往并不是最好的,在实际学习中并不可取

    M=3,多项式曲线对数据拟合效果足够好,模型也比较简单,是一个较好的选择

    M=9进行数据拟合时出现的这种现象叫做过拟合,引入正则化项(regularizer),降低过拟合

    回归问题中,损失函数是平方损失,正则化可以是参数向量的L2范数,也可以是L1范数:

    • L1:regularization×abs(p)
    • L2:0.5×regularization×np.square(p)

    对上述多项式M=9的过拟合现象进行正则化处理,代码如下:

    #结果显示过拟合, 引入正则化项(regularizer),降低过拟合
    regularization = 0.0001
    
    def residuals_func_regularization(p, x, y):
        ret = fit_func(p, x) - y   #残差
        ret = np.append(ret,
                        np.sqrt(0.5 * regularization * np.square(p)))  # L2范数作为正则化项
        return ret
    
    # 最小二乘法,加正则化项
    p_init = np.random.rand(9 + 1)
    p_lsq_regularization = leastsq(
        residuals_func_regularization, p_init, args=(x, y))
    
    plt.plot(x_points, real_func(x_points), label='real')
    plt.plot(x_points, fit_func(p_lsq_9[0], x_points), label='fitted curve')
    plt.plot(
        x_points,
        fit_func(p_lsq_regularization[0], x_points),
        label='regularization')
    plt.plot(x, y, 'bo', label='noise')
    plt.legend()
    plt.show()
    

    运行结果图如下所示:

    展开全文
  • 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。 利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
  • 用C#最小二乘法拟合任意次曲线,解线性方程组,三元一次方程组,高斯方程解方程参数等,代码中有注释,详细步骤介绍,且未引用第三方库,纯手敲代码,下载后可用VS直接运行
  • windows下,安装Python2.7.1,使用PyQT库实现最小二乘法曲线拟合,并绘制拟合曲线
  • 本程序采用stm32为主控,可实现adc的采集及滤波,oled显示,通过最小二乘法将数据拟合成曲线,并可通过解方程组的方式求解点。
  • 假设 y = f(x),那么每个x应该会对应一个y。对一个未知公式的 f(x)系统,在科学实验中,常常需要测量两个变量的多组数据,然后找出他们的近似函数关系。...最小二乘法常用于曲线拟合。下面,我们通过一个例子来...

    假设 y = f(x),那么每个x应该会对应一个y。对一个未知公式的 f(x)系统,在科学实验中,常常需要测量两个变量的多组数据,然后找出他们的近似函数关系。通常,我们把这种处理数据的方法称之为经验配线,所找到的函数关系称为经验公式。最小二乘法就是最常用的一种配线方式。

    最小二乘法是一种数学优化技术,它通过最小误差的平方和找到一组数据的最佳函数匹配。最小二乘法常用于曲线拟合。

    下面,我们通过一个例子来研究最小二乘法函数polyfit的使用。

    首先,我们通过数据采集,得到一组y和x数据的对应关系并绘制成曲线。

    x = [88    88    96    98    99   101   101   102   102   104   105   106   107   109   111   113   113   113   116   119   121   121   126   128   128   132   134   140   140   141   141  145   147   148  150   153   154   154   154   155   158   160   161   165   166   168   172   174];
    
    y = [2.5882       2.7059       2.8729       2.8834       2.9814       3.0909       3.1638       3.2353       3.3929       3.5404       3.6158       3.7569       3.8235        3.865   3.8824       3.9286       3.9394       4.1765       4.2353       4.3558       4.5856       4.6061       4.6584       4.7059       4.7826       4.8066       4.8214       4.8824   4.9697       5.0847        5.092        5.092       5.1381       5.1553       5.1786       5.2381       5.2727       5.4118       5.4237       5.5882       5.5932       5.8564   5.9627        6.135       6.4972       6.6071       6.6471       6.8485];
    
    plot(x,y,'o');

    2f0e6c2fe2125fc5d25d8f9bbbe70564.png
    原始采样数据

    通过polyfit进行一阶拟合

    x = [88    88    96    98    99   101   101   102   102   104   105   106   107   109   111   113   113   113   116   119   121   121   126   128   128   132   134   140   140   141   141  145   147   148  150   153   154   154   154   155   158   160   161   165   166   168   172   174];
    
    y = [2.5882       2.7059       2.8729       2.8834       2.9814       3.0909       3.1638       3.2353       3.3929       3.5404       3.6158       3.7569       3.8235        3.865   3.8824       3.9286       3.9394       4.1765       4.2353       4.3558       4.5856       4.6061       4.6584       4.7059       4.7826       4.8066       4.8214       4.8824   4.9697       5.0847        5.092        5.092       5.1381       5.1553       5.1786       5.2381       5.2727       5.4118       5.4237       5.5882       5.5932       5.8564   5.9627        6.135       6.4972       6.6071       6.6471       6.8485];
    
    %一阶拟合
    coefficient=polyfit(x,y,1);
    
    %将拟合后系数带入公式 Y = P(1)*X^N + P(2)*X^(N-1) + ... + P(N)*X + P(N+1)
    yn=polyval(coefficient,x);
    
    plot(x,y,'o');hold on;
    plot(x,yn,'-k');hold on;
    legend(sprintf("x-y"),sprintf("yn = (%f)x + (%f)",coefficient(1,1),coefficient(1,2)));

    d0be262be6593537acd8411d04ddcfd0.png
    1阶拟合的曲线效果

    通过polyfit进行二阶拟合

    x = [88    88    96    98    99   101   101   102   102   104   105   106   107   109   111   113   113   113   116   119   121   121   126   128   128   132   134   140   140   141   141  145   147   148  150   153   154   154   154   155   158   160   161   165   166   168   172   174];
    
    y = [2.5882       2.7059       2.8729       2.8834       2.9814       3.0909       3.1638       3.2353       3.3929       3.5404       3.6158       3.7569       3.8235        3.865   3.8824       3.9286       3.9394       4.1765       4.2353       4.3558       4.5856       4.6061       4.6584       4.7059       4.7826       4.8066       4.8214       4.8824   4.9697       5.0847        5.092        5.092       5.1381       5.1553       5.1786       5.2381       5.2727       5.4118       5.4237       5.5882       5.5932       5.8564   5.9627        6.135       6.4972       6.6071       6.6471       6.8485];
    
    %二阶拟合
    coefficient=polyfit(x,y,2);
    
    %将拟合后系数带入公式 Y = P(1)*X^N + P(2)*X^(N-1) + ... + P(N)*X + P(N+1)
    yn=polyval(coefficient,x);
    
    plot(x,y,'o');hold on;
    plot(x,yn,'-k');hold on;
    legend(sprintf("x-y"),sprintf("yn = (%f)x² + (%f)x + (%f)",coefficient(1,1),coefficient(1,2),coefficient(1,3)));

    7746e98dd98eda228955c93bf236a7c6.png

    同理,可得到更多阶拟合的效果

    a16aa830f437aaa90b1831a0ead9d31e.png
    3阶拟合

    479ecfb8b2c2b57641a30c5de81d5b12.png
    6阶拟合

    由此可见,在系统允许的条件下,阶数越多,拟合出来的曲线越逼近真实的测量曲线。这个工作要是放在人工设计里实现,将会是一个非常繁琐的事情,最小二乘法恰恰非常适合解决这类曲线拟合的工作。

    展开全文
  • 用VB实现数据拟合,主要使用最小二乘方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,483
精华内容 593
关键字:

最小二乘法拟合曲线