如何在python中将最佳概率分布模型拟合到我的数据?

时间:2019-06-16 08:39:47

标签: python-3.x scipy simulation distribution

我大约有20,000行数据,

Id | value
1    30
2    3
3    22
..
n    27

我对我的数据进行了统计,平均值为33.85,中位数为30.99,最小值为2.8,最大值为206,95%置信区间为0.21 ..因此,大多数值在33附近,并且有一些离群值(一点)似乎是一个长尾巴的分布。

我对发行版和python都是陌生的,我尝试使用类装配器https://pypi.org/project/fitter/尝试使用Scipy软件包进行许多发行版,并且loglaplace发行版显示了最低的错误(尽管不是很安静)。

我阅读了该线程中的几乎所有问题,并总结了两种方法(1)拟合分布模型,然后在仿真中绘制随机值(2)计算不同值组的频率,但是该解决方案不会例如,其值大于206。

让我的数据是值(数字),什么是在Python中拟合数据分布的最佳方法,就像在模拟中我需要绘制数字一样。随机数必须与我的数据具有相同的模式。另外,我还需要通过绘制数据和模型曲线来验证模型是否能够很好地呈现数据。

1 个答案:

答案 0 :(得分:0)

一种方法是根据贝叶斯信息准则(称为BIC)选择最佳模型。 OpenTURNS实现了一种自动选择方法(see doc here)。

假设您有一个数组x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],下面是一个简单的示例:

import openturns as ot
# Define x as a Sample object. It is a sample of size 11 and dimension 1
sample = ot.Sample([[xi] for xi in x])

# define distributions you want to test on the sample
tested_distributions = [ot.WeibullMaxFactory(), ot.NormalFactory(), ot.UniformFactory()]

# find the best distribution according to BIC and print its parameters
best_model, best_bic = ot.FittingTest.BestModelBIC(sample, tested_distributions)
print(best_model)
>>> Uniform(a = -0.769231, b = 10.7692)