【问题标题】:Reconstruct Matrix from svd components with Pyspark使用 Pyspark 从 svd 组件重建矩阵
【发布时间】:2019-07-24 04:44:05
【问题描述】:

我正在使用 pyspark 进行 SVD。但是在documentation 以及其他任何地方我都没有找到如何使用分段向量重建矩阵。例如,使用pyspark 的svd,我得到了UsV矩阵如下。

from pyspark.mllib.linalg import Vectors
from pyspark.mllib.linalg.distributed import RowMatrix
rows = sc.parallelize([
    Vectors.sparse(5, {1: 1.0, 3: 7.0}),
    Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
    Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
])

mat = RowMatrix(rows)

# Compute the top 5 singular values and corresponding singular vectors.
svd = mat.computeSVD(5, computeU=True)
U = svd.U       # The U factor is a RowMatrix.
s = svd.s       # The singular values are stored in a local dense vector.
V = svd.V       # The V factor is a local dense matrix.

现在,我想通过将原始矩阵相乘来重建原始矩阵。等式是:

mat_cal = U.diag(s).V.T

在python中,我们可以很容易地做到这一点。但在 pyspark 我没有得到结果。 我找到了this 链接。但它在 scala 中,我不知道如何在 pyspark 中转换它。如果有人可以指导我,那将非常有帮助。

谢谢!

【问题讨论】:

    标签: apache-spark pyspark apache-spark-mllib svd


    【解决方案1】:

    转换to diagonal matrix 987654321 Σ

    import numpy as np
    from pyspark.mllib.linalg import DenseMatrix
    
    Σ = DenseMatrix(len(s), len(s), np.diag(s).ravel("F"))
    

    转换@ 987654328,convert to column major然后转换回DenseMatrix

    V_ = DenseMatrix(V.numCols, V.numRows, V.toArray().transpose().ravel("F"))
    

    Multiply

    mat_ = U.multiply(Σ).multiply(V_) 
    

    检查结果:

    for row in mat_.rows.take(3): 
        print(row.round(12)) 
    
    [0. 1. 0. 7. 0.]
    [2. 0. 3. 4. 5.]
    [4. 0. 0. 6. 7.]
    

    检查the norm

    np.linalg.norm(np.array(rows.collect()) - np.array(mat_.rows.collect())
    
    1.2222842061189339e-14
    
    当然,最后两个步骤仅用于测试,并且在现实生活数据上不会是可行的。

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2014-07-14
      相关资源
      最近更新 更多