# 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型數據