如何优化参数取决于独立变量的函数的拟合

时间:2019-07-03 11:43:23

标签: python scipy scipy-optimize

我有一些包含三列的数据,xyb。在此,b具有每个x值的关联值。 (注:x总是增加)

也就是说,数据看起来像这样:

x y b
1 4 7
2 5 8
3 6 9

说此数据适合某些型号y = ax + math.log(b)。我可以通过执行以下操作来计算每个值:

def findB(x):
    for i in range(0, len(xData)):
        if xData[i] >= x:
            return bData[i]

def f(x, a):
    b = findB(x)
    result = a*x + math.log(b)

    return result

现在说我想针对a使用scipy.optimise.curve_fit来优化f(x,a)的拟合度。

我试图这样做:

popt, pcov = scipy.optimize.curve_fit(f, xData, yData)

但是这样做会导致错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是由于curve_fit函数将所有x数据作为一个数组传递而导致if xData[i] >= x:语句变得模棱两可。

我无法解决这个问题。我尝试创建xData和bData的配对列表,并将其传递给curve_fit无济于事。

如果我只是将b硬编码为某个预定值,那么我相信我正确地调用了curve_fit函数,这将起作用。欢迎咨询。

1 个答案:

答案 0 :(得分:1)

在与一些同事讨论中,我认为我们找到了解决方案。

使用numpy数组获取b的值并将math.log替换为np.log似乎可以解决此问题:

def findB(x):
    tempArray = np.zeros(len(x))

    for value in x:
        for i in range(0, len(xData)):
            if xData[i] >= value:
                tempArray[i] = bData[i]

    return tempArray
def f(x, a):
    b = findB(x)
    result = a*x + np.log(b)

    return result