python scipy统计pareto-fit:它是如何工作的



。。。帮助和在线文档显示,函数scipy.stats.pareto.fit将要拟合的数据集作为变量,还可以选择b(指数(、loc和scale。结果是三元组(指数、位置、比例(

从相同的分布生成数据应该会导致拟合,找到用于生成数据的参数,例如(使用python 3 colsole(

$  python
Python 3.3.0 (default, Dec 12 2012, 07:43:02) 
[GCC 4.7.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

(在下面的代码行中,省略了python控制台提示">>>"(

dataset=scipy.stats.pareto.rvs(1.5,size=10000)  #generating data
scipy.stats.pareto.fit(dataset)

然而,这会导致

(1.0, nan, 0.0)

(指数1,应为1.5(和

dataset=scipy.stats.pareto.rvs(1.1,size=10000)  #generating data
scipy.stats.pareto.fit(dataset)

中的结果

(1.0, nan, 0.0)

(指数1,应为1.1(和

dataset=scipy.stats.pareto.rvs(4,loc=2.0,scale=0.4,size=10000)    #generating data
scipy.stats.pareto.fit(dataset)

(指数应为4,位置应为2,刻度应为0.4(

(1.0, nan, 0.0)

等等。调用拟合函数时给出另一个指数

scipy.stats.pareto.fit(dataset,1.4)

始终返回该指数

(1.3999999999999999, nan, 0.0)

显而易见的问题是:我是否完全误解了这个拟合函数的目的,它的使用方式是否有所不同,或者它只是被破坏了?

备注:在有人提到像Aaron Clauset的网页上提供的专用功能之前(http://tuvalu.santafe.edu/~aaronc/powerlaws/(比scipy.stats方法更可靠,应该使用:这可能是真的,但它们也非常非常耗时,对于10000点的数据集来说,在普通PC上需要很多小时(可能几天、几周、几年(。

edit:哦:拟合函数的参数不是分布的指数,而是指数减1(但这不会改变上面的问题(

看起来您必须为locscale:提供一个猜测

In [78]: import scipy.stats as stats
In [79]: b, loc, scale = 1.5, 0, 1
In [80]: data = stats.pareto.rvs(b, size=10000)
In [81]: stats.pareto.fit(data, 1, loc=0, scale=1)
Out[81]: (1.5237427002368424, -2.8457847787917788e-05, 1.0000329980475393)

猜测必须非常准确才能成功:

In [82]: stats.pareto.fit(data, 1, loc=0, scale=1.01)
Out[82]: (1.5254113096223709, -0.0015898489208676779, 1.0015943893384001)
In [83]: stats.pareto.fit(data, 1, loc=0, scale=1.05)
Out[83]: (1.5234726749064218, 0.00025804526532994751, 0.99974649559141171)
In [84]: stats.pareto.fit(data, 1, loc=0.05, scale=1.05)
Out[84]: (1.0, 0.050000000000000003, 1.05)

希望问题的上下文能告诉你locscale应该是什么样的猜测。很可能是loc=0scale=1

拟合方法是一种非常通用和简单的方法,它对分布的非负似然函数(self.nnlf(进行优化.fmin。在像pareto这样的分布中,其参数可以创建未定义的区域,通用方法不起作用。

特别是,当随机变量的值不符合分布的有效域时,一般的nnlf方法返回"inf"。"fmin"优化器不能很好地处理这个目标函数,除非你已经猜到了非常接近最终拟合的起始值。

通常,.fit方法需要对pdf的适用范围有限制的分布使用受约束的优化器。

问题还在于没有为c<2.

最新更新