当我运行你的代码时,我得到一个警告,并且popt
与你的初始猜测(28.14, -0.25)
相同。如果您尝试绘制这个,你会看到,它本质上是在y == 1
一条直线,它不适合所有数据得好:
from matplotlib import pyplot as plt
x = np.linspace(4, 10, 1000)
y = sigmoid(x, *popt)
fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.scatter(x_data, y_data, s=50, zorder=20)
ax.plot(x, y, '-k', lw=2)
的问题是,你与初始化对于b
参数为负值。请记住,b
会被取消,因此您实际上正在指数x
乘以正数数字,这会炸掉您的分母。相反,你想用b
一个积极值初始化,但也许对于c
负值(给你你的负斜率):
popt2, pcov2 = curve_fit(sigmoid, x_data, y_data, (-0.5, 0.1))
y2 = sigmoid(x, *popt2)
ax.plot(x, y2, '-r', lw=2)
要得到的值x
在y == 0.5
使用非线性优化您需要定义一个目标函数,它可能是0.5
和sigmoid(x, b, c)
之间的差值的平方:
def objective(x, b, c):
return (0.5 - sigmoid(x, b, c)) ** 2
然后可以使用scipy.optimize.minimize
或scipy.optimize.minimize_scalar
找到x
的目标函数最小值:
from scipy.optimize import minimize_scalar
res = minimize_scalar(objective, bracket=(4, 10), args=tuple(popt2))
ax.annotate("$y = 0.5$", (res.x, 0.5), (30, 30), textcoords='offset points',
arrowprops=dict(facecolor='black', shrink=0.05), fontsize='x-large')
其中'curve_fit'哪里来的? – piRSquared
@piRSquared它是'scipy.optimize.curve_fit'。 –
[心理测量曲线拟合(Scipy)]的自由运行列表的延迟率和猜测率的可能的重复](http://stackoverflow.com/questions/37044905/generation-of-free-running-list-of-lapse - 速率和猜测率换心理-CU) –