【问题标题】:Random distribution of data数据的随机分布
【发布时间】:2010-09-16 06:46:52
【问题描述】:

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

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

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

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

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


更新:我已将其设为“社区 wiki”,因此如果有人想编辑我的问题以使其更有意义,那么请继续。
更新:让我举个例子(我不想让这种语言或平台依赖,因为它不是编码问题,而是统计问题)。
  • 我有 3000 行“真实”数据(此数量会因运行而异,具体取决于用户拥有的数据量)。
  • 我有 20 行“控制”数据(同样,这将根据用户想要使用的控制行数而变化,从零开始)。

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

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

【问题讨论】:

  • 在什么情况下?这是在数据库中吗?纯文本文件?
  • 这是一个纯文本文件,实际上我在内存中有行和控制行。当我将“真实”行写入文件时,我希望能够决定是否应该编写“控制”行,控制行分布在整个真实数据中,而不是全部聚集在开头或结尾。

标签: random controls distribution random-seed


【解决方案1】:

如果你真的很随机​​,它们总是有可能彼此靠近:)

但我会做的是:

  1. 您有N 行真实数据和x 控制 数据
  2. 要获得一行的索引,您应该插入i-th 控制行,我会使用:N/(x+1) * i + r,其中r 是一些随机数,每个控制行都不同,与N/x。选择任何确定r 的方式,它可以是gaussian 甚至是flat 分布。 i 是控制行的索引,所以它是1<=i<x
  3. 通过这种方式,您可以确保避免将控制行凝聚在一个地方。此外,您可以确定它们之间不会保持固定距离。

【讨论】:

  • 当然这意味着如果有人可以只识别一个控制行,他们也能够识别所有其他控制行吗? i 和 r 什么时候应该改变,每一行,每次插入新控件时,还是从不改变?
  • r 是随机数,每个控制行都不一样
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的评论,问题是我的控制数据比真实数据少得多,因此如果我使用抛硬币的方式,我会将所有数据插入真实数据的开头。跨度>
【解决方案3】:

在以下示例中使用 3000 个实际数据行和 20 个控制行(示例比英文更好)

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

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

【讨论】:

    【解决方案4】:

    如果实际数据比控制数据大或远大于控制数据,只需为控制数据生成到达间隔。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2011-05-27
      • 2011-03-31
      • 2012-03-10
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多