美文网首页程序员的日常
【基础不牢,地动山摇】最小二乘法

【基础不牢,地动山摇】最小二乘法

作者: 鱼香土豆丝 | 来源:发表于2019-07-17 08:32 被阅读0次

    什么是最小二乘法?

    第一次听到最小二乘法是在读书期间,主要是用来应付期末考试。深入了解它是在拟合曲线的过程中,有的论文对最小二乘法进行改进,增加了很多的正则项,以提高拟合度。

    总的来说,最小二乘法就是最一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。实现函数的拟合。比如下图:

    在这里插入图片描述
    可以通过最小二乘法计算出函数的系数,得到a,b实现函数对这些点的误差最小。

    简单的理解最小二乘法

    我觉得他就是个拟合,实在不知道如何简单的讲给别人听,不过有一篇博客,讲的是够透彻。
    地址是:[url](https://blog.csdn.net/ccnt_2012/article/details/81127117)

    如何使用最小二乘法?

    做工程,最重要的是能够利用各种工具。如何使用最小二乘法?我们假设要拟合的函数是:
    y=sin2{\pi}x
    首先定义出函数:

    # 目标函数
    def real_func(x):
        return np.sin(2*np.pi*x)
    
    # 多项式
    def fit_func(p, x):
        f = np.poly1d(p)
        return f(x)
    
    # 残差
    def residuals_func(p, x, y):
        ret = fit_func(p, x) - y
        return ret
    

    简单的生成数据,并加点噪音

    # 十个点
    x = np.linspace(0, 1, 10)
    x_points = np.linspace(0, 1, 1000)
    # 加上正态分布噪音的目标函数的值
    y_ = real_func(x)
    y = [np.random.normal(0, 0.1) + y1 for y1 in y_]
    

    最小二乘法拟合,并把多项式的参数暴露出来。

    def fitting(M=0):
        """
        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()
        return p_lsq
    

    结果展示:

    • 二次函数


      在这里插入图片描述
    • 三次函数


      在这里插入图片描述
    • 八次函数


      在这里插入图片描述

    结论

    通过图片可以看出来,多项式的次数越高,拟合的越好,但是也太高的话也会出现过拟合现象。比如说最后一图,都在噪点上。

    相关文章

      网友评论

        本文标题:【基础不牢,地动山摇】最小二乘法

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