带有np.log的SciPy curve_fit立即返回popt = p0,pcov = inf

时间:2015-08-24 19:01:31

标签: python numpy scipy curve-fitting logarithm

我正在尝试使用import cv2 cv2.imshow('', im) cv2.waitKey() cv2.destroyAllWindows() 优化数据集的对数拟合。在对实际数据集进行尝试之前,我编写了在虚拟数据集上运行的代码。

scipy.optimize.curve_fit

当然,def do_fitting(): x = np.linspace(0, 4, 100) y = func(x, 1.1, .4, 5) y2 = y + 0.2 * np.random.normal(size=len(x)) popt, pcov = curve_fit(func, x, y2, p0=np.array([2, 0.5, 1])) plt.figure() plt.plot(x, y, 'bo', label="Clean Data") plt.plot(x, y2, 'ko', label="Fuzzed Data") plt.plot(x, func(x, *popt), 'r-', label="Fitted Curve") plt.legend() plt.show() 依赖于do_fitting(),它会传递给func()。这是问题所在。当我传递包含curve_fit的{​​{1}},即我实际想要适合的函数时,func()声明np.log(初始条件)是最佳解决方案,立即返回无限协方差。

如果我使用非对数curve_fit运行p0,会出现以下情况:

do_fitting()

exponential fit

func()

当我使用对数def func(x, a, b, c): return a * np.exp(x*b) + c 运行popt = [ 0.90894173 0.44279212 5.19928151] pcov = [[ 0.02044817 -0.00471525 -0.02601574] [-0.00471525 0.00109879 0.00592502] [-0.02601574 0.00592502 0.0339901 ]] 时会发生什么:

do_fitting()

logarithmic fit

func()

您会注意到def func(x, a, b, c): return a * np.log(x*b) + c 的对数解决方案等于上面popt = [ 2. 0.5 1. ] pcov = inf 中我popt curve_fit的值p0。这是真的,do_fitting()对于我尝试的pcov的每个值都是无限的。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

问题非常简单 - 由于x数组中的第一个值为0,因此您将记录0,即等于-inf

x = np.linspace(0, 4, 100)
p0 = np.array([2, 0.5, 1])

print(func(x, *p0).min())
# -inf