データのランダム分布
-
06-07-2019 - |
質問
大量のデータに少量のデータをランダムな順序で分散するにはどうすればよいですか
たとえば、数千行の「実際の」データがあり、「実際の」データ全体にランダムな順序で数十行または2行の制御データを挿入します。
現在、乱数ジェネレーターの使用方法を尋ねるのではなく、統計的な質問をしています。乱数の生成方法は知っていますが、私の質問は、このデータがランダムな順序で挿入されるようにする方法です同時にファイル全体にかなり均等に散らばっています。
乱数の生成のみに依存している場合、すべてのコントロールデータ、または少なくともその塊が、かなり狭い「実際の」データの選択範囲内に挿入される可能性があります(非常に小さなものですが)。これを防ぐ最良の方法は何ですか?
別の言い方をすれば、第三者がどの行を制御し、どの行を実際に計算するかという方法がなくても、実際のデータ全体に制御データを挿入したいのです。
更新:私はこれを「コミュニティwiki」にしたので、だれかが私の質問を編集したい場合、それがより理にかなって、すぐに先に進みます。
更新:例を試してみましょう(この言語やプラットフォームをコーディングの質問ではなく、統計的な質問なので、この言語やプラットフォームに依存させたくありません)。
- 3000行の「実際の」データがあります(この量は、ユーザーが持っているデータの量に応じて、実行ごとに変わります)。
- 20行の「コントロール」データがあります(これも、ユーザーが使用したいコントロール行の数に応じて、0から上に向かって変化します)。
150行ごとまたは「実際の」データが挿入された後(3000/20 = 150)に、これらの20の「コントロール」行を大まかに挿入します。ただし、出力データ内の位置に基づいて単純に制御行を識別できるようにするのと同じくらい正確にしたくありません。
したがって、「コントロール」行がまとまっているか、または「コントロール」行がほとんどないかまったくない一部セクションがある一部は気にしません、しかし一般的には、データ全体に「制御」行をかなり均等に分散させます。
解決
本当にランダムに行うと、それらが互いに接近する可能性が常にあります:)
しかし、私がすることは:
- 実際のデータの
N
行と control データのx
があります - 行のインデックスを取得するには、
i
番目のコントロール行を挿入する必要があります。N /(x + 1)* i + r
、ここで、r
は、N / x
に比べて小さい、コントロール行ごとに異なる乱数です。r
を決定する任意の方法を選択します。ガウスまたはフラット分布のいずれかです。i
は制御行のインデックスなので、1< = i< x
です。
- これにより、コントロールの列が1か所に集中するのを防ぐことができます。また、互いに一定の距離にないことを確認できます。
他のヒント
ここに私の考えがあります。既存の行をループして「コインを裏返す」だけではどうでしょうか。ランダムデータを挿入するかどうかを各行ごとに決定します。
for (int i=0; i<numberOfExistingRows; i++)
{
int r = random();
if (r > 0.5)
{
InsertRandomData();
}
}
これにより、データ全体に素敵なランダム分布が得られます。
次の例では、3000の実データ行と20の制御行を使用します(英語よりも例の方が良いです)
20個のコントロール行を3000個の実データ行にできるだけ均等に分散させる場合、150番目の実データ行ごとに1行を挿入します。
そのため、次の挿入インデックス用にその番号150を選択します。
a)0〜150の乱数を生成し、挿入インデックスから減算します
b)そこにコントロール行を挿入します。
c)挿入インデックスを150増やします
d)ステップa)で繰り返します
もちろんこれは非常に粗雑なアルゴリズムであり、いくつかの改善が必要です:)
実データが制御データよりも大きい場合、または制御データよりもはるかに大きい場合は、制御データの到着間隔を生成します。
ランダムな間隔を選択し、その数行の実際のデータをコピーし、制御データを挿入し、完了するまで繰り返します。そのランダムな間隔を選ぶ方法
平均を実際のデータサイズを制御データサイズで除算したガウス偏差を使用することをお勧めします。 「拡散」の程度に基づいて、このガウス分布の標準偏差を設定します。あなたは容認します。 stddevが小さくなると、レプトクティック分布が大きくなり、均一な間隔が厳しくなります。 stdevが大きくなると、板状の分布がより均一になり、均一な間隔を厳守します。
ファイルの最初と最後のセクションはどうですか?つまり、最初または最後のコントロールデータの挿入はどうでしょうか。あなたができることの1つは、これらの特別なケースの見積もりを考え出すことです...しかし、素晴らしいトリックは次のとおりです。ガウス平均の半分のマイナスで実データに入力し、最初の偏差を生成します。 &quot; index&quot;まで実際のデータを出力しないでください。実際のデータに合法です。 データの最後にある対称トリックも非常にうまく機能するはずです(単純に、実際のデータの終わりを超えて少なくとも平均ガウス平均の「インデックス」に達するまで偏差を生成し続けます。この直前のインデックスがオフの場合最後に、最後にデータを生成します。
統計だけでなく、この種のアルゴリズムを開発して基本的なキューイング理論を調べると便利です。ウィキペディアまたはTuringオムニバスを参照してください。タイトルが「シミュレーション」である主題についての短い短い章があります。
また、ある種の状況では、非ガウス分布、特にポアソン分布は、この種のものに対してより良い、より自然な結果を与えます。上記のアルゴリズムの概要は、正しいと思われる分布の平均の半分を使用して適用されます。