我正在努力使我的数据符合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()
供您参考
xdata
并添加6以使数字为正(xdata_log = np.log10(xdata)+6)
时,它与10个数据点完美配合。 我不明白发生了什么 任何建议或意见将不胜感激 提前致谢。
答案 0 :(得分:2)
如果我们绘制曲线及其数据点,就会发现发生了什么:
plt.plot(xs, fourPL(xs, *params), '.-')
左侧部分只有两个点,它们是线性插值的。这是在对数轴上绘制线性间隔数据的问题。
使用np.logspace
代替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()