如何找到拟合指数函数的x?

时间:2017-08-18 16:16:19

标签: python numpy machine-learning scipy mathematical-optimization

fp.append(np.polyfit(train_x, train_y, 2))
f.append(np.poly1d(fp))
print(np.poly1d(fp))
threshold = fsolve(f, 50)

上面的代码成功找到y = 50的x值。但是当我尝试为拟合指数函数做同样的事情时,我无法理解如何做到这一点。

def f_exp(x, a, b, c):
    y = a * np.exp(-b * x) + c
    return y
popt, pcov = curve_fit(f_exp, train_x, train_y)
print(popt)
threshold = fsolve(f_exp, 50) fails with  :TypeError: f_exp() missing 3 required positional arguments: 'a', 'b', and 'c'

如果我添加* popt,那么我得到

threshold = fsolve(f_exp(*popt), 50) fails with: TypeError: f_exp() missing 1 required positional argument: 'c'

我认为我需要添加x值,但它是我试图找到的值...无论如何,添加一些值而不是x,会导致另一个错误:

threshold = fsolve(f_exp(1, *popt), 50) fails with: TypeError: 'numpy.float64' object is not callable

1 个答案:

答案 0 :(得分:1)

我猜你需要将带有优化参数的f_exp函数传递给fsolve(即a,b和c args设置为从curve_fit获得的值)。为此,您可以使用functools.partial功能:

popt, pcov = curve_fit(f_exp, train_x, train_y)
print(popt)
import functools
# preparing arguments
kwargs = dict(zip(['a', 'b', 'c'], popt))
optimized_f_exp = functools.partial(f_exp, **kwargs)
threshold = fsolve(optimized_f_exp, 50)

我们在这里所做的基本上是通过将原始函数的optimized_f_expab args部分修复为c来创建新函数popt (这就是为什么它叫 partial )。