Wie zufällig Stichprobe aus einer Scala-Liste oder ein array?
Möchte ich zufällig Probe aus einer Scala-Liste oder ein array (keine RDD), die Größe der Stichprobe kann wesentlich länger sein als die Länge der Liste oder ein array, wie kann ich dies tun effizient? Da die Größe der Stichprobe sehr groß sein kann und die Probenahme (auf anderen Listen/arrays) getan werden muss, um eine große Anzahl von Zeiten.
Ich weiß, für eine Spark-RDD wir können takeSample (), um es zu tun, gibt es ein äquivalent für Scala Liste/array?
Danke Ihnen sehr.
- Zufallszahlengeneratoren sind stateful, so dass es nicht sinnvoll ist, für die Listen haben eine solche Funktion. Sie würden umsetzen müssen Sie selbst (es wäre auch eine lineare operation). Für arrays kann man eine zufällige Zahl aus der "Zufällige" Objekte, etwa so: 'Random.nextInt(myArray.Länge)' und den index in das array.
- AH, nvm. Ich lese zu schnell xD
InformationsquelleAutor Carter | 2015-10-04
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer einfach-zu-verstehen-version würde so Aussehen:
Für arrays:
Machen einen random number generator (
rnd
), basierend auf Ihrer Samen. Dann füllen eines Arrays mit Zufallszahlen von 0 bis zur Größe der Arrays.Der Letzte Schritt ist die Anwendung jeder zufälligen Wert, um die Indizierung Betreiber Ihre Eingabe-array. In der REPL könnte wie folgt Aussehen:
Für die Listen, ich würde einfach konvertieren Sie die Liste auf Array und verwenden Sie die gleiche Funktion. Ich bezweifle, kann man viel effizienter für die Listen sowieso.
Es ist wichtig zu beachten, dass die gleiche Funktion mit Listen nehmen würde O(n^2) Zeit, in der Erwägung, dass die Umwandlung der Liste, um arrays, die erste dauert O(n) Zeit
takeSample
Methode ist unnötig erstellen des Arrays mit den Indizes und dann die Zuordnung. Sollten Sie vielleicht stattdessen etwas tun, wieArray.fill(n)(a(rng.nextInt(a.size)))
() => a(rnd.nextInt(a.size))
zua(rnd.nextInt(a.size))
und fügte hinzu, die classtag vonT
um für den Bau des Arrays zu arbeiten. Probieren Sie es jetzt 🙂 Sorry für die UnannehmlichkeitenMit einem für das Verständnis, für ein gegebenes array
xs
Sie wie folgt vor,Hinweis: der Zufallsgenerator stellt hier die Werte in der Einheit Intervall skaliert sind, um über die Größe des Arrays, und konvertiert
Int
für die Indizierung über den array.Hinweis Für rein funktionale Zufallsgenerator betrachten Sie zum Beispiel die State-Monade Ansatz von Funktionale Programmierung in Scala, diskutiert hier.
Hinweis beachten Sie auch NICTA, anderen reinen funktionalen zufälliger Wert generator, es ist zu verwenden, illustriert zum Beispiel hier.
Anhand der klassischen Rekursion.
takeSample(List(1,2,3),10000)
versuchen Sie dieses, es werde die Luft zu sprengen, weil es ist nicht tail-rekursiv.Wenn Sie möchten, um eine Probe ohne Ersatz -- Reißverschluss mit randoms, Sortieren
O(n*log(n)
verwerfen randoms, nehmenEntweder:
SeqHelpers
zum Beispiel mit Scalatest specimport your.pkg.SeqHelpers._
Dann sollte Folgendes funktionieren:
Bearbeitungen zum entfernen der Besetzung, sind willkommen.
Auch wenn es ist ein Weg, um eine leere Instanz der Sammlung für den Akku, ohne Kenntnis der konkreten Typ vor der Zeit, kommentieren Sie bitte. Das heißt, der generator ist wahrscheinlich effizienter.
Nicht-test für die Leistung, aber der folgende code ist eine einfache und elegante Weg, um die Probenahme und ich glaube, dass kann helfen, viele, die hierher kommen, nur um ein sampling-code. Ändern Sie einfach die "range" entsprechend der Größe der end-Probe. Wenn pseude-Zufälligkeit ist nicht genug für Ihren Bedarf, die Sie verwenden können, nehmen Sie(1) in der inneren Liste und erhöhen die Reichweite.
Random.shuffle((1 to 100).toList.flatMap(x => (Random.shuffle(yourList))))