快速计算数字集的均匀性或差异的方法

时间:2010-11-23 18:31:17

标签: algorithm math statistics uniform

您好 假设我有一组数字,我想快速计算一些均匀度。 我知道方差是最明显的答案,但我担心天真算法的复杂性太高 有人有什么建议吗?

2 个答案:

答案 0 :(得分:6)

用于计算方差的“直观”算法通常会遇到以下一种或两种情况:

  1. 使用两个循环(一个用于计算平均值,另一个用于方差)
  2. 不是numerically stable
  3. 一个好的算法,只有一个循环且数值稳定是由于D. Knuth(一如既往)。

    From Wikipedia

    n = 0
    mean = 0
    M2 = 0
     def calculate_online_variance(x):
        n = n + 1
        delta = x - mean
        mean = mean + delta/n
        M2 = M2 + delta*(x - mean)  # This expression uses the new value of mean
    
        variance_n = M2/n
        variance = M2/(n - 1) #note on the first pass with n=1 this will fail (should return Inf)
        return variance
    

    您应该为每个点调用calculate_online_variance(x),并返回到目前为止计算的方差。

答案 1 :(得分:2)

我不明白为什么计算方差应该是一个问题。由于方差只是距平均值的距离的平方和除以元素的数量之和,所以基本伪代码将是

  1. 计算mu,集合的平均值
  2. 设s = 0
  3. 对于列表中的每个元素x,令s = s +(x-mu)*(x-mu)
  4. 计算s / n
  5. 请注意,有时最好将s除以n-1(特别是,当您担心有偏差的估算时)。有关原因,请参阅the Wikipedia article on Bessel's correction

    当然,较低的方差表明高均匀性。

    请注意,将方差进一步除以mu ^ 2以得到均匀性的绝对度量(也就是说,“。5 1.5 1 .5 1”被认为不如“100 101 100 101 100 101”,因为前者的相对差异比后者大得多。