sigmoidal regression with scipy, numpy, python, etc

后端 未结 4 1586
生来不讨喜
生来不讨喜 2021-01-30 07:15

I have two variables (x and y) that have a somewhat sigmoidal relationship with each other, and I need to find some sort of prediction equation that will enable me to predict th

4条回答
  •  旧时难觅i
    2021-01-30 07:47

    As pointed out by @unutbu above scipy now provides scipy.optimize.curve_fit which possess a less complicated call. If someone wants a quick version of how the same process would look like in those terms I present a minimal example below:

    from scipy.optimize import curve_fit
    
    def sigmoid(x, k, x0):
    
        return 1.0 / (1 + np.exp(-k * (x - x0)))
    
    # Parameters of the true function
    n_samples = 1000
    true_x0 = 15
    true_k = 1.5
    sigma = 0.2
    
    # Build the true function and add some noise
    x = np.linspace(0, 30, num=n_samples)
    y = sigmoid(x, k=true_k, x0=true_x0) 
    y_with_noise = y + sigma * np.random.randn(n_samples)
    
    # Sample the data from the real function (this will be your data)
    some_points = np.random.choice(1000, size=30)  # take 30 data points
    xdata = x[some_points]
    ydata = y_with_noise[some_points]
    
    # Fit the curve
    popt, pcov = curve_fit(sigmoid, xdata, ydata)
    estimated_k, estimated_x0 = popt
    
    # Plot the fitted curve
    y_fitted = sigmoid(x, k=estimated_k, x0=estimated_x0)
    
    # Plot everything for illustration
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(x, y_fitted, '--', label='fitted')
    ax.plot(x, y, '-', label='true')
    ax.plot(xdata, ydata, 'o', label='samples')
    
    ax.legend()
    

    The result of this is shown in the next figure:

提交回复
热议问题