Ich bin ziemlich vertraut mit Reservoir Sampling zu Probe aus einer Reihe von unbestimmten Länge in einem einzigen Durchgang über die Daten. Eine Einschränkung dieses Ansatzes besteht meines Erachtens darin, dass immer noch ein Durchlauf über den gesamten Datensatz erforderlich ist, bevor Ergebnisse zurückgegeben werden können. Konzeptionell ist dies sinnvoll, da man den Items in der gesamten Sequenz die Möglichkeit geben muss, zuvor angetroffene Items zu ersetzen, um eine einheitliche Probe zu erhalten.Iterative oder Lazy Reservoir Sampling
Gibt es eine Möglichkeit, einige zufällige Ergebnisse zu erhalten, bevor die gesamte Sequenz ausgewertet wurde? Ich denke an die Art von fauler Herangehensweise, die gut zu Pythons großer iertools-Bibliothek passen würde. Vielleicht könnte dies innerhalb einer vorgegebenen Fehlertoleranz gemacht werden? Ich würde jede Art von Feedback zu dieser Idee schätzen!
Nur um die Frage etwas zu verdeutlichen, fasst dieses Diagramm mein Verständnis der In-Memory-Streaming-Kompromisse verschiedener Sampling-Techniken zusammen. Was ich will, ist etwas, das in die Kategorie Stream Sampling fällt, wo wir die Länge der Bevölkerung vorher nicht kennen.
Offensichtlich gibt es einen scheinbaren Widerspruch nicht die Länge a priori zu wissen, und noch eine einheitliche Probe bekommen, da wir höchstwahrscheinlich Bias die Probe zu Beginn der Bevölkerung. Gibt es eine Möglichkeit, diese Verzerrung zu quantifizieren? Gibt es Kompromisse zu machen? Hat jemand einen cleveren Algorithmus, um dieses Problem zu lösen?
Sie könnten es so machen, aber dabei verlieren Sie die Fähigkeit, einige Sequenzen zu generieren. Wenn Sie z. B. 10 Elemente zufällig aus einer Liste auswählen möchten, aber eine Art vorzeitiger Rückgabe für ein oder mehrere Elemente ausführen, enthält Ihr Beispiel nie die letzten 10 Elemente in der Liste. Wenn es Ihnen gut geht, die Ausgabe zu beeinflussen, können Sie eine vorzeitige Rückgabe vornehmen. Andernfalls müssen Sie warten, bis die gesamte Liste überprüft wurde. –
Es wäre sinnvoller, Reservoir-Sampling zu implementieren, so dass es immer iterativ iteriert. Wenn ein Aufrufer ein schnelleres Ergebnis wünscht, das nicht über seine gesamte iterierbare Ebene iteriert, kann er selbst abgeschnittene iterierbare Abschnitte übergeben.Eine iterierbare Reservoirbildung wäre wenig sinnvoll, da aufeinanderfolgende Reservoirs extrem korreliert sind (sie unterscheiden sich in 0 oder 1 Positionen). –
@TimothyShields Ich stimme dem API-Design zu, man würde und sollte erwarten, dass sich ein Reservoir-Sample so verhält. Was ich hier suche, ist eine Art von analoger statistischer Klugheit, die es uns erlauben würde, Gegenstände früh zurückzugeben oder ein gutes Argument, warum dies überhaupt nicht möglich ist. – Stankalank