Domanda

Come posso distribuire una piccola quantità di dati in un ordine casuale in un volume di dati molto più grande?

Ad esempio, ho diverse migliaia di righe di dati "reali" e voglio inserire una dozzina o due righe di dati di controllo in un ordine casuale attraverso i dati "reali".

Ora non sto cercando di chiedere come utilizzare generatori di numeri casuali, sto facendo una domanda statistica, so come generare numeri casuali, ma la mia domanda è come posso assicurarmi che questi dati vengano inseriti in un ordine casuale mentre allo stesso tempo viene distribuito in modo abbastanza uniforme nel file.

Se faccio solo affidamento sulla generazione di numeri casuali, c'è la possibilità (anche se molto piccola) che tutti i miei dati di controllo, o almeno i loro blocchi, vengano inseriti in una selezione abbastanza ristretta di dati "reali". Qual è il modo migliore per impedire che ciò accada?

Per dirlo in altro modo, voglio inserire i dati di controllo in tutti i miei dati reali senza che un terzo possa calcolare quali righe sono di controllo e quali sono reali.


Aggiornamento: l'ho trasformato in un "wiki della comunità", quindi se qualcuno vuole modificare la mia domanda in modo che abbia più senso, vai avanti.
Aggiornamento: lasciami provare un esempio (non voglio rendere questo linguaggio o piattaforma dipendente in quanto non è una domanda di codifica, è una domanda statistica).

  • Ho 3000 righe di dati "reali" (questa quantità cambierà da una corsa all'altra, a seconda della quantità di dati dell'utente).
  • Ho 20 righe di dati di "controllo" (di nuovo, questo cambierà in base al numero di righe di controllo che l'utente desidera utilizzare, da zero in su).

Ora voglio inserire queste 20 righe di "controllo" approssimativamente dopo ogni 150 righe o sono stati inseriti dati "reali" (3000/20 = 150). Tuttavia, non voglio che sia accurato come quello in quanto non desidero che le righe di controllo siano identificabili semplicemente in base alla loro posizione nei dati di output.

Pertanto non mi dispiace alcune delle righe di "controllo" raggruppate insieme o che ci siano alcune sezioni con pochissime o nessuna riga di "controllo" , ma in genere desidero che le righe di "controllo" siano distribuite equamente tra i dati.

È stato utile?

Soluzione

C'è sempre la possibilità che si avvicinino l'uno all'altro se lo fai davvero a caso :)

Ma quello che vorrei fare è:

  1. Hai N righe di dati reali e x di controllo dati
  2. Per ottenere un indice di una riga è necessario inserire i -th riga di controllo, utilizzare: N / (x + 1) * i + r , dove r è un numero casuale, diverso per ciascuna delle righe di controllo, piccolo rispetto a N / x . Scegli qualsiasi modo di determinare r , può essere una distribuzione gaussiana o persino piatta . i è un indice della riga di controllo, quindi è 1<=i<x
  3. In questo modo puoi essere sicuro di evitare la condensa delle tue file di controllo in un unico posto. Inoltre puoi essere sicuro che non si troveranno a distanze regolari l'uno dall'altro.

Altri suggerimenti

Ecco il mio pensiero. Perché non scorrere semplicemente le righe esistenti e "lanciare una moneta"? per ogni riga per decidere se inserire dati casuali lì.

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

Questo dovrebbe darti una buona distribuzione casuale in tutti i dati.

Accedere alle 3000 righe di dati reali e alle 20 righe di controllo per il seguente esempio (sto meglio con l'esempio che con l'inglese)

Se dovessi distribuire le 20 righe di controllo nel modo più uniforme possibile tra le 3000 righe di dati reali, inseriresti una per ogni 150a riga di dati reali. Quindi scegli quel numero, 150, per il prossimo indice di inserimento.
a) Genera un numero casuale compreso tra 0 e 150 e sottralo dall'indice di inserimento
b) Inserire qui la riga di controllo.
c) Aumentare l'indice di inserzione di 150
d) Ripetere l'operazione al punto a)

Ovviamente questo è un algoritmo molto grezzo e ha bisogno di alcuni miglioramenti :)

Se i dati reali sono grandi o molto più grandi dei dati di controllo, è sufficiente generare intervalli interarrival per i dati di controllo.

Quindi scegli un intervallo casuale, copia molte righe di dati reali, inserisci i dati di controllo, ripeti fino al termine. Come scegliere quell'intervallo casuale?

Consiglio di usare una deviazione gaussiana con media impostata sulla dimensione reale dei dati divisa per la dimensione dei dati di controllo, la prima delle quali potrebbe essere stimata se necessario, piuttosto che misurata o presunta nota. Imposta la deviazione standard di questo gaussiano in base alla quantità di "spread" sei disposto a tollerare. Lo stddev più piccolo significa una distribuzione più leptokurtic significa una maggiore aderenza alla spaziatura uniforme. Stdev più grande significa una distribuzione più platicurica e una più ampia aderenza alla spaziatura uniforme.

E la prima e l'ultima sezione del file? Cioè: che dire di un inserimento di dati di controllo all'inizio o alla fine? Una cosa che puoi fare è elaborare stime per casi speciali per questi ... ma un bel trucco è il seguente: inizia il tuo "indice" nei dati reali a meno metà della media gaussiana e genera il tuo primo deviato. Non generare dati reali fino a quando il tuo "indice" nei dati reali è legittimo. Anche un trucco simmetrico alla fine dei dati dovrebbe funzionare abbastanza bene (semplicemente: continua a generare deviazioni fino a raggiungere un "indice" almeno metà della media gaussiana oltre la fine dei dati reali. Se l'indice appena prima era spento alla fine, generare dati alla fine.

Volete guardare più di una semplice statistica: è utile nello sviluppo di un algoritmo per questo genere di cose guardare alla teoria delle code rudimentali. Guarda wikipedia o Turing Omnibus, che ha un bel breve capitolo sull'argomento il cui titolo è "Simulazione".

Inoltre: in alcune circostanze le distribuzioni non gaussiane, in particolare la distribuzione di Poisson, danno risultati migliori e più naturali per questo genere di cose. Lo schema dell'algoritmo sopra si applica ancora usando metà della media di qualunque distribuzione sembri corretta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top