使3D高斯拟合数据集

时间:2018-08-09 14:35:15

标签: python matplotlib 3d scipy data-fitting

我有一个数据文件,其中第一列为x,第二列为y,第三列为z。我可以通过

调用这些值
x=mat0[:,0]

那不是问题。我也可以使用函数“ twoD_Gauss”的定义或使用这些数据或(如您在下面的脚本中看到的)创建和绘制3D高斯。

现在,我想将此函数“ twoD_Gauss”拟合到数据集(x,y,z)并打印出振幅sigma等的值。

这就是我得到的:

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()

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

打印的参数是我在数据中提供的参数。

1 个答案:

答案 0 :(得分:0)

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

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

data=mat0[:,2]

现在,curve_fit通过(x,y)将两个D_Gauss拟合到给定的z值。