2016-05-13 6 views
0

Ich möchte Zufallsvektoren mit Norm 1 in Spark generieren.Wie Zufallsvektor in Spark generiert werden

Da der Vektor sehr groß sein könnte, möchte ich es verteilt werden, Und da Daten in RDD keine Reihenfolge hat, möchte ich den Vektor in Form von RDD [(Int, Double)] speichern, weil ich auch müssen diesen Vektor verwenden, um eine Matrix-Vektor-Multiplikation durchzuführen.

Also, wie könnte ich diese Art von Vektor generieren?

Hier ist mein Plan für heute:

val v = normalRDD(sc, n, NUM_NODE) 
val mod = GetMod(v)  // Get the modularity of v 
val res = v.map(x => x/mod) 
val arr:Array[Double] = res.toArray() 

var tuples = new List[(Int, Double)]() 
for (i <- 0 to (arr.length - 1)) { 
    tuples = (i, arr(i)) :: tuples 
} 
// Get the entries and length of the vector. 
entries = sc.parallelize(tuples) 
length = arr.length 

Ich denke, es ist genug, um nicht elegant, weil es einem geht durch „verteilt -> einzelnen Knoten -> verteilt“ -Prozess.

Gibt es einen besseren Weg? Danke: D

+0

Möchten Sie eine zufällige rdd, deren Norm ist 1 oder eine normalverteilte rdd? – jtitusj

+0

@JohnTitusJungao Ich denke, ich will nur eine zufällige rdd, deren Norm ist 1. normal verteilt ist ok nach meinem Code: D –

+0

Ich sehe. Ich habe meinen Code unten gepostet. Format der endgültigen Antwort: RDD [(Int, Double)], zufällig generiert und Norm ist 1. – jtitusj

Antwort

1

try this:

import scala.util.Random 
import scala.math.sqrt 

val n = 5 // insert length of your array here 
val randomRDD = sc.parallelize(for (i <- 0 to n) yield (i, Random.nextDouble)) 
val norm = sqrt(randomRDD.map(x => x._2 * x._2).sum()) 
val finalRDD = randomRDD.mapValues(x => x/norm) 
+0

Vielen Dank für Ihre Hilfe: D –

0

Sie this Funktion können Sie einen Zufallsvektor erzeugen, dann können Sie es normalisieren, indem jedes Element auf dem sum() des Vektors dividiert oder durch einen normalizer verwenden.

Verwandte Themen