我正在寻找为曲线拟合建立一个通用对象,我在其中定义参数名称,值和边界。有时,我想使用传入的数据来帮助使用函数(min,max等)定义边界。
这是对象:
class CurveFitObject(object):
def __init__(self,paramList,growthEquation):
self.paramList = paramList
self.gmod = Model(growthEquation)
def calcCurveFit(data):
for param in self.paramList:
self.gmod.set_param_hint(self.paramList['name'],
value=self.paramList['value'](data),
min=self.paramList['min'](data),
max=self.paramList['max'](data))
这里我尝试使用np.min(数据)作为我的猜测,0.975 * np.min(数据)作为我的下限,1.025 * np.min(数据)作为我的上限。
def growthEquation(self, t, A): return A
keys = ['name','guess','min','max','vary']
logisticGrowth = CurveFitObject(
[dict(zip(keys,['A',np.min,0.975*np.min,1.025*np.min,True])),
growthEquation
)
我收到以下错误:TypeError: unsupported operand type(s) for *: 'float' and 'function'
这是有道理的,因为它试图对函数0.975*np.min
而不是0.975*np.min(data)
进行数学运算。
实施此行为的最佳方法是什么?如果有的话?
答案 0 :(得分:0)
看起来您想要为现有函数创建包装器。例如,您有:
0.975*np.min
但这不起作用,因为它试图将函数乘以float
倍。您可以使用以下方法内联创建新函数:
lambda data: 0.957*np.min(data)
这可能是您正在寻找的。它等同于定义命名函数:
def myfunc(data):
return 0.957*np.min(data)
然后使用myfunc
。不同之处在于lambda
语法创建了一个可以内联定义的匿名函数。