在Python中,如何对包含非常大的x值和非常小的y值的数据集执行逻辑回归?

时间:2018-03-09 05:45:27

标签: python logistic-regression

我正在尝试将逻辑函数拟合到包含非常大的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)

感谢您的支持!

3 个答案:

答案 0 :(得分:0)

你必须不断调整你的maxfev值,这是非常高的数字,所以调整为适合

popt, pcov = curve_fit(logistic, xdata, ydata, maxfev=1005000)

答案 1 :(得分:0)

您可以尝试将缩放设置转换为StandardScalerNormalizer(对于X)和MinMaxScaler(对于y)。在预测y之后,您可以使用MinMaxScaler上的inverse_transform将其重新调整到您感兴趣的范围内。

答案 2 :(得分:0)

您可以扩展数据,例如,您可以使用Sklearn预处理:

enter link description here