【发布时间】:2021-08-25 02:39:10
【问题描述】:
这是一些最小的代码:
from scipy.optimize import curve_fit
xdata = [16.530468600170202, 16.86156794563677, 17.19266729110334, 17.523766636569913,
17.854865982036483, 18.18596532750305, 18.51706467296962, 18.848164018436194, 19.179263363902763,
19.510362709369332]
ydata = [394, 1121, 1173, 1196, 1140, 1196, 1158, 1160, 1046, 416]
#function i'm trying to fit the data to (higher order gaussian function)
def gauss(x, sig, n, c, x_o):
return c*np.exp(-(x-x_o)**n/(2*sig**n))
popt = curve_fit(gauss, xdata, ydata)
#attempt at printing out parameters
print(popt)
当我尝试执行代码时,我收到以下错误消息:
ExCurveFit:9: RuntimeWarning: invalid value encountered in power
return c*np.exp(-(x-x_o)**n/(2*sig**n))
C:\Users\dsneh\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\scipy\optimize\minpack.py:828: OptimizeWarning: Covariance of the parameters could not be estimated
warnings.warn('Covariance of the parameters could not be estimated',
(array([nan, nan, nan, nan]), array([[inf, inf, inf, inf],
[inf, inf, inf, inf],
[inf, inf, inf, inf],
[inf, inf, inf, inf]]))
我已经看到我应该忽略第一个,但也许这是一个问题。第二个更令人担忧,我显然希望参数值更有意义。我尝试添加参数作为猜测([2,3,1000,17] 供参考),但没有帮助。
【问题讨论】:
-
看来优化过程找不到合适的最优值。您是否尝试过使用不同的
methods例如trf并使用bounds限制参数的值? -
我没有。问题是对于某些 n 值的输出很复杂,所以如果可能的话,我想将其限制为 0.4 的倍数。这可以通过暴力破解来实现,从初步的谷歌看来,trf 似乎可以处理“稀疏”问题。这是否意味着我可以调整它来解决问题而无需暴力破解?
-
您可以使用
bounds属性将x_o限制为始终小于最低数据点x。这将防止您的输出变得复杂。但是,bounds不能用于将n限制为仅限整数。问题是您的数据是否可以用这样的x_o来解释。在不知道您的实际数据的情况下,我猜x_o肯定不应该受到限制。我认为使用蛮力n方法你的成功机会应该更高。 -
这是有道理的。谢谢!
标签: python numpy scipy curve-fitting