跳转到主要内容

测试概率分布是否符合幂律的工具箱

项目描述

powerlaw: 用于分析重尾分布的Python包

powerlaw是一个工具箱,它使用在Clauset et al. 2007 <http://arxiv.org/abs/0706.1062>Klaus et al. 2011 <http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0019779>中开发的统计方法来确定概率分布是否符合幂律。学者们请引用如下:

Jeff Alstott, Ed Bullmore, Dietmar Plenz. (2014). powerlaw: a Python package for analysis of heavy-tailed distributions. PLoS ONE 9(1): e85777 <http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0085777>

也可在arXiv:1305.0215 [physics.data-an] <http://arxiv.org/abs/1305.0215>找到

基本用法

对于最简单、典型的用例,这告诉你需要知道的一切。:

import powerlaw
data = array([1.7, 3.2 ...]) # data can be list or numpy array
results = powerlaw.Fit(data)
print(results.power_law.alpha)
print(results.power_law.xmin)
R, p = results.distribution_compare('power_law', 'lognormal')

有关更多解释、理解和图表,请参阅论文,它说明了powerlaw的所有功能。有关数学细节,请参阅Clauset等人在2007年开发的这些方法。

快速链接

展示powerlaw所有功能的论文,包含图表 __

来自手稿的代码示例,作为IPython Notebook __ 注意:由于对数正态拟合的数值精度提高,涉及对数正态的一些结果现在将与手稿不同。

文档 __

此代码是在Python 2.x上开发和测试的,使用的是 Enthought Python Distribution ,之后进行了修改以兼容3.x。Enthought的完整版免费提供给学术使用

安装

powerlaw 存储在 PyPI ,因此安装很简单。在命令行中输入以下命令即可(Linux、Mac或Windows):

easy_install powerlaw

或者,更好:

pip install powerlaw

easy_installpip 只需在您的PATH中,对于Linux或Mac来说这通常是情况。

pip 将自动安装所有依赖项。其他依赖项包括 numpyscipymatplotlib。这些都在Enthought、Anaconda以及大多数其他科学Python环境中。为了拟合截断幂律或伽马分布,还需要 mpmath,它较少见,可以通过以下方式安装:

pip install mpmath

如果 scipy 函数 gammagammaincgammaincc 更新到足够处理负数的数值精度,则将不再需要 mpmath

您还可以从GitHub上的代码构建,尽管这可能是略高于PyPI版本的开发版本。

更新通知和邮件列表

通过加入Google Group 此处 来获取更新通知。

问题/讨论/帮助可在Google Group 此处 上进行。也接收更新信息。

进一步开发

powerlaw 的原始作者Jeff Alstott现在只编写一些小的调整,但 powerlaw 仍然对社区的开发保持开放。如果您想在 powerlaw 中看到某些功能,可以 提交问题 ,但拉取请求更好。欢迎并鼓励提出扩展或纳入其他项目的建议。

致谢

非常感谢Andreas Klaus、Mika Rubinov和Shan Yu的有益讨论。还要感谢 Andreas Klaus Aaron Clauset, Cosma Shalizi Adam Ginsburg 让他们的代码可用。他们的实现是 powerlaw 的一个关键起点。

幂律与对数正态以及powerlaw的 'lognormal_positive' 选项

在将幂律拟合到数据集时,应该将拟合优度与对数正态分布的拟合优度进行比较。对数正态分布https://en.wikipedia.org/wiki/Lognormal_distribution)。这是因为在拟合过程中,对数正态分布是另一种重尾分布,但它们可以通过一个非常简单的过程生成:将随机正变量相乘。因此,对数正态分布与正态分布非常相似,可以通过相加随机变量来创建;事实上,对数正态分布的对数是一个正态分布(因此得名),正态分布的指数是对数正态分布(也许应该称为expnormal)。相比之下,创建幂律通常需要复杂的或异质的生成机制(这可能是你首先寻找幂律的原因;它们很吸引人)。因此,尽管幂律只有一个参数(alpha:斜率)而对数正态分布有两个参数(mu:基础正态分布中随机变量的均值和sigma:基础正态分布的标准差),但我们通常认为对数正态分布是观察数据的一个更简单的解释,只要分布与数据的拟合程度相当。对于大多数数据集,幂律的拟合通常比对数正态分布更差,或者也许同样好,但很少更好。这是论文Clauset等,2007 <http://arxiv.org/abs/0706.1062>的一个主要经验结果,该论文发展了powerlaw实现的统计方法。

然而,对于许多数据集,只有在允许拟合参数mu变为负值的情况下,才能实现优于对数正态分布的拟合。这是否合理取决于你关于生成数据的理论。如果数据被认为是通过相乘随机正变量生成的,那么mu就是分布中位数的对数;负的mu只是表明这些变量的乘积通常小于1。然而,如果数据被认为是通过对正态分布进行指数运算生成的,那么mu被解释为底层正态数据的均值。在这种情况下,底层数据可能是通过相加随机变量(正数和负数)生成的,mu是这些总和的中位数(和均值)。因此,负的mu表明随机变量通常是负数。对于某些物理系统,这是完全可能的。然而,对于你正在研究的数据,这可能是一个奇怪的假设。首先,所有你拟合的数据点在定义上都是正数,因为幂律必须有正数(事实上,powerlaw会丢弃0或负值)。为什么这些数据会通过相加和指数运算负数变量的过程生成呢?

如果你认为你的物理系统可以通过相加和指数运算随机变量来建模,但你认为这些随机变量应该是正数,那么一种可能的解决方案是powerlawlognormal_positive。这只是一个普通的对数正态分布,但mu必须是正数。请注意,这并不强制底层正态分布只能是正变量的总和;它只是强制总和的平均值为正,但这是一个起点。你可以像上面那样以常规方式将幂律与这种分布进行比较:

R, p = results.distribution_compare('power_law', 'lognormal_positive')

你可能发现,必须为mu提供正数的对数正态分布对你的数据的拟合度要差得多,这使得幂律看起来是数据的最佳解释。在得出数据实际上呈幂律分布的结论之前,仔细考虑一个更可能的解释,即数据是由乘以正随机变量生成的,甚至是由相加和指数运算随机变量生成的;任一一种都允许对数正态分布有一个可理解的负值mu

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

此版本没有可用的源分布文件。请参阅生成分布存档的教程。

构建分布

powerlaw-1.5-py3-none-any.whl (25.0 kB 查看哈希值)

上传时间 Python 3