Mam X, macierz rozproszonych, w formularzu RowMatrix. Używam Spark 1.3.0. Muszę umieć obliczyć X odwrotnie.Jak obliczyć odwrotność RowMatrix w Apache Spark?
Odpowiedz
import org.apache.spark.mllib.linalg.{Vectors,Vector,Matrix,SingularValueDecomposition,DenseMatrix,DenseVector}
import org.apache.spark.mllib.linalg.distributed.RowMatrix
def computeInverse(X: RowMatrix): DenseMatrix = {
val nCoef = X.numCols.toInt
val svd = X.computeSVD(nCoef, computeU = true)
if (svd.s.size < nCoef) {
sys.error(s"RowMatrix.computeInverse called on singular matrix.")
}
// Create the inv diagonal matrix from S
val invS = DenseMatrix.diag(new DenseVector(svd.s.toArray.map(x => math.pow(x,-1))))
// U cannot be a RowMatrix
val U = new DenseMatrix(svd.U.numRows().toInt,svd.U.numCols().toInt,svd.U.rows.collect.flatMap(x => x.toArray))
// If you could make V distributed, then this may be better. However its alreadly local...so maybe this is fine.
val V = svd.V
// inv(X) = V*inv(S)*transpose(U) --- the U is already transposed.
(V.multiply(invS)).multiply(U)
}
miałem problemy przy użyciu tej funkcji z opcją
conf.set("spark.sql.shuffle.partitions", "12")
Wiersze RowMatrix został tasuje.
Tutaj jest aktualizacja, która pracowała dla mnie
import org.apache.spark.mllib.linalg.{DenseMatrix,DenseVector}
import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix
def computeInverse(X: IndexedRowMatrix)
: DenseMatrix =
{
val nCoef = X.numCols.toInt
val svd = X.computeSVD(nCoef, computeU = true)
if (svd.s.size < nCoef) {
sys.error(s"IndexedRowMatrix.computeInverse called on singular matrix.")
}
// Create the inv diagonal matrix from S
val invS = DenseMatrix.diag(new DenseVector(svd.s.toArray.map(x => math.pow(x, -1))))
// U cannot be a RowMatrix
val U = svd.U.toBlockMatrix().toLocalMatrix().multiply(DenseMatrix.eye(svd.U.numRows().toInt)).transpose
val V = svd.V
(V.multiply(invS)).multiply(U)
}
Matrix U zwrócone przez X.computeSVD
ma wymiary MXK gdzie m jest liczba wierszy oryginalnego (rozproszonej) RowMatrix X. Można by oczekiwać m być duże (prawdopodobnie większe niż k), więc nie jest wskazane, aby zebrać je w sterowniku, jeśli chcemy, aby nasz kod do skalowania do bardzo dużych wartości m.
Powiedziałbym, że oba poniższe rozwiązania mają tę wadę. Odpowiedź podana przez @Alexander Kharlamov
dzwoni val U = svd.U.toBlockMatrix().toLocalMatrix()
, która zbiera matrycę w sterowniku. To samo dzieje się z odpowiedzią podaną przez @Climbs_lika_Spyder
(twoja nić skał !!), która wywołuje svd.U.rows.collect.flatMap(x => x.toArray)
. Proponuję raczej polegać na mnożeniu macierzy rozproszonej, takiej jak kod Scala, opublikowany here.
- 1. Apache Spark vs Apache Spark 2
- 2. Jak mogę obliczyć odwrotność rzadkiej macierzy w bibliotece Eigen
- 3. Jak obliczyć odwrotność normalnej funkcji rozkładu skumulowanego w pythonie?
- 4. Apache Spark vs Apache Ignite
- 5. Apache Spark vs. Apache Storm
- 6. Mnożenie macierzy w Apache Spark
- 7. Korzystanie R w Apache Spark
- 8. Apache Spark ALS Rekomendacja
- 9. Odwrotność macierzy w SymPy?
- 10. Uboczny Argumenty Apache Spark
- 11. Równość DataFrame w Apache Spark
- 12. Elasticsearch + wydajność Apache Spark
- 13. Apache Drill kontra Spark
- 14. Jak obliczyć skumulowaną sumę użyciu Spark
- 15. Konwersja RDD wektora w LabeledPoint za pomocą Scala - MLLib w Apache Spark
- 16. odwrotność math.atan2?
- 17. Apache Spark GraphX podłączone komponenty
- 18. Apache Spark - MlLib - Filtrowanie grupowe
- 19. Konfiguracja portów sieciowych Apache Spark
- 20. Błąd Apache Spark podczas startu
- 21. Zalecenia Apache Spark ALS podejście
- 22. Apache Spark na EC2 "Zabity"
- 23. Używanie reduceByKey w Apache Spark (Scala)
- 24. Równość klasy Case w Apache Spark
- 25. Czytaj wielowierszowy JSON w Apache Spark
- 26. Strumień wyjściowy Apache Spark w Pythonie
- 27. Czytanie ładnych plików json w Apache Spark
- 28. Okresowa transmisja w Apache Spark Streaming
- 29. Jak wykonać odwrotność `xargs`?
- 30. Jakie są różnice między Apache Spark i Apache Apex?
Nie widzę żadnych odwrotnych obliczeń w dodanym łączu. –
@Climbs_lika_Spyder Link dotyczy mnożenia macierzy rozproszonych w celu zastąpienia mnożenia macierzy lokalnej '(V.multiply (invS)). Mnożenia (U)' w ostatniej linijce twojego rozwiązania, abyś nie musiał zbierać 'U' w kierowcy. Myślę, że 'V' i' invS' nie są wystarczająco duże, aby powodować problemy. – Pablo