1

我有一些包含三列、xy和的数据b。在这里,b每个值都有关联的x值。(Nb 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

现在说我想优化 f(x,a) 的拟合以a使用scipy.optimise.curve_fit.

我试图这样做:

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正确地调用了该函数。欢迎咨询。

4

1 回答 1

1

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

使用numpy数组的值和b替换似乎可以解决这个问题:math.lognp.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
于 2019-07-03T11:54:21.453 回答