Подгонка кривой к гистограмме в питоне - PullRequest
0 голосов
/ 08 июня 2018

Я создал гистограмму из моего кадра данных панд, и я хотел бы подогнать распределение вероятностей к гистограмме.Я сам попробовал, но кривая недостаточно хороша Histogram & Curve.Мой код до сих пор выглядит следующим образом:

h=sorted(df_distr['Strecke'])
m = df_distr['Strecke'].mean()
std = df_distr['Strecke'].std()
h=sorted(df_distr['Strecke'])
distr=(df_distr['Strecke'])

fig=plt.figure(figsize=(16,9))

# the histogram of the data
binwidth = range(-1,500)
n, bins, patches = plt.hist(h, bins=binwidth, normed=1, facecolor='green', alpha=0.75, histtype='step')
df = pd.DataFrame({'Strecke': bins[:-1]+1, 'Propability': n})

# add a 'best fit' line  
y = mlab.normpdf( bins, m, std)
l = plt.plot(bins, y, 'r--', linewidth=1)

Есть ли какие-либо возможности для лучшего соответствия кривой?Существуют ли другие дистрибутивы, такие как Halfnorm, lognorm или Weibull для работы?

UPDATE Наконец-то я смог найти лучший дистрибутив для своего набора данных.Реализован следующий код:

#the histogram of the data
binwidth = range(-1,500)
n, bins, patches = plt.hist(h, bins=binwidth, normed=1, facecolor='cyan', alpha=0.5, label="Histogram")
xt=plt.xticks()[0]
xmin, xmax = 0,max(xt)
lnspc = np.linspace(xmin,xmax,500)

m,s = stats.norm.fit(h)
pdf_g=stats.norm.pdf(lnspc,m,s)
#plt.plot(lnspc,pdf_g, label="Normal")

ag,bg,cg = stats.gamma.fit(h)  
pdf_gamma = stats.gamma.pdf(lnspc, ag, bg,cg)  
#plt.plot(lnspc, pdf_gamma, label="Gamma")

ab,bb,cb,db = stats.beta.fit(h)  
pdf_beta = stats.beta.pdf(lnspc, ab, bb,cb, db)  
#plt.plot(lnspc, pdf_beta, label="Beta")

gevfit = gev.fit(h)  
pdf_gev = gev.pdf(lnspc, *gevfit)  
plt.plot(lnspc, pdf_gev, label="GEV")

logfit = stats.lognorm.fit(h)  
pdf_lognorm = stats.lognorm.pdf(lnspc, *logfit)  
plt.plot(lnspc, pdf_lognorm, label="LogNormal")

weibfit = stats.weibull_min.fit(h)  
pdf_weib = stats.weibull_min.pdf(lnspc, *weibfit)  
#plt.plot(lnspc, pdf_weib, label="Weibull")

exponweibfit = stats.exponweib.fit(h)  
pdf_exponweib = stats.exponweib.pdf(lnspc, *exponweibfit)  
plt.plot(lnspc, pdf_exponweib, label="Exponential Weibull")

paretofit = stats.pareto.fit(h)
pdf_pareto = stats.pareto.pdf(lnspc, *paretofit)
plt.plot(lnspc, pdf_pareto, label ="Pareto")

plt.legend()


df = pd.DataFrame({'Strecke': bins[:-1]+1, 'Propability': n})
#R²
slope, intercept, r_value_norm, p_value, std_err = stats.linregress(df['Propability'],pdf_g)
#print ("R-squared Normal Distribution:", r_value_norm**2)

slope, intercept, r_value_gamma, p_value, std_err = stats.linregress(df['Propability'],pdf_gamma)
#print ("R-squared Gamma Distribution:", r_value_gamma**2)

slope, intercept, r_value_beta, p_value, std_err = stats.linregress(df['Propability'],pdf_beta)
#print ("R-squared Beta Distribution:", r_value_beta**2)

slope, intercept, r_value_gev, p_value, std_err = stats.linregress(df['Propability'],pdf_gev)
#print ("R-squared GEV Distribution:", r_value_gev**2)

slope, intercept, r_value_lognorm, p_value, std_err = stats.linregress(df['Propability'],pdf_lognorm)
#print ("R-squared LogNormal Distribution:", r_value_lognorm**2)

slope, intercept, r_value_weibull, p_value, std_err = stats.linregress(df['Propability'],pdf_weib)
#print ("R-squared Weibull Distribution:", r_value_weibull**2)

slope, intercept, r_value_exponweibull, p_value, std_err = stats.linregress(df['Propability'],pdf_exponweib)

slope, intercept, r_value_pareto, p_value, std_err = stats.linregress(df['Propability'],pdf_pareto)

В качестве примера я получаю следующие графики:
Final Plot of fitted curves Спасибо за помощь!

...