首页 > 编程知识 正文

python散点图拟合曲线,python散点图拟合直线

时间:2023-05-06 10:30:10 阅读:163725 作者:1416

使用Python的数据拟合文章目录使用Python的数据拟合多项式拟合非多项式拟合

多项式拟合任何函数都可以划分为与该函数近似的多项式表示。

多项式拟合所需的函数是numpy库的np.polyfit,使用方法如下:

NP.polyfit(x,y,deg,rcond=None,full=False,w=None,cov=False ) )使用最th的DDP乘法原理,基于与已知的x和y相对应的值

p(x ) ) p0xdegp1xdeg1pdegp(x ) ) x ^ { deg } p { _1} x ^ { deg-1 }p _ { deg } p ) x )=P0 xde gp1 xde gp1 xde gp )

返回一系列系数PP。

参数说明:

一般情况下,只使用前三个参数。

x阵列类型、形状(m,)、m个采样点的x坐标) x[i],y[i] ) yarray类型、形状(m,)或) m,k ),以及采样点的y坐标。 符合degint型常数、多项式的最高次项。 返回值:

p p p的各个系数、p p p的个数为d e g 1 deg 1 deg 1。 也可以使用polyval ()计算需要预测多项式的值。

importmatplotlib.pyplotaspltimportnumpyasnpif _ _ name _=' _ main _ ' 3360 x=NP.arange (1,31 ) )

188, 220, 257, 300, 350, 409, 478, 558, 651, 760, 887, 1035, 1208, 1410]) z1 = np.polyfit(x, y, 3) # 曲线拟合,返回值为多项式的各项系数 p1 = np.poly1d(z1) # 返回值为多项式的表达式,也就是函数式子 print(p1) y_pred = p1(x) # 根据函数的多项式表达式,求解 y #print(np.polyval(p1, 29)) #根据多项式求解特定 x 对应的 y 值 #print(np.polyval(z1, 29)) #根据多项式求解特定 x 对应的 y 值 plot1 = plt.plot(x, y, '*', label='original values') plot2 = plt.plot(x, y_pred, 'r', label='fit values') plt.title('') plt.xlabel('') plt.ylabel('') plt.legend(loc=3, borderaxespad=0., bbox_to_anchor=(0, 0)) plt.show()

输出结果:

3 20.1215 x - 3.045 x + 28.62 x - 34.47

则其拟合的函数为 y = 0.1215 x 3 − 3.045 x 2 + 28.62 x − 34.47 y=0.1215 x{^3} - 3.045 x {^2}+ 28.62 x - 34.47 y=0.1215x3−3.045x2+28.62x−34.47
将拟合的曲线与原数据各点进行对比发现拟合效果良好。

非多项式拟合

如果需要进行多项式拟合,前提是必须大体上知道散点的大致曲线形式,也就是大致的函数的形式。
比如,例子中的散点看起来像是指数的函数分布,因此可以给出假设的函数
y = b a x + c y=ba{^x}+c y=bax+c
所以,只要给出具体的函数形式(可以是任意的,只要能写的出来皆可),用最thddp乘的方式去逼近和拟合,即求出函数的各项系数。

此时用到的是scipy.optimize包下的curve_fit函数了:

代码示例:

import matplotlib.pyplot as pltimport numpy as npfrom scipy.optimize import curve_fitdef func(x, a, b, c): return b * np.power(a, x) + cif __name__ == "__main__": x = np.arange(1, 31, 1) y = np.array([20, 23, 26, 29, 32, 35, 38, 45, 53, 62, 73, 86, 101, 118, 138, 161, 188, 220, 257, 300, 350, 409, 478, 558, 651, 760, 887, 1035, 1208, 1410]) popt, pcov = curve_fit(func, x, y) # 曲线拟合,popt为函数的参数list y_pred = [func(i, popt[0], popt[1], popt[2]) for i in x] # 直接用函数和函数参数list来进行y值的计算 print(popt) plot1 = plt.plot(x, y, '*', label='original values') plot2 = plt.plot(x, y_pred, 'r', label='fit values') plt.title('') plt.xlabel('') plt.ylabel('') plt.legend(loc=3, borderaxespad=0., bbox_to_anchor=(0, 0)) plt.show()

输出结果为:

[ 1.16791847 13.39168878 1.24633841]

那么就有
{ a =   1.16791847 b =   13.39168878 c = 1.24633841 left{ begin{aligned} a & = & 1.16791847 \ b & =& 13.39168878 \ c & = & 1.24633841 end{aligned} right. ⎩⎪⎨⎪⎧​abc​===​ 1.16791847 13.391688781.24633841​
于是我们得到了拟合的函数为

y = 13.39168878 ∗ 1.16791847 x + 1.24633841 y=13.39168878*1.16791847{^x}+1.24633841 y=13.39168878∗1.16791847x+1.24633841
将拟合的曲线与原数据各点进行对比发现拟合效果良好。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。