测试概率分布是否符合幂律的工具箱
项目描述
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_install
或 pip
只需在您的PATH中,对于Linux或Mac来说这通常是情况。
pip
将自动安装所有依赖项。其他依赖项包括 numpy
、scipy
和 matplotlib
。这些都在Enthought、Anaconda以及大多数其他科学Python环境中。为了拟合截断幂律或伽马分布,还需要 mpmath
,它较少见,可以通过以下方式安装:
pip install mpmath
如果 scipy
函数 gamma
、gammainc
和 gammaincc
更新到足够处理负数的数值精度,则将不再需要 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或负值)。为什么这些数据会通过相加和指数运算负数变量的过程生成呢?
如果你认为你的物理系统可以通过相加和指数运算随机变量来建模,但你认为这些随机变量应该是正数,那么一种可能的解决方案是powerlaw
的lognormal_positive
。这只是一个普通的对数正态分布,但mu
必须是正数。请注意,这并不强制底层正态分布只能是正变量的总和;它只是强制总和的平均值为正,但这是一个起点。你可以像上面那样以常规方式将幂律与这种分布进行比较:
R, p = results.distribution_compare('power_law', 'lognormal_positive')
你可能发现,必须为mu
提供正数的对数正态分布对你的数据的拟合度要差得多,这使得幂律看起来是数据的最佳解释。在得出数据实际上呈幂律分布的结论之前,仔细考虑一个更可能的解释,即数据是由乘以正随机变量生成的,甚至是由相加和指数运算随机变量生成的;任一一种都允许对数正态分布有一个可理解的负值mu
。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。