用(python)Scipy拟合帕累托分布

时间:2010-07-13 23:26:35

标签: python scipy distribution

我有一个我知道有Pareto分布的数据集。有人能指出我如何在Scipy中使用这个数据集吗?我得到了下面的代码来运行,但我不知道什么是返回给我(a,b,c)。此外,在获得a,b,c后,如何使用它们计算方差?

import scipy.stats as ss 
import scipy as sp

a,b,c=ss.pareto.fit(data)

4 个答案:

答案 0 :(得分:4)

要非常小心地遵守电力法则!许多报告的电力法律实际上都符合电力法则。有关所有详细信息,请参阅Clauset et al.(如果您无权访问该期刊,也可在arxiv上查看)。他们在文章中有companion website,现在链接到Python实现。不知道它是否使用Scipy,因为我上次使用它时使用了它们的R实现。

答案 1 :(得分:4)

这是一个快速编写的版本,从Rupert提供的参考页面中获取一些提示。 目前这在scipy和statsmodel中正在进行中,并且要求MLE具有一些固定或冻结的参数,这些参数仅在主干版本中可用。 目前还没有关于参数估计或其他结果统计的标准误差。

'''estimating pareto with 3 parameters (shape, loc, scale) with nested
minimization, MLE inside minimizing Kolmogorov-Smirnov statistic

running some examples looks good
Author: josef-pktd
'''

import numpy as np
from scipy import stats, optimize
#the following adds my frozen fit method to the distributions
#scipy trunk also has a fit method with some parameters fixed.
import scikits.statsmodels.sandbox.stats.distributions_patch

true = (0.5, 10, 1.)   # try different values
shape, loc, scale = true
rvs = stats.pareto.rvs(shape, loc=loc, scale=scale, size=1000)

rvsmin = rvs.min() #for starting value to fmin


def pareto_ks(loc, rvs):
    est = stats.pareto.fit_fr(rvs, 1., frozen=[np.nan, loc, np.nan])
    args = (est[0], loc, est[1])
    return stats.kstest(rvs,'pareto',args)[0]

locest = optimize.fmin(pareto_ks, rvsmin*0.7, (rvs,))
est = stats.pareto.fit_fr(rvs, 1., frozen=[np.nan, locest, np.nan])
args = (est[0], locest[0], est[1])
print 'estimate'
print args
print 'kstest'
print stats.kstest(rvs,'pareto',args)
print 'estimation error', args - np.array(true)

答案 2 :(得分:1)

在将数据传递给 OPENTURNS 中的 build() 函数之前,请确保以这种方式进行转换:

data = [[i] for i in data]

因为 Sample() 函数可能会返回错误。

仅供参考@Tropilio

答案 3 :(得分:0)

假设您的数据格式如下

data = [
    [2.7018013],
    [8.53280352],
    [1.15643882],
    [1.03359467],
    [1.53152735],
    [32.70434285],
    [12.60709624],
    [2.012235],
    [1.06747063],
    [1.41394096],
]

您可以使用OpenTURNS库的ParetoFactory轻松拟合Pareto分布:

import openturns as ot
distribution = factory.build(data)

您当然可以情节

print(distribution)
>>> Pareto(beta = 0.00317985, alpha=0.147365, gamma=1.0283)

或将其打印为PDF

from openturns.viewer import View

pdf_graph = distribution.drawPDF()
pdf_graph.setTitle(str(distribution))
View(pdf_graph, add_legend=False)

enter image description here

more information here