我有一些包含三列的数据,x
,y
和b
。在此,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
函数,这将起作用。欢迎咨询。
答案 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