多分段线性函数拟合方法详解
创作时间:
作者:
@小白创作中心
多分段线性函数拟合方法详解
引用
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的代码无法成功拟合出来,但是用这个包可以成功拟合出多分段线性函数,因此这个包是要比上面的代码更好的。而且这个包可以实现的功能也很多了,这里放个官方可实现的功能目录。
当然这个包不止可以拟合多段线性函数,也可以不是线性函数,比如二次函数等等都可以。
热门推荐
佛手适合什么地方种植?如何选择最佳种植环境?
汽车轮胎如何选择:从种类、尺寸到性能全攻略
强化学习中Q值的概念
中元节烧纸有讲究,怎么烧,什么地点烧,在什么时间烧都有讲究?
广西最好的一本四所大学
保质期?最佳赏味期?保存期 到底哪个期之前食用最好?
民间草药鸡屎藤:从外用到食用的多种用途
工程类资格证书有哪些?一文详解工程类证书种类与含金量
高铁时速之争:速度与安全如何取舍?
泰安不止有泰山 | 探索徂徕山国家森林公园,打卡自然清凉之旅
榴莲哪种品种最好吃?猫山王、金枕还是苏丹王?
一场跨越百年的赛跑:广东科研人员如何攻克香蕉枯萎病
电脑CPU主频越高越好吗?解密CPU主频高低的影响及选择依据
SEO 链接建设:拓展优质外链的有效途径与技巧
碧蓝档案:二次元战术角色扮演与校园养成的创新融合
李艺彤:从SNH48成员到实力派演员的蜕变之路
新能源混合动力与纯电的优劣势对比
癌症复发不是偶然,医生揭示关键因素,四个生活习惯或成幕后推手
朝鲜舞是民族舞蹈吗
暖气管道漏水问题解决指南:从预防到修复的全面策略
VIX的含义及作用是什么?这种作用对市场有哪些影响?
香港签注办理流程和注意事项详解
你真的了解区块链技术和防伪溯源的真实意义吗?
三道特色菜品制作方法:风沙烤全肘、海鲜蜜瓜船、南瓜龙虾烩饭
皱纹都适合激光祛除吗?
张雪峰谈军校和警校:业前景及出路?需要什么条件?
宿州必吃!顺河路的千年味道杀疯了!
榴莲怎么选最划算?老果农透露:专挑“母”的,肉多又香甜!
兰花种植指南(从选择、繁殖到养护,让您轻松打造兰花园)
辽宁省十大特色名小吃,哪些小吃让东北人念念不忘?