用于分析重尾分布的Python软件包

本文介绍了powerlawPython软件包,旨在降低使用复杂统计方法拟合幂律分布的难度。该软件包提供易用接口,支持多种分布拟合和分析,适用于天体物理学、语言学等领域。文章详细讲解了软件功能、适用场景及使用示例,包括数据预处理、最优xmin确定和上界的考虑等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:
幂律分布是理论上非常有趣的概率分布,也常用于描述实证数据。近年来,已经开发出了有效的统计方法来拟合幂律分布,但这些技术的适当使用需要显著的编程和统计洞察力。为了大大降低使用好的统计方法来拟合幂律分布的门槛,我们开发了`powerlaw`这个Python软件包。这个软件包提供了基本的命令用于分布的基本拟合和统计分析。值得注意的是,它还通过为用户提供详尽的选项来支持各种用户需求。源代码是公开可用的,并且易于扩展。

引言:
幂律概率分布具有形式`p(x)~x^-α`,由于其“重尾”特性,即分布在右侧尾部仍然包含大量概率,因此在理论上非常有趣。这种重尾特性可能非常极端,以至于分布的标准差可能未定义(对于α<3),甚至平均值(对于α<2)也可能未定义。这些特性造就了一个无尺度系统,其中所有值都预期发生,没有特征大小或尺度。在自然界中,包括天体物理学、语言学和神经科学等领域,都已经发现了幂律分布。然而,将幂律分布准确地拟合到实证数据,以及衡量拟合的好坏,并非易事。此外,给定领域的实证数据可能带有特定领域的考虑因素,这些因素应当被纳入统计分析中。

在近年来,已经开发出了几种评估幂律拟合的统计方法。在这里,我们介绍并描述了`powerlaw`,这是一个用于轻松实现这些方法的Python软件包。`powerlaw`软件包之所以优于以前可用的软件,是因为它的易用性、对各种概率分布及其子类型的全面支持,以及它的可扩展性和可维护性。包含众多分布类型和拟合选项是至关重要的,因为适当地将分布拟合到数据需要考虑数据的多个方面,否则拟合将不准确。代码基础的易于扩展性也允许`powerlaw`的能力未来扩展,特别是用户添加新的理论概率分布进行分析的形式。

在本报告中,我们描述了`powerlaw`的结构和使用。使用`powerlaw`,我们将给出将幂律和其他分布拟合到数据的例子,并在使用此过程时考虑数据的因素和拟合选项提供指导。

图1展示了可视化、拟合和评估重尾分布的基本元素。每个组成部分在后续章节中有更详细的描述。图1和下面的`powerlaw`代码示例中包括了三个示例数据集,分别代表幂律拟合的良好、中等和差的拟合。第一个最佳拟合数据集也许是所有幂律分布中最知名和最稳固的:英语中单词使用的频率。具体使用的数据是赫尔曼·梅尔维尔小说《白鲸》中的单词使用频率。第二个中等拟合的数据集是秀丽隐杆线虫中每个神经元的连接数。最后一个拟合不良的数据是美国1984年至2002年间受停电影响的人数。

图1A展示了三个示例数据集的概率密度函数。图1B展示了分布尾部只有一部分可能遵循幂律。图1C展示了如何将幂律拟合的好坏与其他可能的分布进行比较,这些分布可能同样好或更好地描述数据。`powerlaw`软件包将自动执行所有这些步骤。以下是使用`powerlaw`的基本用法示例,随后是解释。使用受停电影响的人口数据:

```python
import powerlaw
fit = powerlaw.Fit(data)
# 计算幂律拟合的最佳最小值
fit.power_law.alpha 2.273
fit.power_law.sigma 0.167
fit.distribution_compare('power_law', 'exponential') (12.755, 0.152)
```

所有示例的IPython Notebook和原始Python文件包含在支持信息中。

`powerlaw`的设计包括面向对象和函数式元素,这两种方法都可供用户使用。面向对象的方法需要最少的代码行数,并且在这里展示。`powerlaw`软件包围绕两种类型的对象组织:`Fit`和`Distribution`。`Fit`对象是一个围绕数据集的包装器,它创建了一系列拟合到该数据集的`Distribution`对象。`Distribution`对象是对特定分布的最大似然拟合。在上面的例子中,自动创建了一个幂律分布(`power_law`),拟合参数`alpha`和其标准误差`sigma`。用户主要与`Fit`对象交互。

基本方法:
可视化 `powerlaw`软件包支持轻松绘制概率密度函数(PDF)、累积分布函数(CDF;p(X>x))和互补累积分布函数(CCDF;p(X≤x),也称为生存函数)。使用`pdf`、`cdf`和`ccdf`函数进行计算,而绘图命令是`plot_pdf`、`plot_cdf`和`plot_ccdf`。绘图使用matplotlib执行(见下文依赖项),`powerlaw`的命令接受matplotlib关键字参数。图1A可视化了示例数据的PDF。

PDF需要对数据进行分箱,并且在对数轴上展示PDF时,箱子应具有对数间隔(指数增加的宽度)。尽管线性箱子在整个值范围内保持高分辨率,但在分布中观察到大值的概率大大降低,这阻止了对它们发生概率的可靠估计。通过使用对数箱子来补偿这一点,这增加了观察到分布在尾部范围内的值的可能性,并适当地对箱子宽度的增加进行了归一化。对数分箱是`powerlaw`的默认行为,但也可以通过`linear_bins=True`选项指定线性间隔的箱子。图1A展示了选择对数箱子而不是线性箱子可以极大地改善数据分布的可视化。停电数据展示了一个特别严重的例子,其中数据的稀疏性导致单个线性箱子只有很少的数据点,包括空箱子。较大的对数箱子将这些数据的空区域纳入其中,以创建更有用的数据分布行为的可视化。

由于CDF和CCDF不需要考虑分箱问题,因此CCDF通常更受青睐,用于可视化重尾分布。然而,如果概率分布在尾部有峰值,这在PDF中可视化时将更加明显,而不是在CDF或CCDF中。PDF和CDF/CCDF在分布有上界时也表现出不同的行为(见下文确定缩放范围)。单独的Fit对象还包括pdf、plot_pdf及其CDF和CCDF版本的函数。Fit内部的构成Distribution对象的理论PDF、CDF和CCDF也可以绘制。这些对于仅可视化用于拟合分布的数据部分非常有用(见下文)。要将多个图表发送到同一个图形,传递matplotlib轴对象与关键字ax。图2展示了神经元连接数据集及其幂律拟合的CCDF和PDF。请注意,CCDF在α=1处缩放,因此外观较浅。

确定缩放范围 拟合幂律的第一步是确定要拟合数据的部分。重尾分布的有趣特性在于尾部及其属性,因此如果数据的初始小值不遵循幂律分布,用户可以选择忽略它们。问题是从哪个最小值xmin开始幂律的缩放关系。方法[5]通过从数据集中的每个唯一值开始创建幂律拟合,然后选择使数据和拟合之间的Kolmogorov-Smirnov距离D最小化的那个值来找到这个最优的xmin值。如果用户没有提供xmin的值,当Fit对象首次创建时,`powerlaw`会计算最优值。由于幂律在x~0时未定义,所以必须有一些最小值。因此,即使给定的数据集带有特定领域的推理,即数据必须在其整个范围内遵循幂律分布,用户仍然必须指定一个xmin。这可能是一个理论最小值、噪声阈值或在数据中观察到的最小值。图1B展示了分配xmin~1和通过最小化D找到最优xmin之间的拟合差异。以下`powerlaw`示例使用停电数据:

```python
fit = powerlaw.Fit(data)
# 计算幂律拟合的最佳最小值
fit.xmin 230.000
fit.fixed_xmin False
fit.power_law.alpha 2.273
fit.power_law.D 0.061
fit = powerlaw.Fit(data, xmin=1.0)
# 计算幂律拟合的最佳最小值
fit.xmin 1.0
fit.fixed_xmin True
fit.power_law.alpha 1.220
fit.power_law.D 0.376
```

寻找最优xmin的范围也可以限制在一个给定的范围内,作为一个元组或列表给出:

```python
fit = powerlaw.Fit(data, xmin=(250.0, 300.0))
# 计算幂律拟合的最佳最小值
fit.fixed_xmin False
fit.given_xmin (250.000, 300.000)
fit.xmin 272.0
```

在某些领域,也可能期望分布将有一个精确的上界xmax。上限可能是由于理论限制,数据不能超过这个限制(例如,在天体物理学中,速度分布可能有一个光速的上限)。上限也可能是由于有限尺寸缩放,观察到的数据来自一个更大系统的一小部分。观察窗口的有限大小意味着单个数据点不可能大于窗口xmax,尽管更大的系统会有更大的未观察到的数据(例如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值