Python scipy: 对于 ** 或 pow() 不支持的操作数类型:'list' 和 'list
我需要把一个函数拟合到一组数据上,并找出这个函数的最佳系数。我使用的是来自scipy库的curve_fit方法。这个方法是基于最小二乘法的。
import numpy as np
from scipy.optimize import curve_fit
#This is my function from which i need to get optimal coefficients 'a' and 'b'
def func(x, a, b):
return a*x**(b*x)
#the arrays of input data
x = [1,2,3,4,5]
y =[6,7,8,9,10]
#default (guess) coefficients
p0 = [1, 1]
popt, pcov = curve_fit(func, x, y, p0)
print popt
但是它返回了以下错误信息:
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'list'
不过,当我使用另一个更简单的函数,没有幂运算时,它就能正常工作。
def func(x, a, b):
return a*x + b
这可能是因为它试图对整个输入数据数组进行幂运算。
我该怎么办?请帮帮我...
1 个回答
15
看起来你想要的是逐个元素进行幂运算吧?
比如说对每个 i 来说,像这样 a*x[i]**(b*x[i])
?
如果是这样的话,你需要使用 np.power
这个函数:
def func(x,a,b):
return a*np.power(x,b*x)
这样就可以正常工作了。
顺便提一下,把 x
和 y
从列表转换成 numpy 数组可能会更好,方法是用 np.array(x)
。