加权油藏采样试验案例

时间:2015-03-11 17:12:50

标签: machine-learning probability cloudera sampling

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

我认为它应该是(weight_of_element/weight_of_all_elements)的推荐,但是提到的测试用例here以不同的方式计算它。我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

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

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

因此,您可以查看10个 6 试验中第一个元素出现的次数百分比。这必须大约为(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中也看到了这一点):< / p>

  1. 抽样程序本质上是概率性的,即非确定性;
  2. 让我们为随机数生成采用固定的种子值。将此值嵌入测试用例中。现在它是完全确定的:多次调用测试用例会产生相同的结果;
  3. 由于结果是确定性的,我们可以手动获取 (对于小输入)。将预期结果嵌入测试中。
  4. 如果您无法控制种子值,则此方法不适合您。