machine-learning - 加权储层采样测试用例

标签 machine-learning probability cloudera sampling reservoir-sampling

我需要实现加权水库采样。我引用了这篇blog中提到的论文。我想编写测试用例来对我的实现进行单元测试,但对如何计算储层中不同元素的预期概率感到困惑。

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

最佳答案

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

现在您正在进行加权储层采样,以便绘制一个元素。元素出现在结果中的概率是多少?它们正是(weight_of_element/weight_of_all_elements):
概率 = [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. 由于结果是确定性的,我们可以手动获取它(对于小输入)。将预期结果嵌入到测试中。

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

关于machine-learning - 加权储层采样测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28993071/

相关文章:

machine-learning - Caffe框架: A real example of batch size, max_iter、test_iter、epoch

c# - 根据受欢迎程度选择项目 : Avoiding a glorified sort

c# - 用C#以一定概率触发事件

python - 无法使用 Python 连接到 Hive2

hadoop - Windows 10 Hyper-v上的HDP 2.6.5

python - 如何使用 pandas 列和字典有效地构建特征?

python - 如何使用机器学习(Tensorflow)使用新数据集构建图像处理模型?

lua - 使用 torch7 模型测试单个图像

hadoop - Impala最低DDL

c++ - C++ 可以在内部表示而无需舍入的 0 和 1 之间的最大和最小数字是多少?