【问题标题】:Sigmoidal curve fit, how to get the value of x when y=0.5Sigmoidal曲线拟合,y=0.5时如何得到x的值
【发布时间】:2016-09-02 00:59:01
【问题描述】:

我想解决下面的函数,这样在拟合之后,我想在y=0.5时得到x的值。

功能:

import numpy as np
from scipy.optimize import curve_fit

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

x_data = [4, 6, 8, 10]
y_data = [0.86, 0.73, 0.53, 0.3]

popt, pcov = curve_fit(sigmoid, x_data, y_data,(28.14,-0.25))

请解释一下您将如何使用 python 执行此操作! 谢谢!

【问题讨论】:

标签: python numpy math scipy mathematical-optimization


【解决方案1】:

当我运行你的代码时,我收到一个警告,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)


要使用非线性优化在y == 0.5 处获得x 的值,您需要定义一个目标函数,它可以是0.5sigmoid(x, b, c) 之差的平方:

def objective(x, b, c):
    return (0.5 - sigmoid(x, b, c)) ** 2

然后,您可以使用scipy.optimize.minimizescipy.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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2020-08-26
    • 2015-04-28
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多