Schätzen der Größe eines Schnittpunkts mehrerer Sätze anhand einer Stichprobe eines Satzes


10

Ich arbeite an einem Algorithmus, der die Größe einer Menge berechnen muss, die durch die Schnittpunkte von mindestens 2 Mengen erzeugt wird. Genauer:

z=|A0An|

Die Mengen, die sich überschneiden, werden von SQL-Abfragen generiert. Um die Dinge schnell zu halten, zähle ich jede Abfrage im Voraus, nehme dann die Menge mit der niedrigsten Anzahl ( ) und verwende diese IDs als Grenzen für die Rest der großen Abfragen, so dass die Kreuzung effektiv wird:A0

z=|(A0A1)(A0An)|

Selbst diese Strategie lässt mich einige ziemlich große Abfragen zu erledigen, dakann manchmal groß sein. Meine Idee, damit umzugehen, besteht darin, eine Zufallsstichprobe von und sie mit den übrigen Mengen zu schneiden, bevor ich auf eine korrekte Schätzung von extrapoliere . Meine Frage ist: Was ist der beste Weg, um abzutasten und dann zu extrapolieren, um zu einem Wert von , der, wenn auch nicht ganz genau, einen vorhersagbaren Fehlerbereich aufweist?|A0|A0zz


Folgendes habe ich bisher versucht (in Pseudocode):

sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
    factor = sample_threshold / len(A0)
}

// Take a random sample of size 10000 from A0

// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
    a = intersect(A0, a)
    working_set = intersect(working_set, a)
}

z := len(working_set) * (1 / factor)

Dieser Code funktioniert, scheint jedoch durchweg zu überschätzen z, wobei eine niedrigere Stichprobengröße eine höhere Schätzung ergibt. Außerdem bin ich mir nicht sicher, wie sich dies mit mehr als zwei zu schneidenden Sätzen skalieren lässt.

Ich hoffe, diese Frage macht Sinn, lassen Sie mich wissen, ob ich etwas weiter klären kann. Wenn diese Frage nicht zum Thema gehört oder woanders hingehört, lassen Sie es mich bitte wissen und ich bewege sie gerne.


Gemäß Bills Kommentar habe ich einige schnelle Versuche durchgeführt, um die Stichprobengröße im Vergleich zum Fehler zu zeigen. Jeder Eimer mit Stichprobengröße wurde 20 Mal ausgeführt, und wie Sie sehen, gibt es einen ziemlich klaren Trend:

Handlung


Ich denke, einfache Stichproben ohne Ersatz sollten funktionieren. Ich bin verblüfft, dass Sie überschätzt werden. Dies sieht so aus, als würde es genau der Schätzung eines Populationsmittelwerts unter Verwendung des Stichprobenmittelwerts aus einer Zufallsstichprobe zugeordnet. Sie versuchen, die Populationswahrscheinlichkeit zu schätzen, mit der sich ein Element von im Schnittpunkt der anderen s befindet. Ich habe mit einem einfachen Beispiel genudelt, und es funktioniert gut. Wie sicher sind Sie, dass Sie immer wieder überschätzen? Ist es 15 mal von 20 oder 150 mal von 200 passiert? Ist die Stichprobe wirklich zufällig? A.A0A
Bill

1
@ Bill Ich habe ein Diagramm mit Stichprobengröße und Fehler hinzugefügt, das zeigt, was ich sehe. Es ist eher 20 Mal von 20. Die Zufallsstichprobe ist so zufällig wie ORDER BY RAND(), was nicht perfekt ist, aber für diese Aufgabe geeignet sein sollte.
Jimmy Sawczuk

@JimmySawczuk Wäre es nicht besser, den "Arbeitssatz" einfach mit "a" direkt zu schneiden, anstatt "schneiden (A0, a)"? Weil "A0" nach dem ersten Durchlauf vermutlich größer sein wird als der aktuelle "Arbeitssatz" im Algorithmus ... Verstehe ich das richtig?

Können Sie bestätigen, dass Sie tatsächlich Mengen und nicht Multisätze meinen (dh, dass die Sätze keine Duplikate enthalten)? Denn wenn ja, ist es leicht, die Größe der "Kreuzung" mit Ihrer Methode zu überschätzen. (Betrachten Sie den Fall, in dem nur 100 Kopien desselben Elements sind und Sie die Hälfte davon abgetastet haben.)A0
Innuo

Kann ich auch fragen, ob die Größe des Schnittpunkts im Verhältnis zur Größe der ursprünglichen Sätze extrem klein ist? Wenn ja, würde das Ihr Problem erklären. Ich habe einige Simulationen (mit kleineren Mengen) durchgeführt und bekomme auch eine ziemlich konsistente, wenn auch kleine Überschätzung.

Antworten:


3

Wenn Ihre Menge Elemente wiederholt hat (dh es handelt sich tatsächlich um eine Mehrfachmenge), wird die Größe des Schnittpunkts durch Ihre Prozedur überschätzt, da Ihr Skalierungsfaktor die Anzahl der abgetasteten Elemente und nicht die Anzahl der abgetasteten eindeutigen "Typen" verwendet. Sie können die Schätzung korrigieren, indem Sie den Faktor als Verhältnis der Anzahl eindeutiger Elemente in Ihrer Zufallsstichprobe zur Anzahl eindeutiger Elemente in der vollständigen Menge .A 0A0A0


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.