文章目录
- 幂分布
- 帕累托分布
- Zipf分布
power(a) | p ( x ) = a x a − 1 p(x)=ax^{a-1} p(x)=axa−1 | 幂分布 |
pareto(a) | p ( x ) = a m a x a + 1 p(x)=\frac{am^a}{x^{a+1}} p(x)=xa+1ama | 帕累托分布 |
zipf(a) | p ( k ) = k − a ζ ( a ) p(k)=\frac{k^{-a}}{\zeta(a)} p(k)=ζ(a)k−a | 齐普夫分布 |
幂分布
幂分布的形式是非常简单的,其概率密度函数为 p ( x ) = a x a − 1 p(x)=ax^{a-1} p(x)=axa−1,当 a a a取值不同时,其分布可由下列代码绘制
import numpy as np
import matplotlib.pyplot as plt
from numpy.random import power
for a in [0.5, 1, 2]:
xs = power(a, size=20000)
plt.hist(xs, bins=100, alpha=0.5, label=f"a={a}")
plt.legend()
plt.show()
当 a = 1 a=1 a=1时,幂分布的概率分布函数变为 p ( x ) = 1 p(x)=1 p(x)=1,此即均匀分布;当 a < 1 a<1 a<1时,为上图中蓝色部分,表现出明显的长尾特性。
幂律分布表现为一条斜率为幂指数的负数的直线,这一线性关系是判断给定的实例中随机变量是否满足幂律的依据。
统计物理学家习惯于把服从幂律分布的现象称为无标度现象,即,系统中个体的尺度相差悬殊,缺乏一个优选的规模。可以说,凡有生命的地方,有进化,有竞争的地方都会出现不同程度的无标度现象。
在Python中,除了幂分布之外,还提供了另外两种幂分布,记帕累托分布和奇普夫分布。
帕累托分布
帕累托在1906年提出了有关意大利社会财富分配的分配规律,即20%的人口掌握了80%的财富,这个规律后来被发现十分普遍,以至于约瑟夫·朱兰后来将其称为帕累托法则,也被成为八二法则。
帕累托分布正是对这一规则的描述,其概率分布函数为
p ( x ) = ( m x ) a p(x)=(\frac{m}{x})^a p(x)=(xm)a
在Numpy中,pareto
函数仅有参数a
,m
作为尺度参数,可直接乘在分布函数外面。
from numpy.random import pareto
xs = pareto(20, size=20000)
plt.hist(xs, bins=200)
plt.show()
其分布为
Zipf分布
美国学者Zipf在研究词频的时候发现,如果统计一篇较长文章中的词频,并将词频按照高低从前向后依次排列,将频次最高的词记为1、次高的词记为2,依次类推,最后使用频率最低的词为N。若用f表示频次,r表示等级序号,则fr是常数,此即Zipf定律。
相应地,Zipf分布的概率密度函数为 p ( k ) = k − a ζ ( a ) p(k)=\frac{k^{-a}}{\zeta(a)} p(k)=ζ(a)k−a,其中 ζ \zeta ζ具体形式为 ∑ i = 1 n 1 i a \sum^n_{i=1}\frac{1}{i^a} ∑i=1nia1。
但在numpy.random
中,
n
→
∞
n\to\infty
n→∞,此时
ζ
(
a
)
\zeta(a)
ζ(a)记为黎曼函数,而zipf
函数也只剩下了一个参数a
。
from numpy.random import zipf
xs = zipf(3.5, size=20000)
plt.hist(xs, bins=30, range=(0,30))
plt.show()
由于zipf
分布和帕累托分布一样,大部分聚集在分布的某一侧,所以在绘图后将其改为对数坐标,如下图所示。
如果不用对数坐标,直接绘制,那么将是下面这样