Python:使用piecewise与curve_fit进行三段拟合
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进行三段拟合的更多相关文章
- 用Python开始机器学习(3:数据拟合与广义线性回归)
机器学习中的预测问题通常分为2类:回归与分类. 简单的说回归就是预测数值,而分类是给数据打上标签归类. 本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析. 本例中使用一个 ...
- Python数据处理——绘制函数图形以及数据拟合
1.多项式拟合 对散点进行多项式拟合并打印出拟合函数以及拟合后的图形import matplotlib.pyplot as pltimport numpy as npx=np.arange(1,17, ...
- python应用 曲线拟合 02
前情提要 CsI 闪烁体晶体+PD+前放输出信号满足: $U(t) = \frac{N_f\tau_p}{\tau_p-\tau_f} \left[ e^{-\frac{t}{\tau_p}}-e^{ ...
- 用Python开始机器学习(7:逻辑回归分类) --好!!
from : http://blog.csdn.net/lsldd/article/details/41551797 在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到 ...
- Python数据挖掘
Python之所以如此流行,原因在于它的数据分析和挖掘方面表现出的高性能,而我们前面介绍的Python大都集中在各个子功能(如科学计算.矢量计算.可视化等),其目的在于引出最终的数据分析和数据挖掘功能 ...
- python应用 曲线拟合 01
双指数函数 待拟合曲线为 y(x) = bepx + ceqx import matplotlib.pyplot as plt x = ([0.05, 0.1, 0.15, 0.2, 0.25, 0. ...
- covid19数据挖掘与可视化实验
数据说明: 来源: https://www.kesci.com/mw/project/5e68db4acdf64e002c97b413/dataset (ncov) 日期:从2020年1月21日开始 ...
- 数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)
一.实验目的 掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能: 1. 最小二乘法的基本实现. 2. 用不同数据量,不同参数,不同的多 ...
- 用python的numpy作线性拟合、多项式拟合、对数拟合
转自:http://blog.itpub.net/12199764/viewspace-1743145/ 项目中有涉及趋势预测的工作,整理一下这3种拟合方法:1.线性拟合-使用mathimport m ...
随机推荐
- Linux下查找软件,rpm命令 dpkg命令 apt命令
centos: 1.查询一个包是否被安装 rpm -q < package name> 2.列出已安装软件相关的所有包 rpm -qa < package name> ubun ...
- 字节跳动Web Infra发起 Modern.js 开源项目,打造现代 Web 工程体系
10 月 27 日举办的稀土开发者大会上,字节跳动 Web Infra 正式发起 Modern.js 开源项目,希望推动现代 Web 开发范式的普及,发展完整的现代 Web 工程体系,突破应用开发效率 ...
- 解决matplotlib中文不显示问题
在导入库时添加如下几行代码 from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcPa ...
- Linux配置Redis集群 和 缓存介绍。
// 一.什么是缓存? mybatis一级缓存和二级缓存 mybatis的一级缓存存在哪? SqlSession,就不会再走数据库 什么情况下一级缓存会失效? 当被更新,删除的时候sqlsession ...
- 计算机网络再次整理————UDP例子[六]
前言 简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下. 正文 秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP. 只是了解和知晓 ...
- CodeForces 摆烂寄录
按订正顺序排序 现在是乱排的了 完整代码占版面 所以只放 AC 记录链接 Good Bye 2021: 2022 is NEAR 这场打得真拉/tuu A. 简单签到 开场就读错题,浪费 5min / ...
- 一些求和式的估算 & 杜教筛时间复杂度证明
本文内容概要: \(A=\sum\limits_{i=1}^n\dfrac1{\sqrt i}=1+\dfrac1{\sqrt2}+\cdots+\dfrac1{\sqrt n}\) \(O(\sqr ...
- Antd组件Table树型多选全选问题
组件库antd里面的树型选择不能做到勾选父组件然后一起勾选子组件情况,我也不知道是组件库的问题还是原本设计就是这样 刚好组件库存在rowselection的配置项,既然存在拓展方法,又遇到需求,那么就 ...
- NSURLConnection和Runloop(面试)
(1)两种为NSURLConnection设置代理方式的区别 //第一种设置方式: //通过该方法设置代理,会自动的发送请求 // [[NSURLConnection alloc]initWithRe ...
- Python调用windows下DLL详解 - ctypes库的使用
在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互.使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详 ...