文章目录
- zipf分布简介
- zipfian和zipf对象
- zipf分布到zeta分布的变化情况
- 分布族谱图
zipf分布简介
美国学者Zipf在研究词频的时候发现,如果将一篇较长文章中的词频按照高低依次排列,将频次最高者的词记为1、次高者记为2,依次类推,最后使用频率最低的词为N。若用f表示频次,r表示等级序号,则fr是常数,此即Zipf定律。
相应地,Zipf分布的概率密度函数为
Zipf ( k ; α , n ) = 1 k α ∑ i n ( 1 i ) α \operatorname{Zipf}(k;\alpha, n)=\frac{1}{k^\alpha\sum_i^n(\frac{1}{i})^\alpha} Zipf(k;α,n)=kα∑in(i1)α1
(简洁起见,求和号中 i i i若未加说明,默认从1开始)
则当 n → ∞ n\to\infty n→∞时,可定义黎曼函数
ζ ( α ) = ∑ 1 ∞ ( 1 i ) α \zeta(\alpha)=\sum_1^\infty(\frac{1}{i})^\alpha ζ(α)=1∑∞(i1)α
从而
lim n → ∞ 1 k α ∑ i n ( 1 i ) α = 1 k α ζ ( α ) \lim_{n\to\infty}\frac{1}{k^\alpha\sum_i^n(\frac{1}{i})^\alpha}=\frac{1}{k^\alpha\zeta(\alpha)} n→∞limkα∑in(i1)α1=kαζ(α)1
此即Zeta分布
Zeta ( k ; α ) = 1 k α ζ ( α ) \operatorname{Zeta}(k;\alpha)=\frac{1}{k^\alpha\zeta(\alpha)} Zeta(k;α)=kαζ(α)1
在Zipf分布中,若令 α = 0 \alpha=0 α=0,则 Zipf ( k ; 0 , n ) = 1 n \operatorname{Zipf}(k;0,n)=\frac{1}{n} Zipf(k;0,n)=n1,这显然是均匀分布的形式,由于 k k k是离散的,所以是离散均匀分布。
zipfian和zipf对象
在scipy.stats
中,提供了zipfian
和zipf
类,虽然名字都是Zipf,但前者是Zipf分布,后者是Zeta分布。
现随便设一组参数,查看一下zipf分布的大致形状。
import numpy as np
from scipy.stats import zipfian
import matplotlib.pyplot as plt
a, n = 1.25, 10
x = np.arange(1, 11)
y = zipfian.pmf(x, a, n)
plt.stem(x, y)
plt.title('zipfian pmf')
plt.show()
效果如下
若令a=0
,则效果为
a, n = 0, 10
x = np.arange(1, 11)
y = zipfian.pmf(x, a, n)
plt.stem(x, y)
plt.title('uniform pmf')
plt.show()
效果如下,的确是变均匀了
zipf分布到zeta分布的变化情况
最后,如果让a
不断变大,可以看下分布的变化情况
import matplotlib.animation as animation
from scipy.stats import zipfx = np.arange(1,9)
yZeta = zipf.pmf(x, 10)fig = plt.figure(figsize=(6,4))
ax = fig.add_subplot(xlim=(1,8))
plt.yscale('log')
plt.grid()
plt.tight_layout()
k_text = ax.text(0.05,0.85,'',transform=ax.transAxes)sZeta, = ax.plot(x, yZeta)
sZipf = ax.plot(x, zipfian.pmf(x, 0, 10))[0]def animate(a):y = zipfian.pmf(x, a, 10)sZipf.set_data(x, y)k_text.set_text(f"a={a}")return [sZipf]ani = animation.FuncAnimation(fig, animate, range(10), interval=250)plt.show()
效果如下
分布族谱图
zipf
分布在下面这张分布族谱图的左上角