使用 Spark CountVectorizer 时如何“标准化”向量值?

lee*_*lee 5 apache-spark countvectorizer

CountVectorizer并且CountVectorizerModel经常创建一个稀疏特征向量,如下所示:

(10,[0,1,4,6,8],[2.0,1.0,1.0,1.0,1.0])
Run Code Online (Sandbox Code Playgroud)

这基本上表示词汇表的总大小为 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])
Run Code Online (Sandbox Code Playgroud)

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

那么有没有一种方法可以有效地做到这一点呢?

谢谢!

hi-*_*zir 3

您可以使用Normalizer

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

使用给定的 p-范数将向量标准化为具有单位范数。

具有1-范数

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])|
# +--------------------------------------+---------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)