我需要为任意数量的峰值创建一个函数,以传递给最小二乘拟合例程。对于每一个峰存在于50次返回的函数的函数的额外项,即Python中的动态函数构建
一个术语具有值:f(p, x) = p[0]*50 + p[1]*60*x
:在50,60返回的函数f(p, x) = p[0]*50
两个方面与值三个方面与值在50,60,70返回:f(p, x) = p[0]*50 + p[1]*60*x + p[2]*70*x^2
等
几个幼稚尝试如下所示,
def foo(vals):
fn = lambda p, x: 0
i = 0
for v in vals:
fn = lambda p, x : fn(p, x) + p[i] * v * x**i
i += 1
return fn
# Causes a recursion error (I think)
第二次尝试......
def bar(vals):
terms = []
i = 0
for v in vals:
terms.append(lambda x, p: p[i] * v * x**i)
i += 1
def fn(x, p):
tvals = [t(x, p) for t in terms]
sum = 0
for t in terms:
sum = sum + t(x, p)
return sum
return fn
# Generates the wrong values
我怀疑这是引用一个问题,即Python将参照表声明等,但是这是一个有点复杂解开 - 任何帮助,将不胜感激!
你能提供一个测试用例,显示你期待得到什么(和你在第二种情况中得到什么)? – NPE 2010-12-07 13:17:03
是的,有点难以猜到你想要什么,特别是因为第一次只是覆盖`fn`多... – 2010-12-07 13:22:21
嗯,它似乎在我试图调试时复制代码的第二次尝试时,它不应该返回一个列表,它应该返回该列表的总和......并且我更好地解释了期望的结果 – Brendan 2010-12-07 14:18:22