x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18,19,20,21], dtype=float)
y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03,145,147,149,151,153,155]) plt.scatter(x,y,s=30,c='b')

得到如下散点图:

定义分段函数

#6个未知参数 x0x1,y0,y1分别是2个分割间断点的横纵坐标 k0,k1是第一和第三段直线的斜率
def piecewise(x,x0,x1,y0,y1,k0,k1):
return np.piecewise(x , [x <= x0, np.logical_and(x0<x, x<= x1),x>x1] ,
[lambda x:k0*(x-x0) + y0,#根据点斜式构建函数
lambda x:(x-x0)*(y1-y0)/(x1-x0)+y0,#根据两点式构建函数
lambda x:k1*(x-x1) + y1])

根据分段函数进行拟合,通过迭代寻找最优的p,即为p_best

注:p(p_best)中包含的是拟合之后求得的所有未知参数

perr_min = np.inf
p_best = None
for n in range(100):
k = np.random.rand(6)*20
p , e = optimize.curve_fit(piecewise, x, y,p0=k)
perr = np.sum(np.abs(y-piecewise(x, *p)))
if(perr < perr_min):
perr_min = perr
p_best = p

根据p_best调用curve_fit函数绘制拟合图像

xd = np.linspace(0, 21, 100)
plt.figure() plt.plot(xd, piecewise(xd, *p_best))
xx=(p_best[0],p_best[1])
yy=(p_best[2],p_best[3]) plt.scatter(xx,yy,s=30,c='black')
plt.show()

结果如下:

完整代码:

from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np #6个未知参数 x0x1,y0,y1分别是2个分割间断点的横纵坐标 k0,k1是第一和第三段直线的斜率
def piecewise(x,x0,x1,y0,y1,k0,k1):
return np.piecewise(x , [x <= x0, np.logical_and(x0<x, x<= x1),x>x1] ,
[lambda x:k0*(x-x0) + y0,#根据点斜式构建函数
lambda x:(x-x0)*(y1-y0)/(x1-x0)+y0,#根据两点式构建函数
lambda x:k1*(x-x1) + y1]) x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18,19,20,21], dtype=float)
y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03,145,147,149,151,153,155]) plt.scatter(x,y,s=30,c='b') perr_min = np.inf
p_best = None
for n in range(100):
k = np.random.rand(6)*20
p , e = optimize.curve_fit(piecewise, x, y,p0=k)
perr = np.sum(np.abs(y-piecewise(x, *p)))
if(perr < perr_min):
perr_min = perr
p_best = p xd = np.linspace(0, 21, 100)
plt.figure() plt.plot(xd, piecewise(xd, *p_best))
xx=(p_best[0],p_best[1])
yy=(p_best[2],p_best[3]) plt.scatter(xx,yy,s=30,c='black')
plt.show()

Python:使用piecewise与curve_fit进行三段拟合的更多相关文章

  1. 用Python开始机器学习(3:数据拟合与广义线性回归)

    机器学习中的预测问题通常分为2类:回归与分类. 简单的说回归就是预测数值,而分类是给数据打上标签归类. 本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析. 本例中使用一个 ...

  2. Python数据处理——绘制函数图形以及数据拟合

    1.多项式拟合 对散点进行多项式拟合并打印出拟合函数以及拟合后的图形import matplotlib.pyplot as pltimport numpy as npx=np.arange(1,17, ...

  3. python应用 曲线拟合 02

    前情提要 CsI 闪烁体晶体+PD+前放输出信号满足: $U(t) = \frac{N_f\tau_p}{\tau_p-\tau_f} \left[ e^{-\frac{t}{\tau_p}}-e^{ ...

  4. 用Python开始机器学习(7:逻辑回归分类) --好!!

    from : http://blog.csdn.net/lsldd/article/details/41551797 在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到 ...

  5. Python数据挖掘

    Python之所以如此流行,原因在于它的数据分析和挖掘方面表现出的高性能,而我们前面介绍的Python大都集中在各个子功能(如科学计算.矢量计算.可视化等),其目的在于引出最终的数据分析和数据挖掘功能 ...

  6. python应用 曲线拟合 01

    双指数函数 待拟合曲线为 y(x) = bepx + ceqx import matplotlib.pyplot as plt x = ([0.05, 0.1, 0.15, 0.2, 0.25, 0. ...

  7. covid19数据挖掘与可视化实验

    数据说明: 来源: https://www.kesci.com/mw/project/5e68db4acdf64e002c97b413/dataset (ncov) 日期:从2020年1月21日开始 ...

  8. 数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)

    一.实验目的 掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能: 1. 最小二乘法的基本实现. 2. 用不同数据量,不同参数,不同的多 ...

  9. 用python的numpy作线性拟合、多项式拟合、对数拟合

    转自:http://blog.itpub.net/12199764/viewspace-1743145/ 项目中有涉及趋势预测的工作,整理一下这3种拟合方法:1.线性拟合-使用mathimport m ...

随机推荐

  1. django之定义统一返回数据格式与GET/POST装饰器

    1. 为了返回给网页前端的格式统一,定义一个通用的插件类,返回统一格式数据 # enconding:utf-8 """ 定义一个插件类, ""&quo ...

  2. 【第十三期】B站后端开发实习生一、二面经

    写在最前:非科班渣硕去年转码一年,不是什么大佬,纯小白(go语言开发). 一面(大概70min) 首先是自我介绍.(比较传统,就是描述下自己的技术栈) 线程和进程的关系. 线程之间如何进行通信. 死锁 ...

  3. Nginx网络压缩 CSS压缩 图片压缩 JSON压缩

    一.序言 使用Nginx作为web应用服务时,会代理如下常见文件:js.css.JSON.图片等,本文提供基于Nginx内置的压缩技术,提供网络请求响应速度的解决方案. 1.网络压缩原理 网络压缩的原 ...

  4. 统信UOS系统部署.Net Core 5.0

    平时很少用Linux,需要的时候才查资料,记录下遇到的问题和解决办法.这次部署的系统是统信UOS,arm64位CPU 第一步:安装.Net Core 5.0运行环境 统信UOS是基于Debian 10 ...

  5. Git远程仓库地址操作

    添加 git remote add test1_origin git@github.com:b84955189/test1.git test1_origin:远程地址名,这里是我自定的. git@gi ...

  6. 标签显示模式(display)

    非洲黑人: 皮肤内黑色素含量高,以吸收阳光中的紫外线,保护皮肤内部结构免遭损害,头发象羊毛一样卷曲,使每根卷发周围都有许多空隙,空隙充满空气,卷发有隔热作用. 欧洲白人: 生活寒带或着是说常年温度较低 ...

  7. oracle查看当前正在使用的数据库

    select name from V$DATABASE; 也可以用 select SYS_CONTEXT('USERENV','INSTANCE_NAME') from dual;

  8. TCP的报文详细解读

    这张图好像挺有名的,其实一开始我看见的时候是一脸懵逼的,但是通过翻书(大学时代最害怕的计算机网络),查阅他人博客等等办法,最后终于有了一个系统的了解,当然,这里知识点多而杂,大家可以多看几遍,结合上面 ...

  9. 「 题解 」P2487 [SDOI2011]拦截导弹

    简单题意 给定 \(n\) 个数对 \((h_i, v_i)\). 求: 最长不上升子序列的长度. 对于每个 \(i\),分别求出包含数对 \((h_i, v_i)\) 的最长上升子序列的个数和最长不 ...

  10. sublime与python交互

    点击菜单栏中的工具 -> 编译系统,勾选Python即可 创建hello.py文件,Ctrl+S保存文件,Ctrl+B执行文件,结果如下图   3.sublime运行python文件的交互环境设 ...