Python Scipy优化曲线拟合工作不正常

Python Scipy优化曲线拟合工作不正常,python,optimization,scipy,curve-fitting,Python,Optimization,Scipy,Curve Fitting,我试图将我的数据拟合到4参数物流,我得到了如下图表: 我认为第4~10个数据点的曲线看起来不错,但我不了解第1~3个数据点的情况。我还收到了错误信息 “运行时警告:在电源返回((A-D)/(1.0+((x/C)**B))+D中遇到无效值” 用于绘制图形的代码如下所示: import numpy as np import matplotlib.pyplot as plt from scipy import stats import scipy.optimize as optimization

我试图将我的数据拟合到4参数物流,我得到了如下图表:

我认为第4~10个数据点的曲线看起来不错,但我不了解第1~3个数据点的情况。我还收到了错误信息

“运行时警告:在电源返回((A-D)/(1.0+((x/C)**B))+D中遇到无效值”

用于绘制图形的代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import scipy.optimize as optimization

xdata = np.array([0.00001, 0.000033, 0.0001, 0.00033, 
                  0.001, 0.0033, 0.01, 0.033, 0.1, 0.33])
ydata = np.array([591, 648.5, 714.75, 941, 1226, 1768.25, 
                  2232.25, 2716.25, 3056.25, 3034.5])
ydata2 = np.array([595.5, 711, 898.25, 2215.5, 
                  2791.25, 3115.5, 3351, 3301, 3456.25, 3171.5])
ydata3 = np.array([617, 597.5, 599.25, 680, 683.5, 1152.75, 1554.25, 
                  2221.5, 2821.5, 2719.25])

def fourPL(x, A, B, C, D):
    return ((A-D)/(1.0+((x/C)**B))) + D

params, params_covariance = optimization.curve_fit(fourPL, xdata,     
        ydata)

x_min, x_max = np.amin(xdata), np.amax(xdata)
xs = np.linspace(x_min, x_max, 1000)
plt.scatter(xdata, ydata)
plt.plot(xs, fourPL(xs, *params))
plt.semilogx()
plt.show()
供您参考

  • 当我只使用7个数据点时,曲线拟合得很好
  • 当我从第一个开始以日志形式使用扩展数据时,加上6使数字为正数(扩展数据=np.log10(扩展数据)+6),它在10个数据点上工作得非常好
我不明白发生了什么事。
如有任何建议或意见,将不胜感激。

提前谢谢

如果我们绘制曲线及其数据点,就会清楚发生了什么:

plt.plot(xs, fourPL(xs, *params), '.-')

左侧部分中只有两个点是线性插值的。这是在对数轴上绘制线性间隔数据的问题

对于对数轴上的规则间距,使用而不是
np.linspace

x_min, x_max = np.amin(xdata), np.amax(xdata)
xs = np.logspace(np.log10(x_min), np.log10(x_max), 1000)
plt.scatter(xdata, ydata)
plt.plot(xs, fourPL(xs, *params))
plt.semilogx()
plt.show()

哇,我可没这么想。非常感谢您的帮助。@MrT我不完全了解系统。谢谢你让我知道。