• 数学建模之多项式回归



    前言

    对于多项式回归方法来说,若你的数据点不适合线性回归(就是直线大部分不穿过数据点),那么使用该方法就比较合适。
    并且多项式回归像线性回归一样,都是用变量 x 和 y 之间的关系来找到绘制数据点线最好的方法。


    一、多项式回归的原理

    Python 中有一些方法可以找到数据点之间的关系并画出多项式回归线。
    例如:研究乙醇转化率与温度的关系

    # 建立一元一次方程y = ax + b
    import numpy as np
    import matplotlib.pyplot as plt
    
    # A1组温度与乙醇转换率的关系图-散点图
    x=np.array([250,275,300,325,350]).reshape((-1, 1))
    y=np.array([2.07,5.85,14.97,19.68,36.80])
    
    plt.scatter(x, y) # 绘制散点图
    plt.title('A1')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果如下:
    在这里插入图片描述

    很明显如果用线性回归的,所有的数据点不能落在同一条直线上

    用多项式回归方法来做:

    # 多项式拟合
    import numpy
    import matplotlib.pyplot as plt
    
    x=[250,275,300,325,350]
    y=[2.07,5.85,14.97,19.68,36.80]
    
    mymodel = numpy.poly1d(numpy.polyfit(x, y, 4)) # 四阶
    
    myline = numpy.linspace(250, 350, 100) # 从位置250开始,到位置350结束
    
    plt.scatter(x, y) # 散点图
    plt.plot(myline, mymodel(myline), label='A1') # 多项式回归
    plt.legend() # 设置图例
    plt.show() # 显示
    print('A1组中温度与乙醇转换率的关系中阶数的系数:', numpy.polyfit(x, y, 4))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果如下:

    A1组中温度与乙醇转换率的关系中阶数的系数: [ 2.83413333e-06 -3.36325333e-03  1.49119667e+00 -2.92472967e+02
      2.14005200e+04]
    温度和乙醇转换率的关系为:
    # y=2.83413333e-06 * x ^4 -3.36325333e-03 * x^3 + 1.49119667e+00  * x ^2 -2.92472967e+02 * x + 2.14005200e+04
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    上述代码详解:

    1. 导入模块:`
    import numpy
    import matplotlib.pyplot as plt
    
    • 1
    • 2
    1. 创建x和y轴的数组
    x=[250,275,300,325,350]
    y=[2.07,5.85,14.97,19.68,36.80]
    
    • 1
    • 2
    1. numpy-poly1d方法来建立多项式模型
    mymodel = numpy.poly1d(numpy.polyfit(x, y, 4)) # 四阶
    
    • 1
    1. 指定行的显示方法,从位置250开始,到位置350结束
    myline = numpy.linspace(250, 350, 100) # 从位置250开始,到位置350结束
    
    • 1

    linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
    作用:在指定的大间隔内(start,stop),返回固定间隔的数据。他们返回num个等间距的样本。
    参数介绍:

    start : scalar(标量) — 队列的开始值
    stop:scalar — 队列的结束值 (当endpoint=False时,不包含该点。)
    num:int,optional(可选填),生成序列的个数,默认为50,必须为整数。
    endpoint:bool,True时stop是最后的样本。False时stop不被包含。默认为True。
    retstep:bool,True时会改变计算的输出结果,输出为一个元组,元组的两个元素分别是需要生成的数列和数列的步长值。默认为False。

    1. 绘制散点图
    plt.scatter(x, y) # 散点图
    
    • 1
    1. 多项式回归线mymodel(行位置变量)
    plt.plot(myline, mymodel(myline), label='A1') # 多项式回归
    
    • 1

    二、多项式回归方法

    2.1polyfit函数

    polyfit对应的是多项式系数

    函数原型为:

    numpy.polyfit(x,y,num)
    
    • 1

    可以对一组数据进行多项式拟合。

    例子:

    import matplotlib.pyplot as plt
    import numpy as np
     
    # 构建噪声数据xu,yu
    xu = np.random.rand(50) * 4 * np.pi - 2 * np.pi
    def f(x):
        return np.sin(x) + 0.5 * x
    yu = f(xu)
     
    plt.figure(figsize=(8, 4))
    # 用噪声数据xu,yu,得到拟合多项式系数,自由度为5
    reg = np.polyfit(xu, yu, 5)
    # 计算多项式的函数值。返回在x处多项式的值,p为多项式系数,元素按多项式降幂排序
    ry = np.polyval(reg, xu)
    # 原先函数绘制
    plt.plot(xu, yu, 'bo', label='f(x)')#蓝色虚线
    # 拟合绘制
    plt.plot(xu, ry, 'r.', label='regression')#红色点状
    plt.legend(loc=0)# 位置
    plt.show()# 显示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    结果如下:
    在这里插入图片描述

    2.2poly1d函数

    poly1d对应的就是多项式表达式

    numpy.poly1d()函数有以下几个参数。
    分别为:

    1. 参数为:系数
    import numpy
    
    a= numpy.array([2,1,1])
    f = numpy.poly1d(a)
    print('表达式为:\n', f)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    1. 参数为:bool
      把数组的值作为根,然后反向推导多项式,例如:(x-2)(x-4)(x-5)
      在这里插入图片描述

    则有:(x - 2)(x - 4)(x - 5) = x^3 - 11x^2 + 38x -40

    1. poly1d还可以计算多项式的值
      在这里插入图片描述

    2.3poly1d和polyfit同时使用

    例子:

    import numpy
    import matplotlib.pyplot as plt
    
    x=[250,275,300,325,350]
    y=[2.07,5.85,14.97,19.68,36.80]
    
    polyfit=numpy.polyfit(x, y, 4)# 多项式系数
    poly1d = numpy.poly1d(polyfit)# 多项式表达式
    
    myline = numpy.linspace(250, 350, 100) # 从位置250开始,到位置350结束
    
    plt.scatter(x, y) # 散点图
    plt.plot(myline, poly1d(myline), label='A1') # 多项式回归
    plt.legend() # 设置图例
    plt.show() # 显示
    print('系数:\n', polyfit)
    print('表达式:\n', poly1d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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


  • 相关阅读:
    【K-means聚类算法】实现鸢尾花聚类
    热销产品缺货,滞销产品积压?WMS系统如何打造智能仓储
    JS-10-es6常用知识-对象扩展
    SpringMvc请求流程源码解析
    解析JSON格式参数 & 修改对象的key
    ubuntu18.04安装docker
    JAVA:List 与 数组 相互转换
    Docker 镜像仓库是什么?有哪些镜像仓库命令?
    你只知道@Value?设置server.port就能定义端口号是如何实现的?springboot读取配置文件的多种方式以及源码解析
    【每日一题】旋变字符串
  • 原文地址:https://blog.csdn.net/ex_6450/article/details/126518793