5

如何将少量数据以随机顺序分布在大量数据中?

例如,我有几千行“真实”数据,我想在整个“真实”数据中以随机顺序插入十几或两行控制数据。

现在我不是要问如何使用随机数生成器,而是要问一个统计问题,我知道如何生成随机数,但我的问题是如何确保在同时相当均匀地分散在文件中。

如果我只依赖生成随机数,那么我的所有控制数据,或者至少是其中的一部分,都有可能(尽管非常小)被插入到一个相当狭窄的“真实”数据选择中。阻止这种情况发生的最好方法是什么?

换一种说法,我想在我的真实数据中插入控制数据,而第三方无法计算哪些行是控制的,哪些是真实的。


更新:我已经把它变成了一个“社区维基”,所以如果有人想编辑我的问题,让它更有意义,那就继续吧。
更新:让我举个例子(我不想让这种语言或平台依赖,因为它不是编码问题,而是统计问题)。

  • 我有 3000 行“真实”数据(这个数量会随着运行的变化而变化,具体取决于用户拥有的数据量)。
  • 我有 20 行“控制”数据(同样,这将根据用户想要使用的控制行数而变化,从零开始)。

我现在想在每插入 150 行或“真实”数据后插入这 20 个“控制”行( 3000/20 = 150)。但是,我不希望它像那样准确,因为我不希望控制行仅根据它们在输出数据中的位置来识别。

因此,我不介意某些“控制”行聚集在一起,或者有些部分根本没有“控制”行,但通常我希望“控制”行在整个数据中相当均匀地分布。

4

4 回答 4

3

如果您真的随机进行,它们总是有可能彼此靠近:)

但我会做的是:

  1. 您拥有多N行真实数据x控制数据
  2. 要获得行的索引,您应该插入i第 - 个控制行,我会使用:N/(x+1) * i + r,其中r是一些随机数,每个控制行都不同,与N/x. 选择任意一种确定方式r,可以是高斯分布,也可以是平面分布。i是控制行的索引,所以它是1<=i<x
  3. 通过这种方式,您可以确保避免将控制行凝聚在一个地方。此外,您可以确定它们之间不会保持固定距离。
于 2008-10-09T13:53:59.483 回答
0

这是我的想法。您为什么不直接遍历现有行并为每一行“掷硬币”来决定是否在其中插入随机数据。

for (int i=0; i<numberOfExistingRows; i++)
{    
    int r = random();
    if (r > 0.5)
    {
        InsertRandomData();
    }    
}

这应该会给你一个很好的数据随机分布。

于 2008-10-09T13:54:36.470 回答
0

以下示例使用 3000 个真实数据行和 20 个控制行(示例比英语更好)

如果您要在 3000 个实际数据行之间尽可能均匀地分布 20 个控制行,您将在每 150 个实际数据行中插入一个。所以选择那个数字,150,作为下一个插入索引。
a) 生成一个介于 0 和 150 之间的随机数,并将其从插入索引中减去
b) 在此处插入控制行。
c) 将插入索引增加 150
d) 重复步骤 a)

当然,这是一个非常粗糙的算法,它需要一些改进:)

于 2008-10-09T15:28:03.817 回答
0

如果实际数据比控制数据大或大得多,只需为您的控制数据生成到达间隔。

所以选择一个随机间隔,复制出那么多行真实数据,插入控制数据,重复直到完成。如何选择那个随机间隔?

我建议使用高斯偏差,将平均值设置为实际数据大小除以控制数据大小,如果需要,可以估计前者,而不是测量或假设已知。根据您愿意容忍的“传播”程度设置此高斯的标准偏差。较小的 stddev 意味着更尖峰分布意味着更严格地遵守均匀间距。更大的标准偏差意味着更扁平的分布和对均匀间距的更松散的遵守。

现在文件的第一部分和最后一部分呢?也就是说:在最开始或最后插入控制数据怎么样?您可以做的一件事是为这些提出特殊情况估计......但一个很好的技巧如下:在负一半高斯平均值处开始您的真实数据的“索引”并生成您的第一个偏差。在您对真实数据的“索引”合法之前,不要输出任何真实数据。数据末尾的对称技巧也应该工作得很好(简单地说:继续生成偏差,直到达到“索引”,至少超出实际数据末尾的高斯平均值的一半。如果在此之前的索引不在end,最后生成数据。

您想查看的不仅仅是统计数据:查看基本排队理论有助于为这类事情开发算法。请参阅 wikipedia 或 Turing Omnibus,其中有一个很好的简短章节,标题为“模拟”。

另外:在某些情况下,非高斯分布,尤其是泊松分布,可以为这类事情提供更好、更自然的结果。上面的算法大纲仍然适用,使用任何似乎正确的分布的平均值的一半。

于 2008-10-09T15:42:56.813 回答