多分段线性函数拟合方法详解
创作时间:
作者:
@小白创作中心
多分段线性函数拟合方法详解
引用
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的代码无法成功拟合出来,但是用这个包可以成功拟合出多分段线性函数,因此这个包是要比上面的代码更好的。而且这个包可以实现的功能也很多了,这里放个官方可实现的功能目录。
当然这个包不止可以拟合多段线性函数,也可以不是线性函数,比如二次函数等等都可以。
热门推荐
上海海洋大学成功研发用于食品保鲜的新型光动力抑菌材料
皮肤科照蓝光有什么用
龙源之域探索攻略:巴巴豚刷新点与宝箱获取指南
认识坐骨神经痛特征:症状、原因与诊断
离婚要结婚证书吗
二婚家庭女性的心灵调适:破茧成蝶之路
2025离婚后再结婚需要什么手续?
高血压的心理压力管理
拉萨“天价氧气”事件引发关注,市场监管局出手整治
拉萨“天价氧气”背后:高原供氧产业的困境与突破
拉萨氧气价格大揭秘:你踩过哪些坑?
椒盐知了:美味与营养的完美结合
一口气吃10只知了 12岁男孩连夜送医抢救!这4类人不宜食用→
《聊斋志异》里的狐仙那些事儿
华北地区的狐仙崇拜:从古代图腾到现代信仰
《聊斋志异》中的狐仙故事:从浪漫传奇到社会批判
九尾狐的多重身份:从祥瑞之兽到文化符号
大年三十连续缺席五年?都是月亮惹的祸!
农历和阳历:你真的了解它们吗?
《原神》3.8版本:钟离带你玩转岩主阵容!
《原神》岩主荒星技能大揭秘!
木棉树:热带亚热带的美丽乔木
木棉树的寓意象征:生命力、坚韧与希望的化身
礼佛的七种方式:从我慢到无相
法门寺参拜攻略:一步一拜,探秘佛祖舍利圣地!
挤进寺庙禅修的年轻人,在出世之地修入世之心
心血管专家:愤怒情绪是心梗隐形杀手!
加班文化下的心梗风险:从预防到突破
吃鱼真的能防心梗吗?真相揭秘!
冬季心梗高发!专家详解家庭自救与预防要点