我正在尝试使用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()
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()
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
的每个值都是无限的。
我在这里做错了什么?
答案 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