对于多项式SEO靠我回归方法来说,若你的数据点不适合线性回归(就是直线大部分不穿过数据点),那么使用该方法就比较合适。
并且多项式回归像线性回归一样,都是用变量 x 和 y 之间的关系来找到绘制数据点线最好的方法。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) # 多项式回归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()# 显示结果如下:
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还可以计算多项式的值
例子:
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)网站备案号:浙ICP备17034767号-2