我有一个关于 Python 中简单拟合函数的问题。
我试图在数据集上拟合两个不同的函数,并且两个状态之间的边界也应该是一个拟合参数。
我非常天真地尝试这样的事情:
def FitFunc(x, a, b, c, d, e, border):
if x < border:
return a * x + b
if x > border:
return c * x**2 + d * x + e
但我得到了一个值错误:
系列的真值是不明确的。使用 a.empty()、a.bool()、a.item()、a.any() 或 a.all()
我知道您无法将我的 x 数组与整数值进行比较(甚至没有分配给固定值,这应该由 curve_fit 过程完成)。
我无法找到这个看似简单的问题的解决方案。有人可以帮我解决这个问题吗?
提前致谢!
EDIT: I constructed an example:
For the data with x<5 this is perfectly described by a linear function (y=x-3), For x>5 this is perfectly described by a square function (y=x**2/5-3*x/5). Assume you don't know that x is the perfect 'border', is there a way to let curve_fit find out?
错误消息指出比较数组的值 (x
)与标量值(border
) 是不明确的。你的意思是如果any的值x
小于border
or if all的值x
小于border
?
我怀疑你真正想要的是 numpy 的where
函数,这有点像循环x
并逐点决定使用哪个表达式,而且速度更快:
def FitFunc(x, a, b, c, d, e, border):
out = a * x + b
out[np.where(x > border)] = c * x**2 + d * x + e
return out
我认为这就是您想要的,并且应该根据情况选择适当的功能形式border
.
不过,我要提醒大家的是,这可能不会do你想要什么。也就是说,看起来您打算border
为拟合变量。
在 scipy 中拟合变量optimize
例程(以及大多数“曲线拟合”上下文)需要连续浮点变量. Your border
变量将用作索引的离散整数值x
改变功能形式。拟合算法将首先选择一个值(假设为 5.0),然后对该值进行非常小的更改(假设为 5.0000002)。这不会改变两个功能形式之间的断点所在,并且拟合将决定border
不会改变贴合度。我希望我知道解决这个问题的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)