解决方案

数学建模之多项式回归

seo靠我 2023-09-25 14:08:04

多项式回归(Polynomial Regression)

前言一、多项式回归的原理二、多项式回归方法2.1polyfit函数2.2poly1d函数2.3poly1d和polyfit同时使用

前言

对于多项式SEO靠我回归方法来说,若你的数据点不适合线性回归(就是直线大部分不穿过数据点),那么使用该方法就比较合适。

并且多项式回归像线性回归一样,都是用变量 x 和 y 之间的关系来找到绘制数据点线最好的方法。

一、多项SEO靠我式回归的原理

Python 中有一些方法可以找到数据点之间的关系并画出多项式回归线。

例如:研究乙醇转化率与温度的关系# 建立一元一次方程y = ax + b import numpy aSEO靠我s np import matplotlib.pyplot as plt# A1组温度与乙醇转换率的关系图-散点图 x=np.array([250,275,300,32SEO靠我5,350]).reshape((-1, 1)) y=np.array([2.07,5.85,14.97,19.68,36.80])plt.scatter(x, y) # 绘制散点图 SEO靠我 plt.title(A1) plt.show()

结果如下:

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

用多项式回归方法来做:

# 多项式拟合 SEO靠我import numpy import matplotlib.pyplot as pltx=[250,275,300,325,350] y=[2.07,5.85,14.SEO靠我97,19.68,36.80]mymodel = numpy.poly1d(numpy.polyfit(x, y, 4)) # 四阶myline = numpy.linspace(250, 350, SEO靠我100) # 从位置250开始,到位置350结束plt.scatter(x, y) # 散点图 plt.plot(myline, mymodel(myline), label=A1) SEO靠我# 多项式回归 plt.legend() # 设置图例 plt.show() # 显示 print(A1组中温度与乙醇转换率的关系中阶数的系数:, nuSEO靠我mpy.polyfit(x, y, 4))

结果如下:

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

上述代码详解:

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

linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

作用:SEO靠我在指定的大间隔内(start,stop),返回固定间隔的数据。他们返回num个等间距的样本。

参数介绍:

start : scalar(标量) — 队列的开始值

stop:scalar — 队列的结束值 (SEO靠我当endpoint=False时,不包含该点。)

num:int,optional(可选填),生成序列的个数,默认为50,必须为整数。

endpoint:bool,True时stop是最后的样本。FalsSEO靠我e时stop不被包含。默认为True。

retstep:bool,True时会改变计算的输出结果,输出为一个元组,元组的两个元素分别是需要生成的数列和数列的步长值。默认为False。绘制散点图 SEO靠我 plt.scatter(x, y) # 散点图 多项式回归线mymodel(行位置变量) plt.plot(myline, mymodel(myline), SEO靠我label=A1) # 多项式回归

二、多项式回归方法

2.1polyfit函数

polyfit对应的是多项式系数

函数原型为:

numpy.polyfit(x,y,num)

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

例子:SEO靠我

import matplotlib.pyplot as plt import numpy as np# 构建噪声数据xu,yu xu = np.random.rand(SEO靠我50) * 4 * np.pi - 2 * np.pi def f(x):return np.sin(x) + 0.5 * x yu = f(xu)plt.figureSEO靠我(figsize=(8, 4)) # 用噪声数据xu,yu,得到拟合多项式系数,自由度为5 reg = np.polyfit(xu, yu, 5) # SEO靠我计算多项式的函数值。返回在x处多项式的值,p为多项式系数,元素按多项式降幂排序 ry = np.polyval(reg, xu) # 原先函数绘制 plSEO靠我t.plot(xu, yu, bo, label=f(x))#蓝色虚线 # 拟合绘制 plt.plot(xu, ry, r., label=regression)#红色SEO靠我点状 plt.legend(loc=0)# 位置 plt.show()# 显示

结果如下:

2.2poly1d函数

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

numpy.poly1dSEO靠我()函数有以下几个参数。

分别为:

参数为:系数 import numpya= numpy.array([2,1,1]) f = numpy.poly1d(SEO靠我a) print(表达式为:\n, f) 参数为:bool

把数组的值作为根,然后反向推导多项式,例如:(x-2)(x-4)(x-5)

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

poly1d还可以计算多项式的值

2.3poly1d和polyfit同时使用

例子:

import numpy SEO靠我 import matplotlib.pyplot as pltx=[250,275,300,325,350] y=[2.07,5.85,14.97,19.68,36.80]polyfSEO靠我it=numpy.polyfit(x, y, 4)# 多项式系数 poly1d = numpy.poly1d(polyfit)# 多项式表达式myline = numpy.linspaSEO靠我ce(250, 350, 100) # 从位置250开始,到位置350结束plt.scatter(x, y) # 散点图 plt.plot(myline, poly1d(myline)SEO靠我, label=A1) # 多项式回归 plt.legend() # 设置图例 plt.show() # 显示 print(系数:\n, polyfitSEO靠我) print(表达式:\n, poly1d)
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2