2017-09-20 12 views
1

私はpyspark tf-idf関数を適用し、次の結果を得ました。pysparkのTF-IDFデータフレームにSVDを適用する方法

| features | 
|----------| 
| (35,[7,9,11,12,19,26,33],[1.2039728043259361,1.2039728043259361,1.2039728043259361,1.6094379124341003,1.6094379124341003,1.6094379124341003,1.6094379124341003]) | 
| (35,[0,2,4,5,6,11,22],[0.9162907318741551,0.9162907318741551,1.2039728043259361,1.2039728043259361,1.2039728043259361,1.2039728043259361,1.6094379124341003]) | 

したがって、スパースベクトルを行として含む1つの列(フィーチャ)を持つデータフレームです。

今、私は私は次のことを試してみましたが、うまくいきませんでした

https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=svd#pyspark.mllib.linalg.distributed.IndexedRowMatrix.computeSVDこっちで説明されてSVD機能を実行できるように、このデータフレームからIndexRowMatrixを構築したい:

mat = RowMatrix(tfidfData.rdd.map(lambda x: x.features)) 

TypeError: Cannot convert type <class 'pyspark.ml.linalg.SparseVector'> into Vector 

私はRowMatrixを使用しました。なぜなら、タプルを提供する必要はありませんが、RowMatrixを構築することすらできないからです。 IndexedRowMatrixは私にとってもっと難しいでしょう。

したがって、ts-idfデータフレームをpysparkに出力してIndexedRowMatrixを実行する方法はありますか?

答えて

2

私はそれを解決することができます。 RowMatrixがpyspark.ml.linalg.SparseVectorベクターを受け入れないというエラーが表示されたので、このベクトルをpyspark.mllib.linalgに変換しました。mlmllibに注意してください。次に、TF-IDF出力をRowMatrixに変換し、computeSVDメソッドを適用するコードスニペットを次に示します。私は密行列に変換しているが、あなたはml.linalg.SparseVector

mllib.linalg.SparseVectorに変換するコードのいくつかの余分な行を書くことができます

from pyspark.mllib.linalg import Vectors 
mat = RowMatrix(df.rdd.map(lambda v: Vectors.dense(v.rawFeatures.toArray()))) 

関連する問題