如何使用numpy找到曲线拟合后的50%点

时间:2014-03-09 03:21:23

标签: python numpy curve-fitting

我在python中使用了numpy来使我的数据符合S形曲线。在数据拟合曲线后,如何在曲线的y = 50%点找到X的值

enter code here`import numpy as np
enter code here`import pylab
from scipy.optimize import curve_fit

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

xdata = np.array([0.0,   1.0,  3.0, 4.3, 7.0,   8.0,   8.5, 10.0, 12.0])
ydata = np.array([0.01, 0.02, 0.04, 0.11, 0.43,  0.7, 0.89, 0.95, 0.99])

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

x = np.linspace(-1, 15, 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()

1 个答案:

答案 0 :(得分:0)

您只需要解决为y(x) = 0.50找到的功能。你可以使用root finding tools of scipy中的一个,虽然这些只能求零,所以你需要给你的函数一个偏移量:

def sigmoid(x, x0, k, y0=0):
   y = 1 / (1 + np.exp(-k*(x-x0))) + y0
   return y

然后,只需调用根选择方法:

from scipy.optimize import brentq

a = np.min(xdata)
b = np.max(xdata)
x0, k = popt
y0 = -0.50

solution = brentq(sigmoid, a, b, args=(x0, k, y0))  # = 7.142

除了你的评论:

我上面的代码使用了使用您的代码计算的原始popt。如果使用更新的sigmoid函数(带偏移量)进行曲线拟合,popt还将包含y0的拟合参数。

可能你不想要这个..你想要为y0=0拟合曲线。这可以通过仅使用两个值提供curve_fit的猜测来完成。这样,将使用sigmoid函数的y0的默认值:

popt, pcov = curve_fit(sigmoid, xdata, ydata, p0 = (1,1))

或者,只需声明两个单独的sigmmoid函数,一个具有偏移量,另一个没有偏移量。