Machine learning 加权储层采样的测试用例

Machine learning 加权储层采样的测试用例,machine-learning,probability,cloudera,sampling,reservoir-sampling,Machine Learning,Probability,Cloudera,Sampling,Reservoir Sampling,我需要实施加权水库采样。我已参考了本文中提到的文件。我想为我的实现编写单元测试的测试用例,但对于如何计算不同元素在库中的预期概率感到困惑 我认为它应该与(元素的权重/all元素的权重)成比例,但是上面提到的测试用例计算它的方式不同。我应该怎么做?为了编写测试用例,您确实可以估计被选择元素的概率。假设您这样分配了权重: 权重=[1,5,8,2,5] 现在,您正在进行加权储层采样,以便绘制一个元素。元素出现在结果中的概率是多少?它们正是(元素的权重/所有元素的权重): prob=[0.048,0.2

我需要实施加权水库采样。我已参考了本文中提到的文件。我想为我的实现编写单元测试的测试用例,但对于如何计算不同元素在库中的预期概率感到困惑


我认为它应该与
(元素的权重/all元素的权重)
成比例,但是上面提到的测试用例计算它的方式不同。我应该怎么做?

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

现在,您正在进行加权储层采样,以便绘制一个元素。元素出现在结果中的概率是多少?它们正是
(元素的权重/所有元素的权重)

prob=[0.048,0.238,0.381,0.095,0.238]

换句话说,如果重复绘制一个图元106次,则第三个图元的实例数应为0.381*106,第一个图元的实例数应为0.048*106,依此类推当然大约是

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

因此,测试用例可能如下所示(伪代码):

numTrials=1000000
直方图=地图
对于i=1..numTrials:
元素=WeightedReservoir.样本(权重,1)#绘制一个元素
直方图[元素]++
对于i=1..len(重量):
真实概率=权重[i]/和(权重)
观察到的概率=直方图[元素[i]]/numTrials

断言(abs(real_probability-observed_probability)每个元素的预期概率应该相等,对吗?您遇到了什么问题?您对采样过程感到困惑吗?@eignchris这不是“水库采样”,而是“加权水库采样”,所以它应该与元素的权重成比例。但在测试用例中,预期值与此不对应。
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