5

大量のデータの中に少量のデータをランダムな順序で分散するにはどうすればよいですか?

たとえば、数千行の「実際の」データがあり、「実際の」データ全体にランダムな順序で 12 ~ 2 行の制御データを挿入したいと考えています。

今、私は乱数ジェネレーターの使用方法を尋ねようとしているのではなく、統計的な質問をしています。乱数の生成方法は知っていますが、私の質問は、データがランダムな順序で挿入されていることを確認するにはどうすればよいかです同時に、ファイル全体にかなり均等に散らばっています。

乱数の生成だけに依存している場合、(非常に小さいものではありますが) すべての制御データ、または少なくともその塊が、かなり狭い範囲の「実際の」データに挿入される可能性があります。これが起こらないようにする最善の方法は何ですか?

別の言い方をすれば、サードパーティがどの行がコントロールでどれが実際の行であるかを計算する方法がないように、実際のデータ全体にコントロール データを挿入したいと考えています。


更新: 私はこれを「コミュニティ ウィキ」にしたので、誰かが私の質問を編集してより意味のあるものにしたい場合は、すぐに行ってください。
更新: 例を試してみましょう (コーディングの問題ではなく、統計上の問題であるため、この言語やプラットフォームに依存させたくありません)。

  • 私は 3000 行の「実際の」データを持っています (この量は、ユーザーが持っているデータの量に応じて、実行ごとに変化します)。
  • 私は 20 行の「コントロール」データを持っています (これも、ユーザーが使用したいコントロール行の数に応じて変化します。0 以上です)。

150行または「実際の」データが挿入されるたびに、これらの20行の「制御」行を挿入したいと考えています( 3000/20 = 150)。ただし、出力データ内の位置に基づいて制御行を識別できるようにしたくないため、それほど正確にしたくありません。

したがって、いくつかの「コントロール」行がまとめられたり、「コントロール」行がほとんどまたはまったくないセクションがあることは気にしませんが、一般的には「コントロール」行がデータ全体にかなり均等に分散されるようにします

4

4 に答える 4

3

本当にランダムにすると、お互いに近づく可能性が常にあります:)

しかし、私がすることは次のとおりです。

  1. N実際のデータとx制御データの行があります
  2. 挿入する必要がある行のインデックスを取得するには、-thiコントロール行を使用します。を決定する任意の方法を選択します。ガウス分布またはフラット分布のいずれかです。は制御行のインデックスなので、N/(x+1) * i + rrN/xri1<=i<x
  3. このようにして、コントロール行が 1 か所に集中するのを確実に回避できます。また、それらが互いに一定の距離にないことを確認できます。
于 2008-10-09T13:53:59.483 に答える
0

次の例では、3000の実際のデータ行と20の制御行を使用します(英語よりも例の方が優れています)

20の制御行を3000の実際のデータ行にできるだけ均等に分散させる場合は、150番目の実際のデータ行ごとに1つ挿入します。したがって、次の挿入インデックスとして、その番号150を選択します。
a)0から150までの乱数を生成し、挿入インデックスから減算します
。b)そこに制御行を挿入します。
c)挿入インデックスを150増やします
。d)ステップa)で繰り返します。

もちろん、これは非常に大雑把なアルゴリズムであり、いくつかの改善が必要です:)

于 2008-10-09T15:28:03.817 に答える
0

実際のデータが制御データよりも大きいか、またははるかに大きい場合は、制御データの到着間隔を生成するだけです。

したがって、ランダムな間隔を選択し、実際のデータの多くの行をコピーして、制御データを挿入し、終了するまで繰り返します。そのランダムな間隔を選択する方法は?

実際のデータ サイズを制御データ サイズで割った値に平均を設定したガウス偏差を使用することをお勧めします。前者は、測定または既知と仮定するのではなく、必要に応じて推定できます。許容できる「広がり」に基づいて、このガウス分布の標準偏差を設定します。より小さい stddev は、よりレプトクルティックな分布を意味し、均一な間隔をより厳密に順守することを意味します。stdev が大きいほど、分布がより偏狭になり、均一な間隔への準拠が緩くなることを意味します。

ファイルの最初と最後のセクションはどうなるでしょうか。つまり、最初または最後に制御データを挿入するとどうなるでしょうか。できることの 1 つは、これらの特別なケースの推定値を考え出すことです... しかし、良いトリックは次のとおりです: ガウス平均のマイナス半分で実際のデータへの「インデックス」を開始し、最初の偏差を生成します。実際のデータへの「インデックス」が正当になるまで、実際のデータを出力しないでください。データの末尾にある対称トリックも非常にうまく機能するはずです (単純に、実際のデータの末尾を超えてガウス平均の少なくとも半分の「インデックス」に到達するまで偏差を生成し続けます。これの直前のインデックスが最後にデータを生成します。

統計だけではなく、基本的な待ち行列理論を調べることは、この種のアルゴリズムを開発するのに役立ちます。wikipedia または Turing Omnibus を参照してください。これには、「シミュレーション」というタイトルの主題に関する素敵で短い章があります。

また、状況によっては、非ガウス分布、特にポアソン分布のほうが、この種の場合により良い、より自然な結果が得られます。上記のアルゴリズムの概要は、正しいと思われる分布の半分の平均を使用して適用されます。

于 2008-10-09T15:42:56.813 に答える
0

これが私の考えです。既存の行をループして、行ごとに「コインを投げて」、そこにランダムなデータを挿入するかどうかを決定してみませんか。

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

これにより、データ全体に適切なランダム分布が得られるはずです。

于 2008-10-09T13:54:36.470 に答える