Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';t SciPy';s曲线拟合找到这个高阶高斯函数的协方差/给我感官参数?_Python_Numpy_Scipy_Curve Fitting - Fatal编程技术网

Python 为什么可以';t SciPy';s曲线拟合找到这个高阶高斯函数的协方差/给我感官参数?

Python 为什么可以';t SciPy';s曲线拟合找到这个高阶高斯函数的协方差/给我感官参数?,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,下面是一些最基本的代码: 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.5103627093

下面是一些最基本的代码:

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,31000,17]),但没有帮助。

我相信您遇到了这个问题,因为
curve\u fit
也在测试
n
的非整数值,在这种情况下,
gauss
函数在
x0
时返回复杂值,您可以安全地设置
c>0
(也就是说,如果您的所有数据看起来都像问题中包含的最小数据)

以下是我所做的:

p0=[11200,18]#sig,c,x#o的初始猜测
sig,c,x#o的界=([0.01100,10],[10002500200])#(上、下)界
min_err=np.inf#最小化以找到n的最佳值的错误
对于范围(0,41,2)内的n:#n=0,2,4,6,…,40
def高斯(x,sig,c,x_o,n=n):
返回c*np.exp(-(x-x_o)**n/(2*sig**n))
popt,pcov=曲线拟合(高斯,扩展数据,ydata,p0=p0,界限=界限)
err=np.sqrt(np.diag(pcov)).sum()
如果错误<最小错误:
min_err,best_n,best_popt,best_pcov=err,n,popt,pcov
打印(最小错误、最佳值、最佳值、最佳值、最佳值、sep='\n')
将matplotlib.pyplot作为plt导入
plt.绘图(扩展数据、ydata)
plt.plot(扩展数据,高斯(扩展数据,*best\u popt,n=best\u n))
plt.show()
我得到了
best\u n=10
best\u popt=[1.381173.5218.02]

下面是结果图:(蓝线是数据,橙线是高斯拟合)


优化过程似乎找不到合适的最佳方案。您是否尝试过使用不同的
方法
,例如
trf
,并使用
边界限制参数值
?我没有。问题是,对于某些n值,输出是复杂的,所以如果可能的话,我想将其限制为.4的倍数。这是可能的暴力迫使,从初步谷歌看来,扶轮基金会似乎可以处理“稀疏”的问题。这是否意味着我可以在不使用暴力强制的情况下对其进行调整以解决问题?您可以使用
bounds
属性将
x_o
限制为始终小于最低数据点
x
。这将防止输出变得复杂。但是,
bounds
不能用于将
n
仅限制为整数。问题是你的数据是否可以用这样的
xuo
来解释。在不知道您的实际数据的情况下,我猜
xuo
肯定不应该受到限制。我认为使用暴力
n
方法,你成功的几率应该更高。这是有道理的。谢谢我明白了,谢谢!我不知何故忽略了这样一个事实,即输出有时是复杂的。