2016-07-19 10 views
2

私はpysparkで行列の乗算を行う必要がありますが、DenseMatrixで行う方法は見つけられません。次のエラーで例えばpyspark.mllib 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ストリーミングでこれを行う通常の方法は何ですか?

ご迷惑をおかけして申し訳ありません。

敬具、 ノエリア

答えて

2

pyspark.ml.linalg.Matrixpyspark.mllib.linalg.Matrixどちらも行列の乗算を実装しています。これらのクラスは、ほとんどがmllib/mlアルゴリズムの交換フォーマットとして使用され、線形代数の完全なデータ構造として使用するようには設計されていません。

ML/MLlibアルゴリズムにデータを渡す以上のものが必要な場合は、標準のNumPy/SciPyスタックを使用してください。

+1

ありがとうございます。私は 'numArray()'を標準のnumpy関数を使うように変換すると仮定しますが、乗算の際に並列処理を中止しますか?私はBlockMatrixの使用をお勧めしますあなたの応答[ここ](http://stackoverflow.com/questions/37766213/spark-matrix-multiplication-with-python)を見ました。ポスターがBlockMatrixに変換されず、並列化された方法で乗算を行うことはできますか? – Rhubarb

+1

@Rhubarb 'pyspark。{ml | mllib} .lengthg.DenseMatrix'はまったく配布されていません。並列化は、下層の線形代数ライブラリに依存します。 'BlockMatrix'への変換に関して - データがメモリに収まる限り、良いネイティブバインディングを持つ行列の乗算は、より速く発注されます。このような変換はほとんど意味がありません。しかし、技術的には可能です。 – zero323

+0

ありがとう、それは私が考えていたものです。メモリに収まる限り、ベクトル化された操作を「並列化」しようとしても意味がありません。右? @ Rhubarb Yeah。 – Rhubarb