【问题标题】:How to test if some numbers are uniformly distributed along an interval?如何测试某些数字是否沿间隔均匀分布?
【发布时间】:2017-09-09 09:09:05
【问题描述】:

我正在寻找一种算法(最好使用 c++ 中的库)或一些想法来告诉我某些数字在统计上是否以均匀的方式分布在一个区间中。想象一下我有两个字符串:第一个没有错误,第二个在某些时候有一些错误。我想检查字符串中错误的位置是否具有统计意义。

考虑以下示例。在第一种情况下,错误是均匀分布的,而在第二种情况下,它们都在字符串的末尾,我的算法应该对此发出一些警告。

 error-free string: 0110110101010110101 (3 errors occur at pos:5,12,15 )
 erroneous string : 0110010101000100101

第二个例子:

 error-free string: 0110110101010110101 (3 errors occur at pos:17,18,19 )
 erroneous string : 0110110101010110010

我可以说第一个数据的错误是正常的,但第二个不是。

到目前为止,我最终得出了这个想法:我想将字符串拆分为相等的 bin,假设字符串长度为 100。我选择有 10 个 bin,大小为 10。然后我查看字符串中的错误总数我们可以假设为 10。我希望在每个 bin 中看到 1 个错误。现在我计算从统计上我的观察与我的预期相差多远。有人知道这种方法是否正确吗?如果可行,每个垃圾箱应该有多大。它也应该取决于错误的数量吗?

【问题讨论】:

  • 查找卡方检验。请记住,就其性质而言,统计测试可能会出现误报和误报。
  • 直方图+该直方图上常数的最小二乘拟合怎么样?卡方会告诉您分布有多好,因为它模拟了一个常数。

标签: c++ algorithm statistics distribution


【解决方案1】:

您建议的方法是将字符串拆分为箱,期望看到错误数量或多或少均匀分布在箱中,这种方法对诸如“每十个位置都有一个错误”之类的模式是盲目的。我相信您需要一种更通用的方法来区分错误发生与位置无关的情况与错误发生位置存在某种模式的情况。

换句话说,我认为您实际上是在寻找一种方法来衡量二进制字符串在多大程度上是随机的,或者更准确地说,是无模式的。字符串无模式的最终数学定义是字符串的Kolmogorov complexity,定义为输出字符串的最短程序的长度。遗憾的是,Kolmogorov 复杂度是不可计算的。

计算二进制字符串无模式的一种可行方法是使用Linear Hadamard Spectral Test。可以使用Fast Fourier Transform 及时运行测试O(n logn),其中n 是字符串的长度。但是,在我看来,似乎没有现成的 C++ 测试实现。

假设您愿意为了易于实现而在测试的健壮性上做出一些妥协,您可以使用以下方法:测量字符串的无模式性,只需 gzip 一个文件,其内容是字符串,然后检查压缩比。压缩越差,字符串越无图案。该方法依赖于 gzip 包含 Kolmogorov 复杂性的某些方面的事实。特别是,有些容易检测的模式的存在提高了压缩率。

【讨论】:

  • 也许 Kolmogorov 复杂度是不可计算的,但 Kolmogorov-Smirnov test 是。
  • 如果您想进行 Hadamard 光谱测试,请使用快速沃尔什变换而不是 FFT。 Implementations are available in C++.
  • @pjs,感谢相关 cmets。我根本不知道 Kolmogorov-Smirnov 检验的存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2012-08-02
  • 2016-02-07
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多