利用scipy中的curve_fit拟合自定义曲线

Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

scipy.optimize中有curve_fit方法可以拟合自定义的曲线,如指数函数拟合,幂指函数拟合和多项式拟合,下面导入相应的包进行拟合的一个小例子:
导入需要的包:

from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

自定义需要拟合的函数

# =============================================================================
# 指数函数拟合
# =============================================================================
def func(x, a, b ):
    return a*np.exp(-b * x)+1/150

# =============================================================================
# 幂指数函数拟合
# =============================================================================
def func2(x, a, b ):
    return x**a +b

# =============================================================================
# 多项式函数拟合
# =============================================================================
def func3(x, a, b, c ):
    return a*x**2+ b*x +c  

进行拟合并画出相应曲线:

if __name__=='__main__':
    data=pd.read_excel('data_p_2009-2018.xlsx')
    xdata=np.array(data['人均GDP(万元)'])
    ydata =np.array(data['期望寿命倒数'])
    #画出真实数据
    plt.plot(xdata,ydata,'b-')

    #指数函数拟合
    popt, pcov = curve_fit(func, xdata, ydata)#popt数组中,三个值分别是待求参数a,b,c
    #预测值
    y_pred = [func(i, popt[0],popt[1]) for i in xdata]
    #画图
    plt.plot(xdata,y_pred,'r--')
    print(popt)
    
    #输出R方
    from sklearn.metrics import r2_score
    r2 = r2_score(ydata , y_pred )
    print('指数函数拟合R方为:',r2)

    
    #幂指数函数拟合
    popt, pcov = curve_fit(func2, xdata, ydata)#popt数组中,三个值分别是待求参数a,b,c
    y_pred2 = [func2(i, popt[0],popt[1]) for i in xdata]
    #画图
    plt.plot(xdata,y_pred2,'g--')
    print(popt)
    #输出R方
    from sklearn.metrics import r2_score
    r2 = r2_score(ydata , y_pred2 )
    print('幂指数函数拟合:',r2)

    #多项式拟合
    popt, pcov = curve_fit(func3, xdata, ydata)#popt数组中,三个值分别是待求参数a,b,c
    y_pred3 = [func3(i, popt[0],popt[1],popt[2]) for i in xdata]
    #画图
    plt.plot(xdata,y_pred3,'y-')
    print(popt)
    #输出R方
    from sklearn.metrics import r2_score
    r2 = r2_score(ydata , y_pred3 )
    print('多项式拟合R方为:',r2)
    
    #添加图例
    plt.legend(['原始数据','指数函数拟合','幂指数函数拟合','多项式拟合']) 

得到曲线如图:
在这里插入图片描述

只是做一下简单记录,Scipy中还有其他一些有意思的包,等用到的时候再来记录。
在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页