2016-07-07 24 views
1

Ich berechne viele (~ 100 Millionen) Fließkommawerte während einer Operation. Ich möchte sie nicht alle im Gedächtnis behalten, aber ich möchte eine grobe Verteilung der Sammlung speichern.Speichern einer Wahrscheinlichkeitsverteilung, ohne einzelne Werte zu speichern

Meine Idee war, die Exponenten aller Werte zu bestimmen und sie in einem Histogramm zu zählen. Aber das funktioniert natürlich nur, wenn die Werte verschiedene Exponenten haben.

Hat jemand eine Idee, wie ich das tun kann, ohne zu wissen, wie die Verteilung aussieht?

+0

Es hängt davon ab, wie hart du bist zu sein. Hast du auch eine Vorstellung von der Bandbreite der Werte? Sind sie alle zwischen, sagen wir, 0 und 1 Million? –

Antwort

5

Ich würde vorschlagen, einige nach dem Zufallsprinzip zu speichern, dann ein Histogramm danach machen. Wenn Sie beispielsweise 0,1% der Zahlen nach dem Zufallsprinzip speichern, müssen Sie nur 100.000 speichern, von denen Sie eine sehr genaue Verteilung berechnen können.

Sie können die Anzahl der Aufrufe von rand() reduzieren, indem Sie sie jedes Mal aufrufen, wenn Sie eine Nummer speichern, um eine Zufallszahl im Bereich 1..2000 zu finden. Warten Sie dann auf viele Zahlen, bevor Sie die nächste speichern.

+0

Wenn die Eingabedaten ausreichend zufällig/gleichmäßig verteilt sind, könnte es passieren, dass Sie nur jedes _n_th-Datum abtasten und somit keinen Zufallszahlengenerator mehr benötigen. – Tomboyo

+0

@Tomboyo Ich dachte daran, aber ich habe persönlich zu viele "Synchronisationsartefakte" gesehen, um das zu tun. – btilly

+1

Ich stimme zu. Ich habe oft schiefe Ergebnisse mit "Every nth" Sampling bekommen. –

1

Wenn Sie ungefähr die minimalen und maximalen Werte kennen, würde ich eine Binning-Strategie für eine gute Wahl halten. Hier eine Übersicht für das, was ich meine:

Abbildung heraus, wie viele Behälter Sie brauchen Für all meine Zahlen die Behälter finden, dass diese Zahl in Erhöhungsschritte geht, das ist