May 18 2010

用户访问行为,齐普夫分布及其 Java 实现

Zipf定律是文献计量学的重要定律之一,它和罗特卡定律、布拉德福定律一起被并称为文献计量学的三大定律。

对于CDN的内容管理,也近似符合Zipf 定律,就是大家常说对于内容的访问遵循80/20原则,也就是20%的内容,会占有80%的访问量。

zipf law

zipf law

这里 r 表示一个单词的出现频率的排名,P(r)表示排名为r的单词的出现频率.

(单词频率分布中 C约等于0.1, a约等于1)

后人将这个分布称为zipf distribution,中文名称为齐普夫分布或Zeta 分布。这是一个离散事件分布,广泛应用于语言学,保险学,网络模拟,以及对稀疏事件的建模中。

它表明在英语单词中,只有极少数的词被经常使用,而绝大多数词很少被使用。实际上,包括汉语在内的许多国家的语言都有这种特点。这个定律后来在很多领域得到了同样的验证,包括网站的访问者数量、城镇的大小和每个国家公司的数量。。这个定理也在很多分布里面得到了验证,比如人们的收入,互联网的网站数量和访问比例,互联网内容和访问比例(其他分布两个常数有所不同,a越大,分布越密集,对于VOD来说某些时候符合双zipf分布)。

比起枯燥的公式,图表更具有说服力,下面是用三百个严格符合zipf 分布的数据点描绘成的图,其中横轴表示排名,纵轴表示访问的频率,分别使用线性坐标和对数坐标表示:

zipf distribution

zipf distribution

可以看到对数坐标下是一条完美的直线。

在很多网页的用户访问行为中,都是近似于zipf 分布的,例如下表是www.sun.com 在1996 年7月的页面访问情况:

zipf distribution of sun.com

zipf distribution of sun.com

zipf 定律也可以用于其它领域,例如下面的表格的横轴表示城市的人口排名的对数值,而纵轴则是人口数量的对数值。

population and the zipf distribution

population and the zipf distribution

编程实现:MathematicaR,还有Java都有相应的API,在这里,主要讨论Java。

在模拟用户的访问请求时,可以近似地使用zipf 定律, Apache Foundationcommons-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) 的值.

参考网页:

  1. http://www.useit.com/alertbox/zipf.html
  2. http://economix.blogs.nytimes.com/2010/04/20/a-tale-of-many-cities/
  3. http://blog.lmtw.com/b/peon/archives/2006/39703.html
  4. http://en.wikipedia.org/wiki/Zipf’s_law
  5. http://baike.baidu.com/view/1519158.html?tp=2_01
  6. http://mathworld.wolfram.com/ZipfDistribution.html

Related posts:

  1. Java 的构造方法
  2. Java 的引用传递

Leave a Reply