【问题标题】:Test Case for Weighted Reservoir Sampling加权油藏取样测试用例
【发布时间】:2015-05-13 14:57:50
【问题描述】:

我需要实施加权油藏采样。我已经参考了blog 中提到的论文。我想编写测试用例来对我的实现进行单元测试,并且对如何计算不同元素在水库中的预期概率感到困惑。

我认为它应该与 (weight_of_element/weight_of_all_elements) 成比例,但提到的测试用例 here 计算它的方式不同。我该怎么做?

【问题讨论】:

  • 每个元素的预期概率应该相等,对吗?你遇到什么问题?您是否对采样过程感到困惑?
  • @eigenchris 这不是“储层采样”而是“加权储层采样”,因此它应该与元素的权重成比例。但在测试用例中,预期值并不对应。

标签: machine-learning probability cloudera sampling reservoir-sampling


【解决方案1】:

为了编写测试用例,您确实可以估计元素被选中的概率。假设您分配了这样的权重:
weights = [1, 5, 8, 2, 5]

现在您正在进行加权水库采样以绘制 一个 元素。结果中出现元素的概率是多少?它们正好是(weight_of_element/weight_of_all_elements)
prob = [0.048, 0.238, 0.381, 0.095, 0.238]

换句话说,如果你重复绘制一个元素 106 次,你应该有 0.381 * 106 第三个元素的实例,0.048 * 10第一个元素的 6 个实例,依此类推。 大约,当然。

因此,您可以查看第一个元素在 106 次试验中出现的次数百分比。这必须大约是(weight_of_first_element/weight_of_all_elements)。比较这些值,看看它们是否彼此接近。

所以测试用例可能看起来像这样(伪代码):

numTrials = 1000000
histogram = map<int, int>
for i = 1..numTrials:
  element = WeightedReservoir.sample(weights, 1) # draw one element
  histogram[element]++
for i = 1..len(weights):
  real_probability = weights[i] / sum(weights)
  observed_probability = histogram[elements[i]] / numTrials
  assert(abs(real_probability - observed_probability) <= epsilon) # measuring absolute difference, but you can switch to relative difference

请参阅this 线程以了解 Java 中的具体实现。

至于 Cloudera test 你已经指出,它遵循不同的逻辑(我在 Python 包 numpy 测试 numpy.random.choice 中也看到了这一点):

  1. 采样例程本质上是概率性的,即非确定性
  2. 让我们为随机数生成取一个固定的种子值。将此值嵌入到测试用例中。现在它是完全确定性的:多次调用测试用例会产生相同的结果
  3. 由于结果是确定性的,我们可以手动获得它(对于小输入)。将预期结果嵌入到测试中。

如果您无法控制种子值,则此方法不适合您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2014-08-02
    • 1970-01-01
    • 2018-05-19
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多