【问题标题】:Basic linear algebra on spark matrices火花矩阵的基本线性代数
【发布时间】:2021-03-23 18:46:42
【问题描述】:

我正在尝试在存储为 spark RowMatrix 的矩阵上运行一些基本的线性代数运算(特别是转置、点积和逆),如此处所述here(使用 Python API)。按照文档中的示例(对于我来说,矩阵中会有更多行,因此需要 Spark),假设我有这样的东西:

from pyspark.mllib.linalg.distributed import RowMatrix
# Create an RDD of vectors.
rows = sc.parallelize([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# Create a RowMatrix from an RDD of vectors.
mat = RowMatrix(rows)

给定这样一个分布式矩阵,是否存在进行矩阵转置和点积的例程,例如:

dot(mat.T,mat)

还是逆矩阵?

inverse(mat)

我似乎在文档中找不到任何关于此的内容。寻找 (a) 指向相关文档的指针或 (b) 自己实现此功能的方法。

【问题讨论】:

  • 您必须将数据存储为 spark RowMatrix 吗?在 pandas 中做你想做的事很容易。
  • 当我说“我将在矩阵中有更多行”时,我想我可能会更清楚。该数据对于内存(因此对于 pandas)来说太大了。如果可能的话,我会直接使用 numpy 数组和矩阵运算...

标签: python matrix apache-spark


【解决方案1】:

目前(Spark 1.6.0)pyspark.mllib.linalg.distributed API 仅限于基本操作,如计算行/列和类型之间的转换。

Scala API 支持更广泛的方法集,包括乘法(RowMatrix.multiplyIndexed.RowMatrix.multiply)、转置、SVD(IndexedRowMatrix.computeSVD)、QR 分解(RowMatrix.tallSkinnyQR)、格拉姆矩阵计算(computeGramianMatrix)、PCA (RowMatrix.computePrincipalComponents) 可以用来实现更复杂的线性代数函数。

【讨论】:

  • 啊,我明白了。您是否知道在 Python API 中公开该功能的任何方法,或者完全不可能?
  • 嗯,这并非不可能。 pyspark.mllib.linalg.distributed 只是 Scala API 的封装,大部分工作都是通过 self._java_matrix_wrapper.call 完成的。从理论上讲,您可以添加自己的方法,但我不确定是否值得大惊小怪。
  • 好吧,我想我们必须比较在 scala 中重新实现我们的模型与实现这些方法的相对大惊小怪......
  • 这不是唯一的选择。例如,如果您有一个又长又细的矩阵,您可以使用局部向量轻松实现一些操作(如 t(x) %*% t)。 SVD 可以迭代计算,它是一种获得伪逆的捷径。最后,用 Scala 编写算法并只转换输入和输出是有意义的。
  • 据我所知不是,但您可以使用 QR 或 SVD 来计算伪逆。见:en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse
【解决方案2】:

在 Spark 1.6 及更高版本中,您可以通过 BlockMatrix 类进行矩阵算术运算。 Spark 1.6 中只有乘法和加法可用。在 Spark 2.0 中,添加了更多内容。在撰写本文时,您必须手动实现逆,但点和转置是可用的。 https://github.com/apache/spark/blob/branch-2.0/python/pyspark/mllib/linalg/distributed.py#L811。这是一个 Spark 1.6 示例。

from pyspark.mllib.linalg.distributed import IndexedRow, IndexedRowMatrix, BlockMatrix

sc = SparkContext()
rows = sc.parallelize([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) \
    .zipWithIndex()

# need a SQLContext() to generate an IndexedRowMatrix from RDD
sqlContext = SQLContext(sc)
rows = IndexedRowMatrix( \
    rows \
    .map(lambda row: IndexedRow(row[1], row[0])) \
    ).toBlockMatrix()

mat_product = rows.multiply(<SOME OTHER BLOCK MATRIX>)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2016-10-15
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多