1. 程式人生 > 實用技巧 >利用 Python Fitter 判斷資料樣本符合那種分佈函式

利用 Python Fitter 判斷資料樣本符合那種分佈函式

# Python擬合數據樣本的分佈
# 安裝fitter
# pip install fitter
# 生成一段模擬資料
from scipy import stats
import numpy as np
# N(0,2)+N(0,10)
data1 = list(stats.norm.rvs(loc=0, scale=2, size=70000))
data2 = list(stats.norm.rvs(loc=0, scale=20, size=30000))
data = np.array(data1+data2)

# 利用fitter擬合數據樣本的分佈
from fitter import Fitter
# may take some time since by default, all distributions are tried
# but you call manually provide a smaller set of distributions
f = Fitter(data, distributions=['norm', 't', 'laplace', 'rayleigh'])
f.fit()
f.summary() #返回排序好的分佈擬合質量(擬合效果從好到壞),並繪製資料分佈和Nbest分佈
f.df_errors #返回這些分佈的擬合質量(均方根誤差的和)
f.fitted_param #返回擬合分佈的引數
f.fitted_pdf #使用最適合資料分佈的分佈引數生成的概率密度
print(f.get_best(method='sumsquare_error')) #返回最佳擬合分佈及其引數
f.hist() #繪製組數=bins的標準化直方圖
f.plot_pdf(names=None, Nbest=3, lw=2) #繪製分佈的概率密度函式
print(f.summary())

# 方法詳解
# Fitter方法
# Fitter(data, xmin=None, xmax=None, bins=100, distributions=None, verbose=True, timeout=10)
# 引數:
# data (list) –輸入的樣本資料;
# xmin (float) – 如果為None,則使用資料最小值,否則將忽略小於xmin的資料;
# xmax (float) – 如果為None,則使用資料最大值,否則將忽略大於xmin的資料;
# bins (int) – 累積直方圖的組數,預設=100;
# distributions (list) – 給出要檢視的分佈列表。 如果沒有,則嘗試所有的scipy分佈(80種),常用的分佈distributions=[‘norm’,‘t’,‘laplace’,‘cauchy’, ‘chi2’,’ expon’, ‘exponpow’, ‘gamma’,’ lognorm’, ‘uniform’];
# verbose (bool) –
# timeout – 給定擬合分佈的最長時間,(預設=10s) 如果達到超時,則跳過該分佈。

# Fitter返回
# f.summary() #返回排序好的分佈擬合質量(擬合效果從好到壞),並繪製資料分佈和Nbest分佈
# f.df_errors #返回這些分佈的擬合質量(均方根誤差的和)
# f.fitted_param #返回擬合分佈的引數
# f.fitted_pdf #使用最適合資料分佈的分佈引數生成的概率密度
# f.get_best(method='sumsquare_error') #返回最佳擬合分佈及其引數
# f.hist() #繪製組數=bins的標準化直方圖
# f.plot_pdf(names=None, Nbest=3, lw=2) #繪製分佈的概率密度函式

# from fitter import Fitter
# import numpy as np
#
# arr = np.arange(1, 200)
# np.random.shuffle(arr)  # arr為建立的隨機數
#
# fitter_dis = Fitter(arr)
# fitter_dis.fit()
# distribution_df = fitter_dis.summary()  # 這裡可以得到error最小的Dataframe型資料