将 3D 高斯拟合到数据集



>我有一个数据文件,第一列 x、第二列 y 和第三列 z。我可以通过以下方式调用这些值

x=mat0[:,0]

这不是问题所在。我还可以使用这些数据创建并绘制 3D 高斯,或者(如您在下面的脚本中看到的那样(通过定义函数"twoD_Gauss"。

现在我想将这个函数"twoD_Gauss"拟合到数据集(x,y,z(并打印出振幅西格玛等的值。

这就是我得到的:

from matplotlib import pyplot;
from pylab import genfromtxt;  
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from numpy.random import randn
from scipy import array, newaxis
# Load file into mat0
mat0 = genfromtxt("0005.map");
fig = plt.figure(figsize=(20,10))
############ 3D  ###############
ax = fig.add_subplot(1, 2, 2, projection='3d')
#Load data
mat0 = genfromtxt("0005.map");
# define Gaussian
def twoD_Gauss((x,y),amplitude,x0,y0,sigma_x,sigma_y,offset):
    x0=float(x0)
    y0=float(y0)
    return offset + amplitude*np.exp(-(((x-x0)**(2)/(2*sigma_x**(2))) + ((y-y0)**(2)/(2*sigma_y**(2)))))
#define x and y and z (z not used, x and y shifted)
x = mat0[:,0]-150
y = mat0[:,1]-143
z = mat0[:,2]
#create data
data = twoD_Gauss((x, y), 15, 0, 0, 20, 20, 10)
# plot twoD_Gaussian data generated above
ax = plt.axes(projection='3d')
ax.plot_trisurf(x, y, data, cmap="jet", linewidth=0)
#FITTING HELP!
initial_guess = (24000,0,0,25,25,6000)
params, pcov = opt.curve_fit(twoD_Gauss, (x,y), data,initial_guess)
print(params)
plt.show()

我认为我做对了,但它实际上并不合适。

打印的参数是我在数据中给出的参数。

好的,我自己找到了解决方案:

我的问题是我拟合了数据,但数据已经定义。所以我所做的是,我将数据更改为文件中给出的 z 数据。

data=mat0[:,2]

现在,curve_fit通过 (x,y( 将twoD_Gauss拟合到给定的 z 值。

最新更新