提示

目录

因为工作最近需要对数据进行拟合生成指标

一、最后的成果

二、导入数据

三、将数据中的自变量因变量都抽出来,进行九种回归拟合

1.代码如下:

2.这里补充下变换知识

三 对数据进行绘图,画出拟合曲线和散点图,把公式也写上去

总结:撒花~写完了这里


因为工作最近需要对数据进行拟合生成指标

所以打算写一个含有十种函数的拟合模型,去看那种拟合的r2最高,将r2最高的函数函数作为最终拟合函数。


一、最后的成果

用n 组数据生产 n组数据 拟合十种回归,保留r2最大的画出期曲线和散点图,标注好函数公式,(图是假数据,已经打码处理,大概理解下就行)

下是本篇文章正文内容,下面案例可供参考

二、导入数据

import matplotlib.pyplot as plt
import numpy as  np
import pandas as pdplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号##io=r'C:\Users\Viki\Desktop\****'#根据自己的需要换
city_pr2=pd.read_excel(io,sheet_name='Sheet1')

三、将数据中的自变量因变量都抽出来,进行九种回归拟合

1.代码如下:

df_d = pd.DataFrame(columns=('名称','类型','r2','系数'))from sklearn.metrics import r2_score#我这里原本是写了循环的 因为这种回归,肯定不是一组数据进行十种回归,这样还不如用spss
#所以这里是有 city_pr2['标签']==i   里面每个标签拿出来的数据都回归十次,选出每组数据r2最大的回归#函数,感觉大家都会加循环,我就不删了,方便大家改,可能让人难懂~算了随缘
for i in a: jj=city_pr2[(city_pr2['位置']==i)]# jj=city_pr2#十种函数的回归从这里开始写了~##线性x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(x_data_2, y_data_2, 1)print(L)Z=np.polyval(L,x_data_2,)score = r2_score(y_data_2, Z, multioutput='raw_values')print('线性:'+str(score))new=pd.DataFrame({'名称':i,'类型':'线性','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##指数x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(x_data_2, np.log(y_data_2), 1)Z=np.polyval(L,x_data_2)true=np.exp(Z)score = r2_score(y_data_2,true, multioutput='raw_values')print('指数:'+str(score))new=pd.DataFrame({'名称':i,'类型':'指数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##二次x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(x_data_2, y_data_2, 2)print(L)Z=np.polyval(L,x_data_2,)score = r2_score(y_data_2, Z, multioutput='raw_values')print('二次:'+str(score))new=pd.DataFrame({'名称':i,'类型':'二次','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##幂函数x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(np.log(x_data_2), np.log(y_data_2), 1)Z=np.polyval(L,np.log(x_data_2))true=np.exp(Z)score = r2_score(y_data_2,true, multioutput='raw_values')print('幂函数:'+str(score))new=pd.DataFrame({'名称':i,'类型':'幂函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##对数x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(np.log(x_data_2), y_data_2, 1)Z=np.polyval(L,np.log(x_data_2))score = r2_score(y_data_2,Z, multioutput='raw_values')print('对数:'+str(score))new=pd.DataFrame({'名称':i,'类型':'对数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##复合函数x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(x_data_2,np.log(y_data_2), 1)Z=np.polyval(L,x_data_2)true=np.exp(Z)score = r2_score(y_data_2,true, multioutput='raw_values')print('复合函数:'+str(score))new=pd.DataFrame({'名称':i,'类型':'复合函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##生长x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(x_data_2, np.log(y_data_2), 1)Z=np.polyval(L,x_data_2)true=np.exp(Z)score = r2_score(y_data_2,true, multioutput='raw_values')print('生长:'+str(score))new=pd.DataFrame({'名称':i,'类型':'生长','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##三次x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])y_data_2=sum(y_data_2,[])L=np.polyfit(x_data_2, y_data_2, 3)Z=np.polyval(L,x_data_2)score = r2_score(y_data_2,Z,multioutput='raw_values')print('三次:'+str(score))new=pd.DataFrame({'名称':i,'类型':'三次','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##S函数x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])x_cz_3 = [1/x for x in x_data_2]y_data_2=sum(y_data_2,[])L=np.polyfit(x_cz_3, np.log(y_data_2), 1)Z=np.polyval(L,x_cz_3)true=np.exp(Z)score = r2_score(y_data_2,true,multioutput='raw_values')print('S函数:'+str(score))new=pd.DataFrame({'名称':i,'类型':'S函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##逆函数x_data_2=jj[['自变量']].values.tolist()y_data_2=jj[['因变量']].values.tolist()x_data_2=sum(x_data_2,[])x_cz_3 = [1/x for x in x_data_2]y_data_2=sum(y_data_2,[])L=np.polyfit(x_cz_3, y_data_2, 1)Z=np.polyval(L,x_cz_3)score = r2_score(y_data_2,true,multioutput='raw_values')print('逆函数:'+str(score))new=pd.DataFrame({'名称':i,'类型':'逆函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))#把没组函数的r2最大的拿出来
df_data=df_d.sort_values('r2', ascending=False).groupby('名称', as_index=False).first()

2.这里补充下变换知识

回归用的都是最小二乘法,将8种函数进行变换(不包括二次、三次),变换成线性。变换方式如下,python也是根据这个变换去写的。


三 对数据进行绘图,画出拟合曲线和散点图,把公式也写上去


ff=df_data
# second=df_e[(df_e['类型']=='二次')]
j=0
while  j< 59:  #这里是我不够聪明,我自己数了一下我总共有多少组数据,所以加了个while 限制绘图次数gg=ff.iloc[[j]].values.tolist()gg =sum(gg,[]) #开始写公式 自变量 &因变量if gg[1] == '二次':x=np.arange(0.15,0.4,0.002)y_data=gg[3][0]*x**2+gg[3][1]*x+gg[3][2]formu_s='y_data='+str(gg[3][0])+str('x^2+')+str(gg[3][1])+str('x')+str('+(')+str(gg[3][2])+str(')')elif gg[1] == '线性':x=np.arange(0.15,0.4,0.002)y_data=gg[3][0]*x+gg[3][1]formu_s='y_data='+str(gg[3][0])+str('x')+str('+(')+str(gg[3][1])+str(')')elif gg[1] == '指数':x=np.arange(0.15,0.4,0.002)y_data=np.exp(gg[3][0]*x+gg[3][1])formu_s='y_data='+str(np.exp(gg[3][1]))+str('e')+'^'+str(gg[3][0]) +'x'elif gg[1] == '幂函数':x=np.arange(0.15,0.4,0.002)y_data=np.exp(gg[3][1]+(np.log(x)*gg[3][0]))   formu_s='y_data='+str(np.exp(gg[3][1]))+str('x')+'^'+str(gg[3][0])elif gg[1] == '对数':x=np.arange(0.15,0.4,0.002)y_data=gg[3][1]+(np.log(x)*gg[3][0])  formu_s='y_data='+str(gg[3][1])+'+'+str(gg[3][0])+'In(x)'      elif gg[1] == '生长':x=np.arange(0.15,0.4,0.002)y_data=np.exp(gg[3][0]*x+gg[3][1])   formu_s='y_data='+'e^('+str(gg[3][0])+str('x')+str('+(')+str(gg[3][1])+str('))')     elif gg[1] == '三次':x=np.arange(0.15,0.4,0.002)y_data=gg[3][0]*x**3+gg[3][1]*x**2+gg[3][2]*x+gg[3][3]formu_s='y_data='+str(gg[3][0])+str('x^3+')+str(gg[3][1])+str('x^2+')+str(gg[3][2])+str('x')+str('+(')+str(gg[3][3])+str(')')elif gg[1] == 'S函数':x=np.arange(0.15,0.4,0.002)y_data=np.exp(gg[3][0]*(x)**(-1)+gg[3][1])   formu_s='y_data='+'e^('+str(gg[3][0])+str('(1/x)')+str('+(')+str(gg[3][1])+str('))')          elif gg[1] == '逆函数':x=np.arange(0.15,0.4,0.002)y_data=gg[3][0]*(x)**(-1)+gg[3][1]   formu_s='y_data='+str(gg[3][0])+str('(1/x)')+str('+(')+str(gg[3][1])+str(')')elif gg[1] == '复合函数':x=np.arange(0.15,0.4,0.002)y_data=np.exp(gg[3][1]+(gg[3][0]*x))   formu_s='y_data='+str(np.exp(gg[3][1])) +'*'+str(np.exp(gg[3][0])) +'^x'       gg.append(formu_s)del gg[3]gg=[gg]df_a=df_a.append(gg,ignore_index=(True))plt.plot(x,y_data,'r-.o',label='因变量 '+formu_s+'  r2='+str(gg[0][2]),linewidth=0.02)plt.xlabel('自变量',fontsize=20)plt.ylabel('因变量',fontsize=20)plt.title(str(gg[0][0])+'自变量&因变量',fontsize=20) #要用plt调动titleplt.legend(fontsize=20)x2=city_pr2[(city_pr2['位置']==gg[0][0])][['自变量']]y2=city_pr2[(city_pr2['位置']==gg[0][0])][['因变量']]colors1 = '#00CED1' #点的颜色colors2 = '#DC143C'area = np.pi * 6**2  # 点面积 # 画散点图plt.scatter(x2, y2, s=area, c=colors2, alpha=0.5, label='ZH')plt.savefig('')io_1=r'C:\Users\Viki\Desktop\临时文件'plt.savefig(io_1+'/%s_zh.jpg'%(gg[0][0]), bbox_inches='tight')plt.show()plt.close()j=j+1if j > 58:     break

总结:撒花~写完了
这里

python 一元回归拟合(含幂函数,对数,S函数,指数函数,一次、二次、三次,逆函数,生长、复合函数)相关推荐

  1. Python 各种回归(含sklearn)

    机器学习 https://www.jb51.net/article/164603.htm 多元回归 https://zhuanlan.zhihu.com/p/61084966?utm_source=w ...

  2. python中回归拟合图_seaborn库:线性回归拟合图

    1.核心函数及参数介绍 regplot(data,x,y,x_estimator,color,marker,scatter,fit_reg,ci,order,logx,x_jitter,y_jitte ...

  3. python一元三次方程拟合_一元三次方程的求根公式

    一元二次方程的回顾和启示 学过初中数学都知道对于任何一个实系数一元二次方程 ,通过配方可以得到 ,根据判别式 的符号,可以判断方程实根的个数,并且可以得到求根公式 要么是 个不同的实根 ,要么是 个二 ...

  4. Python 散点图 回归拟合 带误差 各参数详解(2)

    1.数据下载地址 散点图样例数据:https://download.csdn.net/download/qq_35240689/87006447 import numpy as np import p ...

  5. [转载] Python 多项式拟合(一元回归)

    参考链接: Python | 多项式回归的实现 一元一阶线性拟合: 假设存在一条线性函数尽量能满足所有的点:y=ax+b .对所有点的的公式为: 残差值β = 实际值y - 估计值y,β 应尽量小,当 ...

  6. Python实现一元回归多元回归及参数检验

    #pic_center =400x 系列文章: 文章目录 一元回归 人工实现代码 statsmodels实现 sklearn.linear_model 报告注解 数据读取 无表头,列名 .csv格式! ...

  7. python 物理实验_基于Python和梯度下降算法的物理实验数据一元线性拟合方法

    基于 Python 和梯度下降算法的物理实验数据一元线性拟 合方法 关毅铬 ; 程敏熙 [期刊名称] < <物理通报> > [年 ( 卷 ), 期] 2019(000)010 ...

  8. R语言使用lm函数拟合回归模型(简单线性回归、一元回归、simple regression)、并解读拟合模型

    R语言使用lm函数拟合回归模型(简单线性回归.一元回归.simple regression).并解读拟合模型 目录

  9. 一元二次曲线拟合的最小二乘python实现

    1.首先定义一个误差函数,t为需要拟合的参数 def residual(t, x, y): return y - (t[0] * x ** 2 + t[1] * x + t[2]) 2.接着设定真实值 ...

最新文章

  1. 'utf-8' codec can't decode byte 0xb6 in position 34: invalid start byte
  2. php动态加载js,动态加载script文件的两种方法_javascript技巧
  3. wget下载阿里云oss的文件报错403
  4. 现代密码学2.1--完美安全和完美不可区分/Perfectly secret, Perfectly indistinguishable
  5. Django模板语言
  6. P3865 【模板】ST表
  7. 面试还搞不懂Redis,快看看这40道面试题!| 博文精选
  8. 知识关联的价值还无法与人的关联的价值相比
  9. Vue系列vue-router的项目打包(三)
  10. MFC日志(2011.4.9)
  11. 剑指offer——25.合并两个排序的链表
  12. Eclipse中的Git使用之Branch创建,Merge
  13. 小米笔记本装了linux后u盘启动不了,小米笔记本bios设置u盘启动教程
  14. 正向代理与反向代理的区别
  15. 短信接口被恶意盗刷(验证码短信被盗刷)怎么办?
  16. 【超分辨率】Zoom to Learn, Learn to Zoom
  17. 使用Python爬取中国天气网天气数据
  18. Android开发中虚拟位置定位、应用双开、IP代理检测
  19. 【学习OpenCV4】OpenCV4与opencv-contrib模块介绍
  20. 水体微生物多样性分析

热门文章

  1. 安装MySQL 64_windows下安装mysql-8.0.18-winx64
  2. 写给人类的机器学习 2.1 监督学习
  3. 传世单机 GM命令 查看所有GM命令 自定义游戏命令
  4. 抢椅子游戏java_年会互动游戏《抢凳子教案》
  5. MUI----mui.init()和mui.plusReady()
  6. bs架构的系统能连接mysql吗_bs架构是什么
  7. Pro ASP.NET MVC 3 Framework 译文(一)
  8. Qt之开源绘图控件QCustomPlot
  9. AMDCPU双核驱动补丁
  10. 石墨加工机器keyword