我正在尝试将逻辑函数拟合到包含非常大的x值(1000' s)和非常小的y值(1e-4)的数据集。如下面的代码所示,如果我执行代码,则解释器返回
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.
如果我将ydata乘以1000,则curve_fit函数成功地适合它。但是我必须将一些拟合值除以1000.有没有办法曲线拟合这些极值而不改变原始值?
import numpy as np
from scipy.optimize import leastsq, curve_fit
import matplotlib.pyplot as plt
def logistic(x, N, A, b, y0):
return N / (1 + A*b**-x) + y0
xdata = np.array([100, 250, 500, 750, 1000, 1250, 1500])
ydata = np.array([0, 1e-6, 6.5e-5, 1.5e-4, 4.2e-4, 5.5e-4, 5.8e-4])
popt, pcov = curve_fit(logistic, xdata, ydata)
x = np.linspace(0, 2500, 50)
y = logistic(x, *popt)
plt.plot(xdata, ydata, 'o', label='data')
plt.plot(x,y, label='fit')
plt.legend(loc='best')
plt.show()
此外,是否可以以逻辑函数的指数形式拟合曲线,例如(https://en.wikipedia.org/wiki/Logistic_function)?
def logistic_e(x, N, b, y0, x0):
return N / (1 + np.exp(-b*(x-x0))) + y0
如果我使用logistic_e,那么无论我如何修改数据集,我总是收到
/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:779: OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning)
感谢您的支持!
答案 0 :(得分:0)
你必须不断调整你的maxfev值,这是非常高的数字,所以调整为适合
popt, pcov = curve_fit(logistic, xdata, ydata, maxfev=1005000)
答案 1 :(得分:0)
您可以尝试将缩放设置转换为StandardScaler
或Normalizer
(对于X)和MinMaxScaler
(对于y)。在预测y之后,您可以使用MinMaxScaler
上的inverse_transform
将其重新调整到您感兴趣的范围内。
答案 2 :(得分:0)
您可以扩展数据,例如,您可以使用Sklearn预处理: