...帮助和在线文档说scipy.stats.pareto.fit函数将变量作为要拟合的数据集的变量,并可选择b(指数),loc,scale。 结果是三元组(指数,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,loc应为2,比例应为0.4)
(1.0, nan, 0.0)
等。 在调用fit函数时给出另一个指数
scipy.stats.pareto.fit(dataset,1.4)
总是返回这个指数
(1.3999999999999999, nan, 0.0)
显而易见的问题是:我是否完全误解了这个拟合函数的用途,是否以某种方式使用它,或者它是否被简单地破坏了?
一句话:在有人提到像Aaron Clauset的网页(http://tuvalu.santafe.edu/~aaronc/powerlaws/)那样的专用函数比scipy.stats方法更可靠之前应该使用它们:这可能是真的,但它们是也非常非常非常耗时,并且对于10000点的数据集,在普通PC上需要花费很多小时(可能是几天,几周,几年)。
编辑:哦:拟合函数的参数不是分布的指数而是指数减1(但这不会改变上述问题)
答案 0 :(得分:4)
拟合方法是一种非常通用且简单的方法,它对分布的非负似然函数(self.nnlf)进行优化.fmin。在像帕累托这样具有可以创建未定义区域的参数的分布中,一般方法不起作用。
特别是,一般的nnlf方法返回" inf"当随机变量的值不适合分布的有效域时。 " fmin"优化器不能很好地发挥这个目标函数,除非你已经猜到起始值非常接近最终拟合。
通常,.fit方法需要使用约束优化器进行分布,其中pdf的适用范围有限制。
答案 1 :(得分:3)
看起来您必须提供loc
和scale
:
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)
希望问题的上下文能够告诉您对loc
和scale
的适当猜测。最有可能的是loc=0
和scale=1
。