多分段线性函数拟合方法详解
创作时间:
作者:
@小白创作中心
多分段线性函数拟合方法详解
引用
CSDN
1.
https://blog.csdn.net/qq_39805362/article/details/114454691
本文介绍了两种实现多分段线性函数拟合的方法:一种是基于Stack Overflow上的解决方案,另一种是使用专门的pwlf库。文章通过具体的代码示例和图形输出,详细展示了这两种方法的实现过程和效果,对于数据科学和机器学习领域的技术人员具有较高的参考价值。
今天遇到需求需要进行多分段线性函数拟合,发现了两种方法可以实现。
1.Stack Overflow上有人给出的一个答案
在Stack Overflow有大佬给出了回答,如何进行分段线性函数拟合,对于2分段函数吗,可以用numpy.piecewise()创建分段函数,再用curve_fit()去训练得到参数即可。对于多分段线性函数,大佬也给出了一个自己写的函数来实现,该函数可以拟合出多分段线性函数的拟合点。Stack Overflow回答链接。
1.1二分段函数代码及输出
from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15], 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])
def piecewise_linear(x, x0, y0, k1, k2):
return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])
p , e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(0, 15, 100)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))
1.2 多分段线性函数代码及实现
多分段线性函数代码链接

%matplotlib inline
import numpy as np
import pylab as pl
def make_test_data(seg_count, point_count):
x = np.random.uniform(2, 10, seg_count)
x = np.cumsum(x)
x *= 10 / x.max()
y = np.cumsum(np.random.uniform(-1, 1, seg_count))
X = np.random.uniform(0, 10, point_count)
Y = np.interp(X, x, y) + np.random.normal(0, 0.05, point_count)
return X, Y
from scipy import optimize
def segments_fit(X, Y, count):
xmin = X.min()
xmax = X.max()
seg = np.full(count - 1, (xmax - xmin) / count)
px_init = np.r_[np.r_[xmin, seg].cumsum(), xmax]
py_init = np.array([Y[np.abs(X - x) < (xmax - xmin) * 0.01].mean() for x in px_init])
def func(p):
seg = p[:count - 1]
py = p[count - 1:]
px = np.r_[np.r_[xmin, seg].cumsum(), xmax]
return px, py
def err(p):
px, py = func(p)
Y2 = np.interp(X, px, py)
return np.mean((Y - Y2)**2)
r = optimize.minimize(err, x0=np.r_[seg, py_init], method='Nelder-Mead')
return func(r.x)
X, Y = make_test_data(10, 2000)
px, py = segments_fit(X, Y, 8)
pl.plot(X, Y, ".")
pl.plot(px, py, "-or");
2.pwlf实现多分段线性函数
pwlf是一个很完善的多分段线性函数实现的包了,官网链接,这个包是比较好的,在我的实践中,用1.2的代码无法成功拟合出来,但是用这个包可以成功拟合出多分段线性函数,因此这个包是要比上面的代码更好的。而且这个包可以实现的功能也很多了,这里放个官方可实现的功能目录。
当然这个包不止可以拟合多段线性函数,也可以不是线性函数,比如二次函数等等都可以。
热门推荐
水族箱过滤系统选择指南:各类滤材的优劣与使用建议
写一个你认为尽可能大的数?
转化犯是犯罪形态吗
维生素A含量高的蔬菜有哪些?富含维生素A的蔬菜排行
用Excel怎么算分组的标准差
“光荣的手榴弹”简述国产手榴弹发展
刑事案件阅卷神器:提高法律工作效率的数字化解决方案
异地就医报销别再跑断腿!这份电子指南请收好
浅谈古玩瓷器的特点和鉴定方法
魅力三江 | 文旅双驱动:侗乡文化旅游产业高质量发展探索
界面流变仪的测量精度与数据分析
从增程到纯电:驾驶体验、充电便利性及维护成本全方位对比
GMT模压成型技术:工艺、优势与应用
薛之谦《动物世界》歌词赏析:从音乐到歌词的艺术转型
薛之谦《动物世界》唱法、编曲、歌词浅析
麻醉术前访视内容都有什么?麻醉医生会问哪些问题?
独立站接入第三方支付平台,怎样设置支付流程更符合用户心理?
如何识别英国的钱
团队协作在提升工作效率中的作用及实现方式
如何做好团队反馈工作
魅力三江 | 探索三江:侗族文化和绿色产业的完美融合
长三角可借鉴新加坡博物馆“精益+融合”经验
床垫买好一点还是一般的好?选购床垫的关键指南
减脂时期的每天1200卡路里食物长什么样?
斯坦福教授揭秘六大长寿秘诀:从饮食到运动的科学指南
彩虹背后的光学奇迹:科学解读与传说探索
三国名臣顾雍:少言寡语的吴国丞相
中美稠油储量大比拼:美国120亿吨,中国超260亿吨
醋泡黄豆用生的还是用熟的好
2025年新型储能产业发展趋势与展望