让我们使用包含 9 个元素 [0,5,0,1,3,3,1,1,1] 的集合并使其变大但元素频率相同:
> bigarray = [0,5,0,1,3,3,1,1,1] * 200
=> [0, 5, 0, 1, 3, 3, 1, 1, 1, 0, 5, 0, 1, 3, 3, 1, ...
现在 bigarray 的大小是 1800,所以让我们尝试使用它。
抽取 180 个元素的样本(从该集合中随机抽取 180 个元素)
现在计算这个随机子集的发生率
{5=>19, 3=>45, 1=>76, 0=>40}
标准化:
{5=>1.0, 3=>2.3684210526315788, 1=>4.0, 0=>2.1052631578947367}
当然对于不同的随机子集结果会有所不同:
{5=>21, 3=>38, 1=>86, 0=>35}
标准化
{5=>1.0, 3=>1.8095238095238095, 1=>4.095238095238095, 0=>1.6666666666666667}
当然有一些错误 - 这是不可避免的,您需要说明什么是可接受的错误
现在用 50% 的 0 和 50% 的 1 对 bigarray(大小 1000)进行相同的测试
> bigarray = [0,1] * 500
=> [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, ...
包含 100 个元素的样本:
{0=>50, 1=>50}
标准化
{0=>1.0, 1=>1.0}
第二个样本:
{0=>49, 1=>51}
标准化
{0=>1.0, 1=>1.0408163265306123}
看来我们可以很容易地减少我们的子集,Sampling 来了。
尤其是Reservoir Sampling - 如果在您的情况下数据填充为“实时”或设置太大而无法一次处理所有值,这可能非常有用。
编辑
关于评论:
当然,如果你有很大的集合并且某些元素出现在那里非常罕见,那么你可能已经丢失它并且出现将等于 0。
然后你可以使用某种平滑函数(检查additive smoothing)。只需假设每个可能的元素比实际出现的时间多 1 次。
例如,假设我们已经设置:
1000 elements 1
100 elements 2
10 elements 3
1 elements 4
假设我们的子集包含 {1=>100,2=>10,3=>1, 4=>0}
平滑参数 = 0.05,因此我们在每次出现时添加 0.05
{1=>100.05,2=>10.05,3=>1.05, 4=>0.05}
当然,这是假设您知道集合中可能出现的值。