python - 拟合 sigmoid 曲线 (Python)
问题描述
我正在尝试将 sigmoid 曲线和 3 次多项式拟合到我的数据(成本与收入),然后找到拐点/收益递减点。
这是我到目前为止的代码,适合度不是很好。任何建议都会非常有帮助,谢谢!
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def sigmoid(x, a, b):
y = 1 / (1 + np.exp(-b*(x-a)))
return y
xdata = [ 404.91, 731.89, 804.23, 0. , 954.72, 954.72, 954.72, 744.54, 744.54, 498.5 , 355.03,
359.61, 0. , 0. , 0. , 753.77, 1116.02, 557.07, 589.06, 761.86, 722.97, 162.69,
354.47, 474. , 306.83, 538.57, 134.26, 134.26, 134.26, 134.26, 134.26, 652.29, 1296.26,
547.78, 845.22, 872.62, 881.59, 556.23, 500.2 , 569.97, 679.46, 679.46, 623.08, 628.33,
754.88, 2014.12, 1870.43, 1444.69, 826.05, 1071.03, 816.74]
ydata = [ 6986.97, 36591.27, 23702.95, 6380.01, 26873.68, 19398.27,24693.5 , 18435.52, 19066.1 , 8534.14, 8534.14, 8534.14,
2032.07, 567.26, 7544.64, 21051.07, 21051.07, 18592.84,18592.84, 18592.84, 19566.14, 4787.51, 7269.55,
11596.66, 9083.43, 13260.51, 6280.95, 4112.17, 6004.46, 7613.15, 6436.83, 10726.22, 20430.67, 8265.88,
15344.32, 30246.91,29928.96, 12215.02, 7776.27, 9714.94, 16642.3 , 29493.06,15496.04, 15496.04, 15496.04,
33397.61, 33397.61, 33397.61, 22525.93, 22525.93, 48941.98]
#fit 3rd order polynomial
p = np.poly1d(np.polyfit(x, y, 3))
second_deriv = p.deriv(2)
inflection = -second_deriv[0]/second_deriv[1]
print("polynomial inflection point:", inflection)
#fitting a sigmoid curve
popt, pcov = curve_fit(sigmoid, xdata, ydata, method='dogbox', p0=[1000, 0.6])
estimated_k, estimated_x0 = popt
print("sigmoid inflection point:", estimated_x0)
x = np.linspace(0, int(max(xdata)), len(ydata))
y = sigmoid(x, *popt)*max(ydata)
t = np.linspace(0, int(np.max(xdata)), int(np.max(xdata)))
plt.plot(xdata, ydata, 'o', label='data')
plt.plot(p(t), 'b-', label="polynomial")
plt.plot(x,y, label='sigmoid')
plt.legend(loc='best')
plt.show()
解决方案
数据高度分散。根据所选择的拟合标准(最小均方误差,或最小均方相对误差,或最小均方绝对误差等)获得一致的结果是令人怀疑的。同样对于使用迭代方法的常用软件,猜测方便的参数初始值可能是不确定的。
所以,我站在这里不是要回答你的问题,而是要将你的结果与另一种非常不同和不寻常的拟合方法的结果进行比较。此方法不是迭代的,不需要对参数进行初始猜测。有关理论,请参见https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales中的第 37-38 页
推荐阅读
- tensorflow - Pycharm 中的 TensorFlow GPU 版本而不是 CPU 版本
- firebase - 通过“凭据”属性提供给 initializeApp() 的凭据实现未能获取有效的 Google OAuth2
- android - 如何在颤动中仅播放自定义声音以进行通知?
- php - 在 WHERE 子句中使用 MySQL CONCAT_WS 和另一个 WHERE 子句
- ios - 仅在 iOS 设备上提供字体文件的错误“未实现类型:7”
- javascript - 如何加快 Google ReCAPTCHA V3 页面加载速度
- javascript - javascript中if块内的变量和函数范围
- python - 安装库时 Pip 安装速度慢得离谱
- java - 当我尝试从手机上的 Android Studio 运行应用程序时,我的应用程序显示运行时异常
- python - 使用小部件修改 django 模型表单字段