У меня есть X, распределенная матрица, в форме RowMatrix. Я использую Spark 1.3.0. Мне нужно вычислить X обратное.Как вычислить инверсию RowMatrix в Apache Spark?
ответ
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)
}
У меня были проблемы с использованием этой функции с опцией
conf.set("spark.sql.shuffle.partitions", "12")
Строки в RowMatrix получил перемешиваются.
Вот обновление, которое работало для меня
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)
}
Матрицы U возвращаемой X.computeSVD
имеет размеры MXk где м является количеством строк исходного (распределенным) RowMatrix X. Можно был бы ожидать м будет большой (возможно, больше k), поэтому нецелесообразно собирать его в драйвере, если мы хотим, чтобы наш код масштабировался до действительно больших значений m.
Я бы сказал, что оба из нижеприведенных решений страдают от этого недостатка. Ответ, заданный @Alexander Kharlamov
, вызывает val U = svd.U.toBlockMatrix().toLocalMatrix()
, который собирает матрицу в драйвере. То же самое происходит с ответом @Climbs_lika_Spyder
(кстати, ваши ник-камни !!), который вызывает svd.U.rows.collect.flatMap(x => x.toArray)
. Я предпочел бы полагаться на распределенное умножение матрицы, такое как код Scala, отправленный here.
- 1. Как создать пустую RowMatrix в Apache Spark
- 2. RowMatrix, MLlib, Java Spark
- 3. Apache Spark - вычислить корреляцию
- 4. как правильно вычислить инверсию матрицы?
- 5. Разница между RowMatrix и Matrix в Apache Spark?
- 6. Вычислить инверсию функции
- 7. Как вычислить процентили в Apache Spark
- 8. Матрица Transpose на RowMatrix в Spark
- 9. Как вычислить точную медиану с Apache Spark?
- 10. Пытаясь вычислить инверсию квадратной матрицы
- 11. Как вычислить инверсию близкой к сингулярной матрице в R?
- 12. Как вычислить инверсию нормальной кумулятивной функции распределения в python?
- 13. Вычислить WeekOfMonth & WeekOfYear с определенной даты в Apache Spark
- 14. Решение крупномасштабной линейной системы в Apache Spark
- 15. Преобразование матрицы в RowMatrix в Apache Спарк с помощью Scala
- 16. print CoordinateMatrix после использования RowMatrix.columnСравнения в Apache Spark
- 17. Как работает Apache Spark?
- 18. Равенство DataFrame в Apache Spark
- 19. psutil в Apache Spark
- 20. Сортировка в Apache Spark
- 21. Apache Spark в
- 22. Косинус-сходство на TFIDF с использованием apache spark
- 23. Авторизация в Apache Spark
- 24. Как использовать Apache Spark с Apache Nutch
- 25. Как использовать инверсию GenericRelation
- 26. Apache Spark - датированный для dataframes?
- 27. Как выбрать инверсию запроса
- 28. Как изменить RowMatrix в массив в Spark или экспортировать его как CSV?
- 29. Apache Spark: экспоненциальная скользящая средняя
- 30. Apache Spark vs Apache Ignite
Я не вижу никаких обратных вычислений по добавленной ссылке. –
@Climbs_lika_Spyder Ссылка о распределении распределенной матрицы для замены умножения локальной матрицы '(V.multiply (invS)). Умножить (U)' в последней строке вашего решения, чтобы вам не нужно было собирать 'U', в драйвере. Я думаю, что 'V' и' invS' недостаточно велики, чтобы создавать проблемы. – Pablo