python - 在简单数据上使用边界和初始参数的 Scipy curve_fit 混淆
问题描述
虽然我非常适合其他数据集,但出于某种原因,以下代码不适用于相对简单的一组点。我已经尝试了衰减指数和幂,以及初始参数和界限。我相信这暴露了我更深的误解;我很感激任何建议。
snr = [1e10, 5, 1, .5, .1, .05]
tau = [1, 8, 10, 14, 35, 80]
fig1, ax1 = plt.subplots()
def fit(x, a, b, c): #c: asymptote
#return a * np.exp(b * x) + 1.
return np.power(x,a)*b + c
xlist = np.arange(0,len(snr),1)
p0 = [-1., 1., 1.]
params = curve_fit(fit, xlist, tau, p0)#, bounds=([-np.inf, 0., 0.], [0., np.inf, np.inf]))
a, b, c = params[0]
print(a,b,c)
ax1.plot(xlist, fit(xlist, a, b, c), c='b', label='Fit')
#ax1.plot(snr, tau, zorder=-1, c='k', alpha=.25)
ax1.scatter(snr, tau)
ax1.set_xscale('log')
#ax1.set_xlim(.02, 15)
plt.show()
更新 1:参考图,遵循 Eric M 的代码: 将在下面的帖子中发表评论。
修复更新 1: xlist = np.arange(0.01,10000,1)/1000+0.01
解决方案
这对我有用。有几个问题。包括我的评论。您的 xlist 中还有一个“除以零”错误,所以我通过将 0.01 添加到xlist
并增加点的密度以使曲线变圆来避免这种情况。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
snr = [1e10, 5, 1, .5, .1, .05]
tau = [1, 8, 10, 14, 35, 80]
fig1, ax1 = plt.subplots()
def fit(x, a, b, c):
return np.power(x, a)*b + c
xlist = np.arange(0.01,10000,1)/1000+0.01
xlist = np.append(xlist, 1e10)
p0 = [-10, 10., 1.]
params = curve_fit(fit, snr, tau, p0)
print('Fitting parameters: {}'.format(params[0]))
ax1.plot(xlist, fit(xlist, *params[0]), c='b', label='Fit')
ax1.scatter(snr, tau)
ax1.set_xscale('log')
plt.show()
推荐阅读
- laravel - laravel route - 搜索表单采用默认路径
- php - 在 PHP 中排列数组
- android - 无法使用 Volley 从 covid19india 的 api 为我的 android 应用程序获取 JSON 数据
- javascript - React 道具值未定义
- javascript - 多个websocket服务器?
- google-calendar-api - 从我的应用程序访问公共 Google 日历
- c# - 如何在 Visual Studio 中引用两个程序集?
- javascript - 在 javascript 中使用 Promises 运行代码时出现问题
- jquery - jQuery选择下一个div元素
- machine-learning - Keras 损失在 epoch 结束时的变化