python scipy stats pareto 拟合:是如何工作的

5 投票
3 回答
9909 浏览
提问于 2025-04-17 19:27
(1.3999999999999999, nan, 0.0)

... 帮助文档和在线说明说,函数 scipy.stats.pareto.fit 需要传入要拟合的数据集,另外可以选择性地传入 b(指数)、loc 和 scale。最后的结果会返回一个三元组(指数、loc、scale)。

从同样的分布生成数据,应该能让拟合找到用来生成数据的参数,比如(使用 Python 3 控制台)

$  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,scale 应该是 0.4)在

(1.0, nan, 0.0)

等等。

调用拟合函数时给出的指数总是这个指数

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

显而易见的问题是:我是否完全误解了这个拟合函数的目的,它是否以某种不同的方式使用,还是说它根本就有问题?

补充说明:在有人提到像 Aaron Clauset 的网页上提供的专用函数(http://tuvalu.santafe.edu/~aaronc/powerlaws/)比 scipy.stats 方法更可靠,应该使用这些函数时:这可能是对的,但它们也非常非常非常耗时,对于 10000 个数据点的数据集,正常电脑上可能需要很多很多小时(甚至几天、几周、几年)。

编辑:哦,拟合函数的参数不是分布的指数,而是指数减去 1(但这并没有改变上面的问题)

3 个回答

0

问题在于,当c小于2时,帕累托分布的方差是没有定义的。

6

看起来你必须为 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

5

fit方法是一个非常通用且简单的方法,它会对一个叫做非负似然函数(self.nnlf)进行优化,目的是找到最合适的分布。然而,对于像帕累托分布这样的分布,它的参数可能会导致一些区域变得不明确,这时候这个通用方法就不管用了。

具体来说,当随机变量的值不在分布的有效范围内时,通用的nnlf方法会返回“无穷大”("inf")。而fmin优化器在处理这个目标函数时表现得不好,除非你能非常接近最终的拟合值来猜测起始值。

总的来说,对于那些在概率密度函数(pdf)适用范围内有限制的分布,.fit方法需要使用一个受限的优化器。

撰写回答