pyspark.mllib 密集矩阵乘法

Posted

技术标签:

【中文标题】pyspark.mllib 密集矩阵乘法【英文标题】:pyspark.mllib DenseMatrix multiplication 【发布时间】:2016-07-19 11:40:38 【问题描述】:

我必须在 PySpark 中进行矩阵乘法,但找不到使用 DenseMatrix 的方法。例如

from pyspark.mllib.linalg import DenseMatrix

Q = DenseMatrix(nfeatures, nfeatures, [1, 0, 0, 0, 1, 0, 0, 0, 1])
w = DenseMatrix(nfeatures, 1, [0, 0, 0])
print( Q * w )

导致以下错误:

TypeError: unsupported operand type(s) for *: 'DenseMatrix' and 'DenseMatrix'

我做错了什么?有没有做矩阵乘法的方法? PySpark 流式处理的常用方法是什么?

最好的问候, 诺莉亚

【问题讨论】:

【参考方案1】:

pyspark.ml.linalg.Matrixpyspark.mllib.linalg.Matrix 都没有实现矩阵乘法。这些类主要用作mllib / ml 算法的交换格式,并非旨在用作线性代数的全功能数据结构。

如果您需要的不仅仅是将数据传递给某些 ML / MLlib 算法,只需使用标准 NumPy / SciPy 堆栈。

【讨论】:

感谢您的回答。我假设一旦我们将toArray() 转换为使用标准的 numpy linalg 函数,我们就放弃了乘法时任何潜在的并行化?我看到您的回复here,您建议使用 BlockMatrix。海报不能转换为 BlockMatrix 并在那里以并行方式进行乘法吗? @Rhubarb pyspark.ml|mllib.linalg.DenseMatrix 根本没有分发。并行化将取决于底层的线性代数库。关于转换为BlockMatrix - 只要数据适合具有良好本机绑定的内存矩阵乘法,就会快一个数量级。所以像这样的转换很少有意义。但从技术上讲,这是可能的。 谢谢,我就是这么想的。只要它适合内存,尝试“并行化”矢量化操作就没有意义。对吗? @Rhubarb 是的。这通常适用于任何小型结构。

以上是关于pyspark.mllib 密集矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

在 ARM / Raspberry PI 上的多个内核上运行 Eigen 密集矩阵乘法时性能下降

为什么稀疏密集乘法比密集稀疏乘法更快?

向量矩阵乘法、浮点向量、二进制矩阵

Numpy/Scipy 稀疏与密集乘法

CUDA矩阵乘法的性能

使用 Numpy 进行大规模矩阵乘法