我有一個X,分佈矩陣,在RowMatrix形式。我正在使用Spark 1.3.0。我需要能夠計算X逆。如何計算Apache Spark中RowMatrix的逆函數?
6
A
回答
6
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)
}
3
我使用這個功能與選項
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)
}
0
矩陣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)
。我寧願建議依靠分佈式矩陣乘法,例如發佈了here的Scala代碼。
相關問題
- 1. 如何計算Apache Spark中兩個分佈式RowMatrix的點積?
- 2. 如何在Apache Spark中創建一個空的RowMatrix
- 3. Apache Spark中的Jaro-Winkler分數計算
- 4. 如何使用Apache Spark計算確切的中位數?
- 5. Apache Spark - 計算相關性
- 6. 在MATLAB中計算函數的逆函數
- 7. 如何計算Apache Spark中的百分比
- 8. Apache Spark - 如何計算配對RDD中的相似鍵/值對
- 9. 如何在apache commons math3庫中計算函數的集成?
- 10. 如何計算Apache Spark DataFrame中所有列的不同值的數量
- 11. 用Apache Spark計算堪培拉距離
- 12. 計算四元數逆
- 13. Apache Spark reduceByKey總計小數
- 14. Apache Spark DStream中的計數元素
- 15. Matlab:如何計算矩陣的逆
- 16. Python:計算僞逆矩陣的逆
- 17. 如何計算「查看逆矩陣」
- 18. 如何在Python中高效計算正態逆累積分佈函數
- 19. 如何計算prolog中的函數?
- 20. 如何在逆波蘭計算器中添加多位整數
- 21. 從Apache Spark中的給定日期計算WeekOfMonth&WeekOfYear
- 22. 使用Apache Spark,如何計算Scala陣列中每個對的出現
- 23. 如何使用Scala微風計算正態累積分佈函數(cdf)的逆?
- 24. 如何計算Spark RDD的平均值?
- 25. 如何在Apache Spark中聚合數據
- 26. Apache Spark - 異常處理如何在映射函數中工作
- 27. 如何在Java Spark的Apache Spark中無參數地註冊UDF
- 28. 調整Apache Spark MLlib算法
- 29. Apache Spark數據局部性算法
- 30. 使用OpenSSL BIGNUMs的數學:如何計算乘法逆?
我沒有看到您添加的鏈接上的任何逆向計算。 –
@Climbs_lika_Spyder該鏈接是關於分佈式矩陣乘法,用於替換解決方案最後一行中的局部矩陣乘法'(V.multiply(invS))。multiply(U)',這樣就不需要收集'U'在司機。我認爲'V'和'invS'不夠大會導致問題。 – Pablo