我有一个要适合伽玛分布的数据集。我正在尝试在这里找到的方法:http://scipy-lectures.org/intro/scipy/auto_examples/plot_curve_fit.html,但似乎不适用于我的数据。我也尝试过其他方法(Scipy的stats.gamma.fit,来自具有相同名称的软件包的Fitter)。
我的数据可以在这里找到:https://www.filehosting.org/file/details/832322/data.csv。它同时包含x轴和y轴。
这是我当前的代码:
import csv
import numpy as np
import math
import matplotlib.pyplot as plt
from scipy import integrate as scint
from scipy import optimize
def gengamma_fit(x, a, b):
return 2 / (b**(2*a) * math.gamma(a)) * x**(2 * a - 1) * math.exp(-x / b)**2
gen_gamma_fit = np.vectorize(gengamma_fit)
filename = r'data.csv'
x1 = np.zeros(200)
y1 = np.zeros(200)
output1 = np.zeros((200,2))
with open(filename, newline='\n') as file:
data = csv.reader(file, delimiter=',')
i = 0
for row in data:
x1[i] = row[0]
y1[i] = row[1]
output1[i][0] = row[0]
output1[i][1] = float(row[1])
i += 1
# check to see if data is normalized
int1 = scint.simps(y1, x1)
print(int1)
plt.figure(figsize=(15,10))
plt.plot(x1,y1, color="red")
params, params_covariance = optimize.curve_fit(gen_gamma_fit, x1, y1, p0=[2.0, 0.04])
plt.plot(x1, gen_gamma_fit(x1, params[0], params[1]))
plt.show()
plt.close()
当我尝试使用Mathematica进行拟合时,它非常适合我。当我在Python中执行此操作时,我得到了:
(对我来说)很奇怪:当我使用Mathematica提供的参数时,Python不会将其绘制成相同的样子。我使用以下代码行绘制了参数:
plt.plot(x1, gen_gamma_fit(x1, 2.57465, 0.10187))
如您所见,a = 2.57465,b = 0.10187。
我在这里犯了一些明显的错误吗?