Lassen Q
eine verteilte Reihe Matrix in Funken sein, ich will Q'
das Kreuzprodukt von Q
mit seiner transponieren berechnen.Wie berechnet man das Punktprodukt zweier verteilter RowMatrix in Apache Spark?
Obwohl eine Row Matrix jedoch eine multiply()
Methode hat, kann sie nur lokale Matrizen als Argument akzeptieren.
-Code Illustration (Scala):
val phi = new RowMatrix(phiRDD) // phiRDD is an instance of RDD[Vector]
val phiTranspose = transposeRowMatrix(phi) // transposeRowMatrix()
// returns the transpose of a RowMatrix
val crossMat = ? // phi * phiTranspose
Bitte beachte, dass ich das Skalarprodukt Distributed RowMatrix kein verteilt man mit einem lokalen ein ausführen möchten.
Eine Lösung ist eine IndexedRowMatrix
wie folgt zu verwenden:
val phi = new IndexedRowMatrix(phiRDD) // phiRDD is an instance of RDD[IndexedRow]
val phiTranspose = transposeMatrix(phi) // transposeMatrix()
// returns the transpose of a Matrix
val crossMat = phi.toBlockMatrix().multiply(phiTranspose.toBlockMatrix()
).toIndexedRowMatrix()
Allerdings möchte ich die Reihe Matrix-Methoden verwenden, wie tallSkinnyQR()
und das bedeutet, dass ich crossMat
zu einem RowMatrix verwandeln sholud, mit .toRowMatrix()
Methode:
val crossRowMat = crossMat.toRowMatrix()
und schließlich kann ich mich bewerben
crossRowMat.tallSkinnyQR()
aber dieser Prozess viele Transformationen zwischen den Typen der Distributed Matrices umfasst und nach dem, was ich von MLlib Programming Guide verstand dies ist teuer:
Es ist sehr wichtig, das richtige Format zu speichern groß und verteilt zu wählen Matrizen. Das Konvertieren einer verteilten Matrix in ein anderes Format erfordert möglicherweise ein globales Shuffle, was ziemlich teuer ist.
Würde jemand bitte ausarbeiten.
Würden Sie bitte meine aktualisierte Version überprüfen. – user8547317