代码之家  ›  专栏  ›  技术社区  ›  user2377528

如何在pyspark的TF-IDF数据帧上应用奇异值分解

  •  2
  • user2377528  · 技术社区  · 7 年前

    我应用了pyspark tf idf函数,得到了以下结果。

    | 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列(特征),其中包含作为行的稀疏部分。

    现在我想从这个数据帧构建IndexRowMatrix,这样我就可以运行这里描述的奇异值分解函数 https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=svd#pyspark.mllib.linalg.distributed.IndexedRowMatrix.computeSVD

    我尝试了以下方法,但没有成功:

    mat = RowMatrix(tfidfData.rdd.map(lambda x: x.features))
    
    TypeError: Cannot convert type <class 'pyspark.ml.linalg.SparseVector'> into Vector
    

    那么,如何在pyspark中tf idf数据帧的输出上运行IndexedRowMatrix呢?

    2 回复  |  直到 7 年前
        1
  •  3
  •   user2377528 user2377528    7 年前

    我能解决它。 因此,正如错误所示,RowMatrix不会接受 pyspark.ml.linalg.SparseVector 向量,所以我把这个向量转换成 pyspark.mllib.linalg ml mllib . 下面是将TF-IDF输出转换为RowMatrix的代码段,您可以对其应用computeSVD方法。

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

    我已经转换为密集矩阵,但你可以写一些额外的代码行来转换 ml.linalg.SparseVector 进入 mllib.linalg.SparseVector

        2
  •  0
  •   Gunnvant    4 年前

    mllib.linalg.SparseVector

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