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



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

感谢您的支持!

您可以尝试将 X 的 StandardScalerNormalizer 和 y 的 MinMaxScaler 等比例转换为 Scale。预测 y 后,您可以使用inverse_transform on MinMaxScaler 将其重新调整到您感兴趣的范围。

您必须不断调整maxfev值,这是非常高的数字,因此请根据需要进行调整

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

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

在此处输入链接说明

最新更新