用户访问行为,齐普夫分布及其 Java 实现
Zipf定律是文献计量学的重要定律之一,它和罗特卡定律、布拉德福定律一起被并称为文献计量学的三大定律。
对于CDN的内容管理,也近似符合Zipf 定律,就是大家常说对于内容的访问遵循80/20原则,也就是20%的内容,会占有80%的访问量。
这里 r 表示一个单词的出现频率的排名,P(r)表示排名为r的单词的出现频率.
(单词频率分布中 C约等于0.1, a约等于1)
后人将这个分布称为zipf distribution,中文名称为齐普夫分布或Zeta 分布。这是一个离散事件分布,广泛应用于语言学,保险学,网络模拟,以及对稀疏事件的建模中。
它表明在英语单词中,只有极少数的词被经常使用,而绝大多数词很少被使用。实际上,包括汉语在内的许多国家的语言都有这种特点。这个定律后来在很多领域得到了同样的验证,包括网站的访问者数量、城镇的大小和每个国家公司的数量。。这个定理也在很多分布里面得到了验证,比如人们的收入,互联网的网站数量和访问比例,互联网内容和访问比例(其他分布两个常数有所不同,a越大,分布越密集,对于VOD来说某些时候符合双zipf分布)。
比起枯燥的公式,图表更具有说服力,下面是用三百个严格符合zipf 分布的数据点描绘成的图,其中横轴表示排名,纵轴表示访问的频率,分别使用线性坐标和对数坐标表示:
可以看到对数坐标下是一条完美的直线。

在很多网页的用户访问行为中,都是近似于zipf 分布的,例如下表是www.sun.com 在1996 年7月的页面访问情况:
zipf 定律也可以用于其它领域,例如下面的表格的横轴表示城市的人口排名的对数值,而纵轴则是人口数量的对数值。
编程实现:Mathematica,R,还有Java都有相应的API,在这里,主要讨论Java。
在模拟用户的访问请求时,可以近似地使用zipf 定律, Apache Foundation 的commons-math 项目提供了一个Java实现:
在org.apache.commons.math.distribution 包中的类:
ZipfDistributionImpl(int numberOfElements, double exponent)
Create a new Zipf distribution with the given number of elements and exponent.
它提供的方法主要有:
double cumulativeProbability(int x)
概率密度函数:P(X <= x) 的值。
protected int getDomainLowerBound(double p)
Access the domain value lower bound, based on p, used to bracket a PDF root.
protected int getDomainUpperBound(double p)
Access the domain value upper bound, based on p, used to bracket a PDF root.
double getExponent()
取得 exponent 参数.
int getNumberOfElements()
取得元素的个数
double probability(int x)
概率函数 P(X = x) 的值.
参考网页:
- http://www.useit.com/alertbox/zipf.html
- http://economix.blogs.nytimes.com/2010/04/20/a-tale-of-many-cities/
- http://blog.lmtw.com/b/peon/archives/2006/39703.html
- http://en.wikipedia.org/wiki/Zipf’s_law
- http://baike.baidu.com/view/1519158.html?tp=2_01
- http://mathworld.wolfram.com/ZipfDistribution.html
Related posts:




对我的帮助很大,谢谢你的这个网站。看了category之后感觉你是个牛人,再次表示感谢。
过奖了,相互学习吧。