【问题标题】:Maximize variance in vector comparison最大化向量比较的方差
【发布时间】:2015-08-06 21:33:46
【问题描述】:

假设我有一组数字:

a <- 1:10

我想从这些数字创建所有非冗余对:

pairs <- t(combn(1:10,2))

然后对于每一对,我检查该对的第一个元素是否大于第二个:

a[pairs[,1]]>a[pairs[,2]]

由于数据集已排序,我为每一对得到FALSE,因为这对的第二个元素总是更大。

我可以重新洗牌原始数据集:

a<-sample(a)

并重做相同的比较:

 a[pairs[,1]]>a[pairs[,2]]

现在我得到了 TRUE 和 FALSE 两种情况。

我的问题是:有没有办法最大化方差:即,对于任何大小变量a,TRUE 和 FALSE 案例的数量相等或大致相等?

【问题讨论】:

    标签: r


    【解决方案1】:

    有趣的问题!

    这是一种算法,可以为您提供所需的 X=(1,2,3...,n) 排列:

    最初取空结果向量 Y 并设置round = 1。对于每一轮做:

    1. 从 X 中取出第一个和最后一个项目
    2. 将这对项目附加到 Y。如果整数是奇数,则先附加较小的一个。如果 round 是偶数,则先追加更大的。
    3. 从 X 中删除所选项目

    重复直到 X 用尽。如果 X 的长度是奇数,那么最后只需将最后一项添加到 Y。

    所以最后 Y = (1,n,n-1,2,3,n-3,..., n/2)。


    这是上述算法的 R 实现:

    这是非随机的,它保证返回相等(如果总数不是偶数,则尽可能相等)所有长度的 True 和 False 情况n &gt; 1

    max_var_sequence = function(n) {
      mid_point = ceiling((n+1)/2)
    
      #initiate the vector
      a1 = rep(mid_point,n)
    
      for(i in 1:(n/2)) {
        even = i %% 2
        a1[i*2 - even] = i
        a1[i*2 - !even] = n + 1 -i
    
      }
      return(a1)
    }
    
    n = 20
    pairs <- t(combn(1:n,2))
    s = max_var_sequence(n)
    x = s[pairs[,1]]>s[pairs[,2]]
    
    table(x)
    

    【讨论】:

      【解决方案2】:

      这样的事情可能会奏效。预计您会收敛到相等数量的 TRUE 和 FALSE。

      pairs <- t(combn(1:10,2))
      
      for (i in 1:nrow(pairs)) {
        if (runif(1) > .5) {
          tmp <- pairs[i,1]
          pairs[i,1] <- pairs[i,2]
          pairs[i,2] <- tmp
        }
      }
      table(pairs[,1] > pairs[,2])
      # FALSE  TRUE
      #    25    20
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 2014-09-13
        • 1970-01-01
        • 2012-10-04
        • 2012-11-16
        相关资源
        最近更新 更多