【问题标题】:convert Dense Vector to Sparse Vector in PySpark在 PySpark 中将密集向量转换为稀疏向量
【发布时间】:2021-03-29 15:52:44
【问题描述】:

PySpark 中是否有内置方法可以从密集向量创建稀疏向量?我这样做的方式如下:

Vectors.sparse(len(denseVector), [(i,j) for i,j in enumerate(denseVector)  if j != 0 ])

满足 [size, (index, data)] 格式。似乎有点hacky。有没有更有效的方法?

【问题讨论】:

    标签: pyspark


    【解决方案1】:
    import scipy.sparse
    from pyspark.ml.linalg import Vectors, _convert_to_vector, VectorUDT
    from pyspark.sql.functions import udf, col
    

    如果你只有一个密集向量,这将做到:

    def dense_to_sparse(vector):
        return _convert_to_vector(scipy.sparse.csc_matrix(vector.toArray()).T)
    
    dense_to_sparse(densevector)
    

    这里的技巧是 csc_matrix.shape[1] 必须等于 1,所以转置向量。看看_convert_to_vector的源码:https://people.eecs.berkeley.edu/~jegonzal/pyspark/_modules/pyspark/mllib/linalg.html

    更有可能的情况是你有一个带有一列密集向量的 DF:

    to_sparse = udf(dense_to_sparse, VectorUDT())
    DF.withColumn("sparse", to_sparse(col("densevector"))
    

    【讨论】:

      【解决方案2】:

      我不确定您使用的是 mllib 还是 ml。无论如何,你可以这样转换:

      from pyspark.mllib.linalg import Vectors as mllib_vectors
      from pyspark.ml.linalg import Vectors as ml_vectors
      
      # Construct dense vectors in mllib and ml
      v1 = mllib_vectors.dense([1.0, 1.0, 0, 0, 0])
      v2 = ml_vectors.dense([1.0, 1.0, 0, 0, 0])
      
      # Convert ml dense vector to sparse vector
      arr2 = v2.toArray()
      print('arr2', arr2)
      d = {i:arr2[i] for i in np.nonzero(arr2)[0]}
      print('d', d)
      
      v4 = ml_vectors.sparse(len(arr2), d)
      print('v4: %s' % v4)
      
      
      # Convert mllib dense vector to sparse vector
      v6 = ml_vectors.sparse(len(arr2), d)
      print('v6: %s' % v6)
      

      【讨论】:

        猜你喜欢
        • 2017-05-10
        • 2018-12-25
        • 2017-07-29
        • 2016-06-02
        • 2015-10-09
        • 1970-01-01
        • 2017-01-01
        • 2013-07-28
        • 2020-05-22
        相关资源
        最近更新 更多