【分布族谱】Zipf分布及其Python可视化

文章介绍了Zipf分布的概念,它在词频统计中的应用,以及如何转化为Zeta分布。通过Python的scipy.stats库展示了Zipfian和Zipf类的使用,并通过动画形式演示了随着参数变化分布形态的演变。

zipf分布简介

zipf
zeta
离散均匀分布

美国学者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)} nlimkα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中,提供了zipfianzipf类,虽然名字都是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 zipf

x = 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分布在下面这张分布族谱图的左上角

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值