Wie stichprobenweise aus einer Scala-Liste oder einem Array?

7

Ich möchte nach dem Zufallsprinzip aus einer Scala-Liste oder einem Array (keine RDD) abtasten, die Stichprobengröße kann viel länger sein als die Länge der Liste oder des Arrays, wie kann ich das effizient machen ? Weil die Stichprobengröße sehr groß sein kann und das Sampling (auf verschiedenen Listen / Arrays) sehr oft durchgeführt werden muss.

Ich weiß, dass wir für eine Spark-RDD takeSample () verwenden können, gibt es ein Äquivalent für Scala-Liste / Array?

Vielen Dank.

    
Carter 04.10.2015, 09:59
quelle

6 Antworten

23

Eine einfach zu verstehende Version würde so aussehen:

%Vor%     
Marius Soutier 04.10.2015 11:20
quelle
3

Für Arrays:

%Vor%

Erstelle einen Zufallszahlengenerator ( rnd ) basierend auf deinem Seed. Füllen Sie dann ein Array mit Zufallszahlen von 0 bis zur Größe Ihres Arrays.

Der letzte Schritt besteht darin, jeden zufälligen Wert auf den Indexierungsoperator Ihres Eingabearrays anzuwenden. Die Verwendung in der REPL könnte wie folgt aussehen:

%Vor%

Bei Listen würde ich die Liste einfach in Array konvertieren und die gleiche Funktion verwenden. Ich bezweifle, dass du sowieso für Listen viel effizienter werden kannst.

Es ist wichtig zu beachten, dass die gleiche Funktion, die Listen verwendet, O (n ^ 2) Zeit benötigt, während das Konvertieren der Liste in Arrays zuerst O (n) Zeit benötigt

    
Felix 04.10.2015 10:25
quelle
1

Verwenden Sie zum Verständnis für ein gegebenes Array xs wie folgt

%Vor%

Beachten Sie, dass der Zufallsgenerator hier Werte innerhalb des Einheitsintervalls erzeugt, die so skaliert sind, dass sie über die Größe des Arrays reichen, und für die Indizierung über das Array in Int konvertiert werden.

Hinweis Betrachten Sie für rein funktionale Zufallsgeneratoren beispielsweise den State-Monad-Ansatz von Funktionale Programmierung in Scala , hier .

Hinweis Betrachten Sie auch NICTA , einen anderen reinen funktionalen Zufallswertgenerator, dessen Verwendung beispielsweise dargestellt wird < a href="https://stackoverflow.com/a/25655709/3189923"> hier .

    
elm 04.10.2015 19:47
quelle
1

Verwenden der klassischen Rekursion.

%Vor%     
thomas pocreau 25.02.2016 17:07
quelle
0
%Vor%

Entweder:

  • Mixin SeqHelpers , zum Beispiel mit einer Scalatest-Spezifikation
  • Include import your.pkg.SeqHelpers._

Dann sollte folgendes funktionieren:

%Vor%

Bearbeitungen zum Entfernen der Besetzung sind willkommen.

Auch wenn es eine Möglichkeit gibt, eine leere Instanz der Sammlung für den Akkumulator zu erstellen, ohne vorher den konkreten Typ zu kennen, kommentieren Sie bitte. Das heißt, der Builder ist wahrscheinlich effizienter.

    
Darren Bishop 05.12.2016 14:34
quelle
0

Wenn Sie ohne ersetzen möchten - zippen Sie mit randoms, sortieren Sie O(n*log(n) , löschen Sie randoms, nehmen Sie

%Vor%     
KevinKatz 26.02.2017 01:38
quelle