Scipy S型曲线拟合

Joh*_*ner 3 python curve-fitting scipy

我有一些数据点,想找到一个拟合函数,我想一个累积的高斯S型函数就可以拟合,但是我真的不知道如何实现。

这就是我现在所拥有的:

import numpy as np
import pylab
from scipy.optimize
import curve_fit

def sigmoid(x, a, b):
     y = 1 / (1 + np.exp(-b*(x-a)))
     return y

xdata = np.array([400, 600, 800, 1000, 1200, 1400, 1600])
ydata = np.array([0, 0, 0.13, 0.35, 0.75, 0.89, 0.91])

popt, pcov = curve_fit(sigmoid, xdata, ydata)
print(popt)

x = np.linspace(-1, 2000, 50)
y = sigmoid(x, *popt)

pylab.plot(xdata, ydata, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 1.05)
pylab.legend(loc='best')
pylab.show()
Run Code Online (Sandbox Code Playgroud)

但是我收到以下警告:

... / scipy / optimize / minpack.py:779:OptimizeWarning:无法估计参数的协方差category = OptimizeWarning)

有人可以帮忙吗?我也愿意尝试其他任何方式!我只需要一条曲线以任何方式拟合此数据。

Sev*_*eux 6

您可以为参数设置一些合理的界限,例如,

def fsigmoid(x, a, b):
    return 1.0 / (1.0 + np.exp(-a*(x-b)))

popt, pcov = curve_fit(fsigmoid, xdata, ydata, method='dogbox', bounds=([0., 600.],[0.01, 1200.]))
Run Code Online (Sandbox Code Playgroud)

我有输出

[7.27380294e-03 1.07431197e+03]
Run Code Online (Sandbox Code Playgroud)

和曲线看起来像

在此处输入图片说明

删除(400,0)的第一点是无用的。您可以添加它,尽管结果不会有太大变化。

更新

请注意,界限设置为([low_a,low_b],[high_a,high_b]),所以我要求比例尺在[0 ... 0.01]内,位置在[600 ... 1200]以内


0 0*_*0 0 5

您可能已经注意到结果拟合完全不正确。尝试将一些不错的初始参数传递给curve_fit,并使用以下p0参数:

popt, pcov = curve_fit(sigmoid, xdata, ydata, p0=[1000, 0.001])
Run Code Online (Sandbox Code Playgroud)

应该更适合,并且可能也没有警告。

(默认的起始参数是 [1, 1];这与实际参数相差太远,无法获得良好的拟合。)