scipy 如何在现有直方图上进行威布尔拟合?

lztngnrs  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(177)

我基于我的数据集创建了一个直方图。我想为这个直方图创建一个威布尔拟合。我使用了scipy和stats. weibull函数,但不幸的是,它不起作用。
你知道在这种情况下如何使用统计威布尔吗?
下面是代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

data = 'Figures/Histogram/Histogram.xlsx'
hist= pd.read_excel('Histogram/Histogram.xlsx')

# x= hist['DeltaT_value'] 
x= hist['DeltaT_-250_2017']
X=x[(x>0)]

plt.figure(figsize=(15,4))
plt.hist(X, bins= np.arange (0,1500,25), color='#0504aa', edgecolor ='red', rwidth= 0.8)
plt.ylabel('Number of EL')
plt.xlabel('Delta T (years CE) between EL')
plt.xlim(0, 401)
plt.xticks(np.arange(0,401,25))
plt.yticks(np.arange(0,2.2,1))`

# Weibull 
####

shape, loc, scale = stats.weibull_min.fit(X)
x = np.linspace(stats.weibull_min.ppf(0.01, shape, loc=loc, scale=scale), stats.weibull_min.ppf(0.99, shape, loc=loc, scale=scale), 100)
plt.plot(x, stats.weibull_min.pdf(x, shape, loc=loc, scale=scale), 'r-', lw=5, alpha=0.6, label='weibull')

我试过这个:

shape, loc, scale = stats.weibull_min.fit(X)
x = np.linspace(stats.weibull_min.ppf(0.01, shape, loc=loc, scale=scale), stats.weibull_min.ppf(0.99, shape, loc=loc, scale=scale), 100)
plt.plot(x, stats.weibull_min.pdf(x, shape, loc=loc, scale=scale), 'r-', lw=5, alpha=0.6, label='weibull')

不幸的是,似乎在直方图的顶部创建了另一个图,而不是拟合。

xn1cxnb4

xn1cxnb41#

经过一段时间的努力,我找到了一个解决办法:

shape, loc, scale = stats.weibull_min.fit(X, floc = 0, f0 = 1)
W = np.linspace(stats.weibull_min.ppf(0.001, shape, loc=loc, scale=scale), stats.weibull_min.ppf(0.99, shape, loc=loc, scale=scale), 1000)

p =  stats.weibull_min.pdf(W, shape, scale = scale)

Robert Dodier对我最初的帖子的评论非常有趣,我将尝试看看如何在原始数据集上使用“对数似然函数”,而不是在直方图上拟合。这是我第一次使用对数似然函数。如果有人有什么建议,我很乐意接受。
谢谢。

o2rvlv0m

o2rvlv0m2#

尽管我现在正在考虑对原始数据使用对数似然函数,但我仍然试图拟合得到的直方图的分布。
使用我之前发布的代码,我最终得到了这个(威布尔拟合):

我想伽马拟合会更好...所以我正在测试其他几种拟合。
下面是几个发行版的新代码,我愿意接受任何改进此代码的建议:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

data = 'Figures/Histogram/Histogram.xlsx'
hist= pd.read_excel('Figures/Histogram/Histogram.xlsx')

# x= hist['DeltaT_value'] 
x= hist['DeltaT_-250_2017']
X=x[(x>0)]

plt.figure(figsize=(15,4))
plt.hist(X, bins= np.arange (0,1500,25), color='#0504aa', edgecolor ='red', rwidth= 0.8)
plt.ylabel('Number of event layers')
plt.xlabel('Delta T (years CE) between event layers over the -250 to 2017 yr CE period')
plt.xlim(0, 401)
plt.xticks(np.arange(0,401,25))
plt.yticks(np.arange(0,2.2,1))


# Fit distributions for the histogram
####
# Essai1

# find minimum and maximum of xticks, so we know
# where we should compute theoretical distribution
xt = plt.xticks()[0]  
xmin, xmax = min(xt), max(xt)  
lnspc = np.linspace(xmin, xmax, len(X))

# normal distribution 
m, s = stats.norm.fit(X) # get mean and standard deviation  
pdf_g = stats.norm.pdf(lnspc, m, s) # now get theoretical values in our interval  
plt.plot(lnspc, pdf_g, label="Norm") # plot it

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

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

# exp distrib
ae,be,ce,de = stats.expon.fit(X)  
pdf_beta = stats.expon.pdf(lnspc, ae,be,ce,de)  
plt.plot(lnspc, pdf_expon, label="Exponential")

# Weibull distrib
aw,bw,cw,dw = stats.weibull_min.fit(X)  
pdf_weibull = stats.weibull_min.pdf(lnspc, aw, bw,cw)  
plt.plot(lnspc, pdf_weibull, label="Weibull")

plt.show()

相关问题