我想把数据拟合成一个Logistic(Sigmoid)函数,得到无穷大的协方差。我有2个参数,假设我有5个数据点。我的数据在变量xdata
和ydata
中。下面是生成完全相同警告的代码示例:
from scipy.optimize import curve_fit
def sigmoid(x, x0, k):
y = 1 / (1 + np.exp(-k*(x-x0)))
return y
xdata = np.array([ 5., 75., 88., 95., 96.])
ydata = np.array([ 0.04761905, 0.02380952, 0, 0.04761905, 0])
popt, pcov = curve_fit(sigmoid, xdata, ydata)
使pcov
成为
以及以下警告:
OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning)
我看到一个相关的问题导致了相同的问题here,但问题是数据点和参数的数量是相同的,这在我的例子中是不正确的。在
编辑:请注意,上面我已经提到我有数据点,但这只是示例。实际上有60个。下面是一个原始数据图,看看sigmoid函数是否合适:
另一个需要注意的问题scipy.optimize.curve U拟合():它对x和y数据的数据类型非常特别。在
特别是,曲线拟合在float32上失败,而在float64数据上成功是没有道理的。它甚至可以处理int数据。但是如果你觉得它的行为很神秘,试着把你的数据强制到float64。在
看到了吗 Why does scipy.optimize.curve_fit not produce a line of best fit for my points?
考虑到您提供的数据,我想说您得到的协方差矩阵的警告表明sigmoid函数在拟合这些数据方面非常糟糕。在
而且,5分很难做出趋势。。。尤其是如果你第一个点是5,然后一路跳到75。在我看来,这些数据看起来就像噪音。尤其是因为你必须用一个y值为0的点。在
例如,如果你试图拟合一条直线
你会得到两个看似合理的点(第一个和第二个)和一个定义良好的协方差矩阵(没有警告)。在
更新
您还可以在数据上绘制得到的sigmoid函数,以查看结果拟合是否良好。我怀疑它不会,所以你得到了一个定义不清的协方差矩阵。在
一种可能的情况是拟合无法找到合适的参数,从而丢失。我建议您为拟合过程提供一些参数的起始值,以使其接近正确的解。可能是}。在
x_0=800
和{相关问题 更多 >
编程相关推荐