Ich arbeite an einem Algorithmus, der die Größe einer Menge berechnen muss, die durch die Schnittpunkte von mindestens 2 Mengen erzeugt wird. Genauer:
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:
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?
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:
ORDER BY RAND()
, was nicht perfekt ist, aber für diese Aufgabe geeignet sein sollte.Antworten:
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 0EIN0 EIN0
quelle
factor
z
factor
quelle