如何从数据样本中估计 Zipf 截断分布的参数?

机器算法验证 分布 估计 帕累托分布 邮编
2022-03-12 00:33:18

我对 Zipf 的估计参数有疑问。我的情况如下:

我有一个样本集(从生成应该遵循 Zipf 分布的调用的实验中测量)。我必须证明这个生成器确实使用 zipf 分发生成调用。我已经阅读了这个问答如何从一组最高频率计算 Zipf 定律系数?但我得到了不好的结果,因为我使用了截断的分布。例如,如果我将生成过程的“s”值设置为“0.9”,如果我尝试按照报告的 Q&A 中所写的方式估计“s”值,我得到的“s”等于 0.2 ca。我认为这是因为我使用 TRUNCATED 分布(我必须用截断点限制 zipf,它是右截断的)。

如何使用截断的 zipf 分布估计参数?

3个回答

更新:2011 年 4 月 7 日这个答案变得很长,涵盖了手头问题的多个方面。但是,到目前为止,我一直拒绝将其分解为单独的答案。

对于这个例子,我在最底部添加了关于 Pearson 的 $\chi^2$ 性能的讨论。


布鲁斯 M. 希尔 (Bruce M. Hill) 可能撰写了关于在类似 Zipf 的环境中进行估计的“开创性”论文。他在 1970 年代中期就该主题写了几篇论文。但是,“Hill 估计器”(现在称为)本质上依赖于样本的最大阶数统计,因此,根据存在的截断类型,这可能会给您带来一些麻烦。

主要论文是:

BM Hill,一种简单的一般方法来推断分布的尾部Ann。统计。, 1975 年。

如果您的数据确实最初是 Zipf,然后被截断,则可以利用度分布Zipf 图之间的良好对应关系为您带来优势。

具体来说,度数分布只是看到每个整数响应的次数的经验分布,$$ d_i = \frac{\#\{j: X_j = i\}}{n}。$$

如果我们将它与 $i$ 绘制在对数图上,我们将得到一个线性趋势,其斜率对应于比例系数。

另一方面,如果我们绘制Zipf 图,我们将样本从最大到最小排序,然后根据它们的等级绘制值,我们会得到具有不同斜率的不同线性趋势。然而,斜率是相关的。

如果 $\alpha$ 是 Zipf 分布的标度系数,则第一个图中的斜率是 $-\alpha$,第二个图中的斜率是 $-1/(\alpha-1)$。下面是 $\alpha = 2$ 和 $n = 10^6$ 的示例图。左侧窗格是度数分布,红线的斜率为 $-2$。右侧是 Zipf 图,叠加的红线斜率为 $-1/(2-1) = -1$。

来自 Zipf 分布的 iid 样本的度分布(左)和 Zipf(右)图。

因此,如果您的数据已被截断,以至于您看不到大于某个阈值 $\tau$ 的值,但数据是 Zipf 分布的并且 $\tau$ 相当大,那么您可以从度分布一种非常简单的方法是将一条线拟合到对数图并使用相应的系数。

如果您的数据被截断,以至于您看不到值(例如,对大型 Web 数据集进行大量过滤的方式),那么您可以使用 Zipf 图估计对数刻度上的斜率,然后“退出”缩放指数。假设您对 Zipf 图的斜率估计为 $\hat{\beta}$。然后,缩放定律系数的一个简单估计是 $$ \hat{\alpha} = 1 - \frac{1}{\hat{\beta}} 。$$

@csgillespie 最近发表了一篇由密歇根州的 Mark Newman 共同撰写的关于该主题的论文。他似乎在这方面发表了很多类似的文章。下面是另一个以及其他一些可能感兴趣的参考资料。纽曼有时不会在统计上做最明智的事情,所以要小心。

MEJ Newman,幂律、帕累托分布和 Zipf 定律当代物理学46,2005,第 323-351 页。

M. Mitzenmacher,幂律和对数正态分布生成模型简史互联网数学。, 卷。1,没有。2,2003 年,第 226-251 页。

K. Knight,Hill 估计器的简单修改,适用于鲁棒性和减少偏差,2010。


附录

这是 $R$ 中的一个简单模拟,以演示如果您从分布中获取大小为 $10^5$ 的样本(如您在原始问题下方的评论中所述),您可能会期望什么。

> x <- (1:500)^(-0.9)
> p <- x / sum(x)
> y <- sample(length(p), size=100000, repl=TRUE, prob=p)
> tab <- table(y)
> plot( 1:500, tab/sum(tab), log="xy", pch=20, 
        main="'Truncated' Zipf simulation (truncated at i=500)",
        xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)

结果图是

“截断” Zipf 图(在 i=500 处截断)

从图中可以看出,$i \leq 30$(左右)的度数分布的相对误差非常好。您可以进行正式的卡方检验,但这并不严格告诉您数据遵循预先指定的分布。它只会告诉你,你没有证据可以断定他们没有

不过,从实际的角度来看,这样的情节应该是相对引人注目的。


附录 2:让我们考虑一下 Maurizio 在下面的评论中使用的示例。我们假设 $\alpha = 2$ 和 $n = 300\,000$,截断 Zipf 分布的最大值 $x_{\mathrm{max}} = 500$。

我们将通过两种方式计算 Pearson 的 $\chi^2$ 统计量。标准方法是通过统计 $$ X^2 = \sum_{i=1}^{500} \frac{(O_i - E_i)^2}{E_i} $$ 其中 $O_i$ 是观察到的计数样本中的值 $i$ 和 $E_i = n p_i = ni^{-\alpha} / \sum_{j=1}^{500} j^{-\alpha}$。

我们还将计算第二个统计数据,首先将计数放入大小为 40 的 bin 中,如 Maurizio 的电子表格所示(最后一个 bin 仅包含 20 个单独结果值的总和。

让我们从这个分布中抽取 5000 个大小为 $n$ 的单独样本,并使用这两个不同的统计数据计算 $p$ 值。

$p$-values 的直方图如下所示,看起来非常统一。经验 I 类错误率分别为 0.0716(标准、未分箱方法)和 0.0502(分箱方法),与我们选择的 5000 样本大小的目标 0.05 值在统计上均无显着差异。

在此处输入图像描述

这是 $R$ 代码。

# Chi-square testing of the truncated Zipf.

a <- 2
n <- 300000
xmax <- 500

nreps <- 5000

zipf.chisq.test <- function(n, a=0.9, xmax=500, bin.size = 40)
{
  # Make the probability vector
  x <- (1:xmax)^(-a)
  p <- x / sum(x)

  # Do the sampling
  y <- sample(length(p), size=n, repl=TRUE, prob=p)

  # Use tabulate, NOT table!
  tab <- tabulate(y,xmax)

  # unbinned chi-square stat and p-value
  discrepancy <- (tab-n*p)^2/(n*p)
  chi.stat <- sum(discrepancy)
  p.val    <- pchisq(chi.stat, df=xmax-1, lower.tail = FALSE)

  # binned chi-square stat and p-value
  bins <- seq(bin.size,xmax,by=bin.size)
  if( bins[length(bins)] != xmax )
    bins <- c(bins, xmax)

  tab.bin  <- cumsum(tab)[bins]
  tab.bin <- c(tab.bin[1], diff(tab.bin))

  prob.bin <- cumsum(p)[bins] 
  prob.bin <- c(prob.bin[1], diff(prob.bin))

  disc.bin <- (tab.bin - n*prob.bin)^2/(n * prob.bin)
  chi.stat.bin <- sum(disc.bin)
  p.val.bin <- pchisq(chi.stat.bin, df=length(tab.bin)-1, lower.tail = FALSE)

  # Return the binned and unbineed p-values
  c(p.val, p.val.bin, chi.stat, chi.stat.bin)
}

set.seed( .Random.seed[2] )

all <- replicate(nreps, zipf.chisq.test(n, a, xmax))

par(mfrow=c(2,1))
hist( all[1,], breaks=20, col="darkgrey", border="white",
      main="Histogram of unbinned chi-square p-values", xlab="p-value")
hist( all[2,], breaks=20, col="darkgrey", border="white",
      main="Histogram of binned chi-square p-values", xlab="p-value" )

type.one.error <- rowMeans( all[1:2,] < 0.05 )

论文

Clauset,A等人经验数据中的幂律分布2009

包含对如何拟合幂律模型的非常好的描述。相关网页有代码示例。不幸的是,它没有给出截断分布的代码,但它可能会给你一个指针。


顺便说一句,本文讨论了许多“幂律数据集”可以用对数正态或指数分布同样好(在某些情况下更好)建模的事实!

根据用户 cardinal 的详细回答,我对我推测的截断 zipf 分布进行了卡方检验。卡方检验的结果报告在下表中:

在此处输入图像描述

其中StartIntervalEndInterval表示例如调用范围,Observed是生成从 0 到 19 调用的调用者数量,依此类推。卡方检验在到达最后一列之前是好的,它们会增加最终的计算,否则在此之前“部分”卡方值是可以接受的!

对于其他测试,结果是相同的,最后一列(或最后两列)总是增加最终值,我不知道为什么,也不知道是否(以及如何)使用另一个验证测试。

PS:为了完整起见,为了计算预期值(预期),我按照红衣主教的建议这样:

在此处输入图像描述

其中X_i用于计算: x <- (1:n)^-SP_i用于计算p <- x / sum(x),最后E_i(每个 nr 呼叫的预期用户 nr)由下式获得P_i * Total_Caller_Observed

并且在自由度=13 的情况下,卡方优度总是拒绝样本集遵循 Zipf 分布的假设,因为测试统计量(在这种情况下为 64,14)大于卡方表中报告的统计量,“缺点”最后一列。此处报告图形结果: 在此处输入图像描述

虽然截断点设置为 500,但获得的最大值为 294。我认为最终的“分散”是卡方检验失败的原因。

更新!!

我尝试对使用上述答案中报告的 R 代码生成的可能的 zipf 数据样本执行卡方检验。

> x <- (1:500)^(-2)
> p <- x / sum(x)
> y <- sample(length(p), size=300000, repl=TRUE, prob=p)
> tab <- table(y)
> length(tab)
[1] 438
> plot( 1:438, tab/sum(tab), log="xy", pch=20, 
        main="'Truncated' Zipf simulation (truncated at i=500)",
        xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)

相关的情节如下: 在此处输入图像描述

卡方检验结果如下图所示: 在此处输入图像描述

并且卡方检验统计量 (44,57) 对于所选自由度的验证来说太高了。同样在这种情况下,数据的最终“分散”是高卡方值的原因。但是有一个程序可以验证这个 zipf 分布(不管我的“错误”生成器,我想专注于 R 数据样本)???