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.Matrix
和 pyspark.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 密集矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章