我有一个数据文件,其中第一列为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()
我认为我做对了,但实际上不适合。
打印的参数是我在数据中提供的参数。
答案 0 :(得分:0)
好的,我自己找到了解决方法:
我的问题是我适合数据,但数据已定义。所以我要做的是,将数据更改为文件中给定的z数据。
data=mat0[:,2]
现在,curve_fit通过(x,y)将两个D_Gauss拟合到给定的z值。