2014-02-07 32 views
5

我有一個示例數據,我想獲得最適合的分佈。我有幾個鏈接,表明我可以從scipy.stats導入發行版,但之後我沒有意識到數據類型。我想要在MATLAB中找到類似於allfitdist()的東西,它會嘗試將數據擬合到20個分佈,並返回最合適的結果。將數據擬合到所有可能的分佈並返回最佳擬合

鏈接allfitdist()http://www.mathworks.in/matlabcentral/fileexchange/34943-fit-all-valid-parametric-probability-distributions-to-data

任何幫助是非常可觀的。謝謝。

+0

你能展示你的數據是什麼樣子的,以及你試圖將一個發佈版本適合數據嗎?只是想知道你在實施它有多遠,以及它在哪裏失敗。 – usethedeathstar

+0

樣本數據由用戶給出,並且在所有情況下都不會相同。我將上傳樣本數據的直方圖圖像。我嘗試將數據擬合成正態分佈並繪製曲線以查看它是否遵循樣本數據的趨勢,但我沒有成功,因爲我在曲線中獲得曲線。下面顯示了我使用的代碼部分。另一個主要疑問是,在繪製正態分佈曲線之後,我怎麼知道它是最合適的?使用的代碼:plt.plot(da,stats.norm.pdf(da,* stats.norm.fit(datas1,scale = 02,loc = 0)))plt.hist(datas1,1000,color ='b', ec ='b',fc ='b') – mvsrs

回答

9

您可以在scipy中創建所有可用發行版的列表。有兩個分佈和隨機數據的例子:

import numpy as np 
import scipy.stats as st 


data = np.random.random(10000) 
distributions = [st.laplace, st.norm] 
mles = [] 

for distribution in distributions: 
    pars = distribution.fit(data) 
    mle = distribution.nnlf(pars, data) 
    mles.append(mle) 

results = [(distribution.name, mle) for distribution, mle in zip(distributions, mles)] 
best_fit = sorted(zip(distributions, mles), key=lambda d: d[1])[0] 
print 'Best fit reached using {}, MLE value: {}'.format(best_fit[0].name, best_fit[1]) 
+0

感謝martin的幫助。我對python和scipy很陌生,所以請忍受我的無知。我通過更改隨機數據= np.random.normal(loc = 0.0,scale = 1.0,size = 500)來運行這段代碼,但是,我得到了這個錯誤 - > importerror:沒有名爲stats的模塊。 我已經安裝了scipy。我必須做其他事情才能使此代碼正常工作嗎? – mvsrs

+0

從0.7版本(2009)開始,scipy中存在scipy.stats。你能檢查你有哪些版本的scipy,以及如果你導入scipy.stats?嘗試:'導入scipy 打印scipy .__ version__' – Martin

+0

我重新安裝scipy,它的工作。我安裝的版本是0.11。謝謝! – mvsrs