2014-02-07 156 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