【问题标题】:Binomial Distribution Compression二项分布压缩
【发布时间】:2017-06-11 13:26:50
【问题描述】:

我目前很难为某个问题想出一个快速且低内存的解决方案。我正在尝试使用二项分布来解决。我有一个可以取 5 个值的二项分布,这些值出现的概率是 1/16、4/16、6/16、4/16、1/16。我目前正在使用 4 位数来访问大小为 16 的二项式分布数组,其中包含 5 个值,其出现次数与其概率成正比。有没有办法将数组压缩到 5 大小并且仍然能够快速确定要访问数组中的哪个元素。我考虑使用卡诺图,但是所需的逻辑操作数量减慢了整个过程。是否存在某种压缩或技术来快速实现这一点,因为我希望增加二项分布的大小,由于内存或计算时间的增加,目前这是不可行的。

  binomialCoefficients[16]= {v1, v2, v2, v2, v2, v3, v3, v3, v3, v3, v3, v3, v4, v4, v4, v4, v5};
  for (int i = 0; i < steps; i++) {
     uint random = MWC64X(&seed2);
     currentValue = currentValue * binomialCoefficients[random & 0b1111];
  }

VS

 binomialCompressed[5]={v1,v2,v3,v4,v5};
 for (int i = 0; i < steps; i++) {
    uint random = MWC64X(&seed2);
    bool A = (random & 0b1000) >>3;
    bool B = (random & 0b0100) >>2; 
    bool C = (random & 0b0010) >>1; 
    bool D = (random & 0b0001); 
    uint logicMappedIndex = (A&B&C&D)<<2 + (A&!B|...)<<1 +...;
    currentValue = currentValue * binomialCompressed[logMappedIndex];
}

【问题讨论】:

  • 你能澄清一下你是否总是有 p=1/2 吗?
  • 概率始终为 p=0.5 ,我找到了解决此问题的更好方法,但基于完全不同的分布。我仍然很好奇这个问题是否可以解决。
  • 如果您的输入是均匀分布的,我会考虑进一步压缩。因子 p^N 始终是常数,所以我将其移出。然后我基本上会通过仅使用其垂直轴左侧来进一步压缩帕斯卡三角形,请参阅mathsisfun.com/pascals-triangle.html。因此,您需要的不是 5,而是 3 的数组,其值为 1、4、6,位拆分为 2、8、6。所以剩下的唯一悬而未决的问题是如何将这些位拆分为算法
  • 遗憾的是输入是对数正态分布的。我认为您提出的方法确实适用于均匀分布的问题。感谢您的帮助!

标签: c++ opencl probability logical-operators binomial-coefficients


【解决方案1】:

当您生成一个随机数时,每个位都有 1/2 的概率为 1。 如果您只计算位,它已经为您提供了具有二项式概率的压缩数组中的索引。

 binomialCompressed[5]={v1,v2,v3,v4,v5};
 for (int i = 0; i < steps; i++) {
     uint random = MWC64X(&seed2) & 0b1111; //Get 4 bits only
     uint count = popcount(random);
     currentValue = currentValue * binomialCompressed[count];
 }

【讨论】:

  • 我不知道我是怎么错过的!谢谢!稍作改动,您只需要 4 位,因为 5 位数字的 popcount 将导致索引 0,1,2,3,4,5,而这个大小问题只需要 0,1,2,3,4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
相关资源
最近更新 更多