Question

Comment distribuer une petite quantité de données dans un ordre aléatoire dans un volume de données beaucoup plus important?

Par exemple, j'ai plusieurs milliers de lignes de données "réelles" et je souhaite insérer une douzaine ou deux lignes de données de contrôle dans un ordre aléatoire dans toutes les données "réelles".

Maintenant, je ne cherche pas à savoir comment utiliser des générateurs de nombres aléatoires, je pose une question statistique, je sais comment générer des nombres aléatoires, mais ma question est de savoir comment puis-je m'assurer que les données sont insérées dans un ordre aléatoire tout en étant assez dispersés dans le fichier.

Si je me contente de générer des nombres aléatoires, il est possible (bien que très petit) que toutes mes données de contrôle, ou du moins des groupes de celles-ci, soient insérées dans une sélection assez étroite de données "réelles". Quel est le meilleur moyen d’empêcher que cela se produise?

Pour le formuler autrement, je souhaite insérer des données de contrôle dans l'ensemble de mes données réelles sans qu'un tiers ne puisse calculer les lignes qui sont sous contrôle et celles qui sont réelles.


Mise à jour: j'ai transformé ce site en un "wiki de communauté". Par conséquent, si quelqu'un souhaite modifier ma question afin que ce soit plus logique, poursuivez. Mise à jour: laissez-moi essayer un exemple (je ne veux pas rendre ce langage ou cette plate-forme dépendant, car ce n'est pas une question de codage, c'est une question statistique).

  • J'ai 3000 rangées de données "réelles" (cette quantité changera d'une exécution à l'autre, en fonction de la quantité de données dont dispose l'utilisateur).
  • J'ai 20 lignes de données 'de contrôle' (encore une fois, cela changera en fonction du nombre de lignes de contrôle que l'utilisateur souhaite utiliser, à partir de zéro).

Je souhaite maintenant insérer ces 20 lignes de contrôle approximativement toutes les 150 lignes ou "données réelles" insérées (3000/20 = 150). Cependant, je ne veux pas que ce soit aussi précis que cela, car je ne veux pas que les lignes de contrôle soient identifiables simplement en fonction de leur emplacement dans les données de sortie.

Par conséquent, cela ne me dérange pas que certaines des rangées de "contrôle" soient regroupées ou qu'il y ait des sections avec très peu ou pas de rangées de "contrôle" , mais en règle générale, je souhaite que les lignes de "contrôle" soient réparties de manière assez uniforme dans les données.

Était-ce utile?

La solution

Il est toujours possible qu'ils se rapprochent les uns des autres si vous le faites vraiment au hasard:)

Mais ce que je ferais c'est:

  1. vous avez N lignes de données réelles et x de données control
  2. Pour obtenir l'index d'une ligne, vous devez insérer i -th, ligne de contrôle, utilisez: N / (x + 1) * i + r , où r est un nombre aléatoire, différent pour chacune des lignes de contrôle, petit comparé à N / x . Choisissez n’importe quel moyen de déterminer r , il peut s'agir d'une distribution gaussienne ou même plate . i est un index de la ligne de contrôle, il s'agit donc de 1 < = i
  3. De cette façon, vous pouvez être sûr d’éviter la condensation de vos rangées de contrôle en un seul endroit. Vous pouvez aussi être sûr qu'ils ne seront pas à une distance régulière l'un de l'autre.

Autres conseils

Voici ma pensée. Pourquoi ne pas simplement parcourir les rangées existantes et "lancer une pièce de monnaie"? pour chaque ligne de décider si vous allez y insérer des données aléatoires.

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

Cela devrait vous donner une belle distribution aléatoire dans les données.

Aller avec les 3000 lignes de données réelles et les 20 lignes de contrôle pour l'exemple suivant (je suis meilleur avec exemple qu'en anglais)

Si vous étiez réparti les 20 lignes de contrôle aussi uniformément que possible entre les 3000 lignes de données réelles, vous en insèreriez une à chaque 150ème ligne de données réelle. Alors choisissez ce nombre, 150, pour le prochain index d'insertion.
a) Générez un nombre aléatoire compris entre 0 et 150 et soustrayez-le de l'indice d'insertion
b) Insérez la ligne de contrôle à cet endroit.
c) Augmenter l'indice d'insertion de 150
d) Répétez à l'étape a)

Bien sûr, cet algorithme est très grossier et nécessite quelques améliorations:)

Si les données réelles sont volumineuses ou beaucoup plus volumineuses que les données de contrôle, générez simplement des intervalles interarrivants pour vos données de contrôle.

Choisissez donc un intervalle aléatoire, copiez autant de lignes de données réelles, insérez les données de contrôle, répétez-les jusqu'à la fin. Comment choisir cet intervalle aléatoire?

Je vous conseillerais d'utiliser un écart gaussien avec une moyenne définie à la taille réelle des données divisée par la taille des données de contrôle, la première pouvant être estimée si nécessaire, plutôt que mesurée ou supposée connue. Définissez l’écart type de ce gaussien en fonction de la valeur de "spread". vous êtes prêt à tolérer. Plus petit stddev signifie une distribution plus leptokurtic signifie une adhérence plus étroite à un espacement uniforme. Plus grand stdev signifie une distribution plus platykurtic et une adhésion plus souple à un espacement uniforme.

Qu'en est-il des première et dernière sections du fichier? C'est-à-dire: qu'en est-il d'une insertion de données de contrôle au tout début ou à la fin? Une chose à faire est de proposer des estimations de cas particuliers pour ceux-ci ... mais voici une astuce intéressante: démarrez votre "index". dans les données réelles à moins de la moitié de la moyenne gaussienne et générer votre premier écart. Ne produisez aucune donnée réelle avant que votre " index " dans les données réelles est légitime. Une astuce symétrique à la fin des données devrait aussi très bien fonctionner (simplement: continuer à générer des écarts jusqu'à ce que vous atteigniez un "indice" égal à au moins la moitié de la moyenne gaussienne au-delà de la fin des données réelles. Si l'indice juste avant était éteint à la fin, générer des données à la fin.

Vous voulez examiner plus que des statistiques: il est utile de développer un algorithme pour ce genre de chose en examinant la théorie rudimentaire des files d’attente. Voir wikipedia ou l’Omnibus de Turing, qui contient un beau chapitre court sur le sujet intitulé "Simulation".

En outre, dans certains cas, les distributions non gaussiennes, en particulier la distribution de Poisson, donnent de meilleurs résultats, plus naturels, pour ce genre de chose. Le schéma de l'algorithme ci-dessus s'applique toujours en utilisant la moitié de la moyenne de la distribution qui semble correcte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top