我有一些x和y数据。绘制它们后,我得到一条类似高斯的线,但是我的如下图所示。我需要使分布适合这些数据,并通过这样做找出最能描述我的数据的方程式(分布的方程式)。稍后将使用该方程式作为模型来对其他数据进行预测。
我已经尝试过多项式和高斯分布(使用scikit Learn),但是它们似乎与数据不匹配(所示图片是通过使用具有scipy.optimize.curve_fit的高斯分布生成的,高斯显示为蓝星)。因此,我想我需要一个具有峰度/偏度参数的分布(如T分布)。为了产生这种分布并将其与我的数据一起绘制(当然会生成所需的方程式),我应该使用哪个软件包?该怎么做?
# Start a figure
-------------------------------------
f4 = plt.figure(4)
# State my data
-------------------------------------
x= np.arange(-13,11,1)
y = np.array([0, 2.59869336, 5.75879688, 8.54358764,
14.25760514,20.39651375, 27.9283261 , 36.9502691 , 48.38957049,
58.82419231, 69.28029367, 75.25587555, 79.01393489, 81.0284778 ,
79.39907802, 77.33067788, 73.25226941, 61.38545922, 53.49487923,
41.49257598, 30.86641951, 22.14502495, 14.37682857, 8.39762302])
# Gaussian curve fitting
---------------------------------------
def _1gaussian(x, amp1,cen1,sigma1):
return amp1*(1/(sigma1*(np.sqrt(2*np.pi))))*(np.exp(-((x-
cen1)**2)/((2*sigma1)**2)))
popt_gauss, pcov_gauss = scipy.optimize.curve_fit(_1gaussian, x, y, p0=
[100, 0, np.std(x)**2])
perr_gauss = np.sqrt(np.diag(pcov_gauss))
# Plot the results
----------------------------------------
plot1 = plt.plot(x,np.multiply(y,100/np.nanmax(y)), '.-',linewidth=2.0,
color='maroon') # This here is done because I need to normalize my data
to 100
plt.plot(x,_1gaussian(x,*popt_gauss),'b*:',label='fit')
plt.xlim(-14,14)
leg1 = plt.legend(['Mean'],prop={'size': 15})
plt.xlabel('Temperature(C)', fontsize = 20)
for legobj in leg1.legendHandles:
legobj.set_linewidth(3.0)
plt.ylabel('Utility score', fontsize = 20)
plt.title('Temperature utility score', fontsize = 15)
我期望的结果是选择与我的数据紧密匹配的分布。