【问题标题】:Fit of two different functions with boarder as fit parameter以边界作为拟合参数的两个不同函数的拟合
【发布时间】:2018-04-25 19:20:50
【问题描述】:

我有一个关于 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

但我得到了一个 ValueError:

Series 的真值是模棱两可的。使用 a.empty()、a.bool()、a.item()、a.any() 或 a.all()

我知道您无法将我的 x 数组与整数值进行比较(甚至没有分配给固定值,这应该由 curve_fit 过程完成)。

我无法为这个看似简单的问题找到解决方案。有人可以帮我解决这个问题吗?

提前致谢!

编辑:我构建了一个示例: 对于 x5,这可以通过平方函数 (y=x**2/5-3*x/5) 完美描述)。假设你不知道 x 是完美的“边界”,有没有办法让 curve_fit 找出来?

【问题讨论】:

    标签: python curve-fitting


    【解决方案1】:

    错误消息表明将数组 (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选择合适的函数形式。

    但是,我要提醒您,它可能不会你想要的。也就是说,您似乎打算将 border 用作合适的变量。

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

    【讨论】:

    • 我的意思是边界,就像一个政权结束而另一个政权开始的地方。如果这导致混乱,我很抱歉。我在原始问题中对其进行了编辑。
    • 好的,我更改了答案以匹配已编辑的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2016-02-12
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多