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

使用Spark CountVectorier时如何“规格化”向量值?

  •  3
  • lee  · 技术社区  · 7 年前

    CountVectorizer CountVectorizerModel 通常会创建如下所示的稀疏特征向量:

    (10,[0,1,4,6,8],[2.0,1.0,1.0,1.0,1.0])
    

    这基本上表示词汇表的总大小为10,当前文档有5个唯一元素,在特征向量中,这5个唯一元素位于0、1、4、6和8。此外,其中一个元素显示两次,因此为2.0值。

    现在,我想“规范化”上述特征向量,并使其如下所示,

    (10,[0,1,4,6,8],[0.3333,0.1667,0.1667,0.1667,0.1667])
    

    i、 每个值除以6,即所有元素的总数。例如 0.3333 = 2.0/6 .

    那么,有没有办法有效地做到这一点?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    4 年前

    您可以使用 Normalizer

    class pyspark.ml.feature.Normalizer(*args, **kwargs)

    使用给定的p-范数规范化向量,使其具有单位范数。

    具有 1-norm

    from pyspark.ml.linalg import SparseVector
    from pyspark.ml.feature import Normalizer
    
    df = spark.createDataFrame([
        (SparseVector(10,[0,1,4,6,8],[2.0,1.0,1.0,1.0,1.0]), )
    ], ["features"])
    
    Normalizer(inputCol="features", outputCol="features_norm", p=1).transform(df).show(1, False)
    # +--------------------------------------+---------------------------------------------------------------------------------------------------------------------+
    # |features                              |features_norm                                                                                                        |
    # +--------------------------------------+---------------------------------------------------------------------------------------------------------------------+
    # |(10,[0,1,4,6,8],[2.0,1.0,1.0,1.0,1.0])|(10,[0,1,4,6,8],[0.3333333333333333,0.16666666666666666,0.16666666666666666,0.16666666666666666,0.16666666666666666])|
    # +--------------------------------------+---------------------------------------------------------------------------------------------------------------------+