Python 以boarder为拟合参数的两个不同函数的拟合

Python 以boarder为拟合参数的两个不同函数的拟合,python,curve-fitting,Python,Curve Fitting,我有一个关于Python中的简单fit函数的问题。 我试图在一个数据集上拟合两个不同的函数,两个区域之间的边界也应该是一个拟合参数。 我很天真地尝试着这样的事情: 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 def FitFunc(x、a、b、c、d、e

我有一个关于Python中的简单fit函数的问题。 我试图在一个数据集上拟合两个不同的函数,两个区域之间的边界也应该是一个拟合参数。 我很天真地尝试着这样的事情:

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
def FitFunc(x、a、b、c、d、e、border):
如果x<边框:
返回a*x+b
如果x>边框:
返回c*x**2+d*x+e
但我有一个错误:

级数的真值是模糊的。使用a.empty()、a.bool()、a.item()、a.any()或a.all()

我知道您不能将我的x数组与整数值进行比较(整数值甚至没有指定为固定值,这应该通过曲线拟合过程完成)

我没能找到解决这个被认为是简单问题的办法。有人能帮我解决这个问题吗

提前谢谢

编辑:我构建了一个示例:
对于具有x5的数据,这可以用平方函数(y=x**2/5-3*x/5)完美地描述。假设您不知道x是完美的“边界”,有没有办法让曲线拟合找到答案?

错误消息是,将数组(
x
)的值与标量值(
border
)进行比较是不明确的。您的意思是如果
x
的任何值小于
border
还是
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
成为一个拟合变量


scipy
optimize
例程(以及大多数“曲线拟合”上下文)中的拟合变量需要是连续浮点变量。您的
border
变量将用作
x
索引的离散整数值,以更改函数形式。拟合算法将首先选择一个值(假设为5.0),然后对该值进行非常小的更改(假设为5.0000002)。这不会改变两个函数形式之间断点的位置,拟合将决定
border
不会改变拟合。我希望我知道一个解决办法。

我指的是边界,就像一个政权结束,另一个政权开始的地方。如果这导致了混乱,我很抱歉。我在原始问题中编辑了它。好的,我修改了答案以匹配编辑的问题。