Tôi có ma trận X, phân tán, ở dạng RowMatrix. Tôi đang sử dụng Spark 1.3.0. Tôi cần để có thể tính nghịch đảo X.Làm thế nào để tính toán nghịch đảo của một RowMatrix trong Apache Spark?
Trả lời
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)
}
Tôi đã có vấn đề sử dụng chức năng này với tùy chọn
conf.set("spark.sql.shuffle.partitions", "12")
Các hàng trong RowMatrix bị xáo trộn.
Dưới đây là một bản cập nhật mà làm việc cho tôi
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 trả về bởi X.computeSVD
có kích thước mxk nơi m là số hàng của bản gốc (phân phối) RowMatrix X. Một mong chờ m phải lớn (có thể lớn hơn k), vì vậy không nên thu thập nó trong trình điều khiển nếu chúng tôi muốn mã của chúng tôi mở rộng đến các giá trị thực sự lớn là m.
Tôi sẽ nói cả hai giải pháp dưới đây đều bị lỗ hổng này. Câu trả lời được đưa ra bởi @Alexander Kharlamov
gọi val U = svd.U.toBlockMatrix().toLocalMatrix()
thu thập ma trận trong trình điều khiển. Điều tương tự cũng xảy ra với câu trả lời được đưa ra bởi @Climbs_lika_Spyder
(btw đá nick của bạn !!), gọi số svd.U.rows.collect.flatMap(x => x.toArray)
. Tôi thà đề nghị dựa vào một phép nhân ma trận phân tán như mã Scala được đăng here.
- 1. Thuật toán để tính toán nghịch đảo của đa thức
- 2. Làm thế nào để tính toán giai thừa nghịch đảo của một số thực?
- 3. Tính nghịch đảo trong các giao thức apache
- 4. Tính nghịch đảo quaternion
- 5. Mongoose: Làm thế nào để mô hình hóa một mối quan hệ nghịch đảo/nghịch đảo?
- 6. Tính nghịch đảo của hàm - Thư viện
- 7. nghịch đảo của math.atan2?
- 8. Làm thế nào để tính toán nghịch đảo của hàm phân phối tích lũy chuẩn trong python?
- 9. Có một nghịch đảo của toán tử Haskell $ không?
- 10. Tính toán Sympy biến đổi Laplace nghịch đảo
- 11. Có một nghịch đảo của System.Diagnostics.ConditionalAttribute?
- 12. Thuộc tính nghịch đảo trong NHibernate
- 13. Cách hiệu quả để tính toán đường chéo của nghịch đảo của ma trận
- 14. Ma trận Transpose trên RowMatrix trong Spark
- 15. Tính toán nghịch đảo của ma trận sử dụng lapack trong C
- 16. tính số lượng "nghịch đảo" trong một hoán vị
- 17. Tính nghịch đảo của ma trận rất lớn
- 18. Làm cách nào để tính toán nghịch đảo của ma trận thưa thớt trong thư viện Eigen
- 19. NumPy có nghịch đảo của unravel_index() không?
- 20. Nghịch đảo của bitwise AND trong C# là gì?
- 21. Giải quyết cho nghịch đảo của một hàm trong R
- 22. Làm thế nào để chạy Nguồn Apache Spark trong C#
- 23. Làm thế nào để loại bỏ mọi phần tử khác của một mảng trong python? (Nghịch đảo của np.repeat()?)
- 24. Số nghịch đảo trong C#
- 25. Nghịch đảo trái trong numpy hoặc scipy?
- 26. Làm thế nào để làm nghịch đảo trên ma trận phức tạp trong OpenCV?
- 27. Làm cách nào tôi có thể tính toán trung bình chính xác với Apache Spark?
- 28. Làm thế nào để Spectrum-nghịch đảo một tín hiệu âm thanh lấy mẫu
- 29. Làm thế nào để trích xuất một chuỗi con bằng mẫu nghịch đảo với R?
- 30. cách sử dụng nghịch đảo trong C
Tôi không thấy bất kỳ phép tính nghịch đảo nào tại liên kết bạn đã thêm. –
@Climbs_lika_Spyder Liên kết là về phép nhân ma trận phân tán để thay thế phép nhân ma trận cục bộ '(V.multiply (invS)) nhân (U)' trong dòng cuối cùng của giải pháp, do đó bạn không cần thu thập 'U' trong tài xế. Tôi nghĩ rằng 'V' và' invS' không đủ lớn để gây ra vấn đề. – Pablo