【问题标题】:VectorAssembler output only to DenseVector?VectorAssembler 仅输出到 DenseVector?
【发布时间】:2016-06-21 00:54:51
【问题描述】:

VectorAssembler 的功能有一些很烦人的地方。 我目前正在将一组列转换为单列 向量,然后使用 StandardScaler 函数应用缩放 到包含的功能。但是,似乎有 SPARK 记忆 原因,决定是否应该使用 DenseVector 或 SparseVector 来表示每一行特征。 但是,当您需要使用 StandardScaler 时,SparseVector(s) 的输入 无效,只允许使用 DenseVectors。有人知道解决办法吗?

编辑: 我决定只使用 UDF 函数,这将 稀疏向量变为稠密向量。有点傻,但很有效。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    你说得对,VectorAssembler 会根据使用较少内存的哪一种来选择密集输出格式还是稀疏输出格式。

    SparseVector 转换为DenseVector 不需要UDF;只需使用toArray() method:

    from pyspark.ml.linalg import SparseVector, DenseVector 
    a = SparseVector(4, [1, 3], [3.0, 4.0])
    b = DenseVector(a.toArray())
    

    此外,StandardScaler 接受 SparseVector,除非您在创建时设置了 withMean=True。如果确实需要去均值,则必须从所有分量中减去一个(可能是非零)数字,这样稀疏向量就不会再稀疏了。

    【讨论】:

    • 如果不知道类型,就不能在map函数中调用toArray
    • 请详细说明。如何让 VectorAssembler 输出密集向量的完整源码。
    【解决方案2】:

    在 VectorAssembler 将其转换为稀疏向量后,您可以将其转换为密集向量。

    这就是我所做的,

    创建一个 DenseVector 案例类

    case class vct(features:Vector)
    

    将稀疏向量列转换为密集向量列

    val new_df = df.select("sparse vector column").map(x => { vct(x.getAs[org.apache.spark.mllib.linalg.SparseVector](1).toDense)}).toDF()

    【讨论】:

    • 问题在 PySpark 而不是 Scala 中。
    猜你喜欢
    • 2018-12-21
    • 2021-08-17
    • 1970-01-01
    • 2017-03-23
    • 2021-03-22
    • 2021-05-01
    • 2015-12-04
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多