VectorAssembler行为和聚合稀疏数据与密集

问题描述 投票:0回答:1

有人可以解释VectorAssembler的行为吗?

from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(
    inputCols=['CategoryID', 'CountryID', 'CityID', 'tf'],
    outputCol="features")

output = assembler.transform(tf)
output.select("features").show(truncate=False)

通过show方法的代码返回给我

(262147,[0,1,2,57344,61006,80641,126469,142099,190228,219556,221426,231784],[2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0])

当我使用相同的变量“输出”时,我得到不同的回报

output.select('features').take(1)

[Row(features=SparseVector(262147, {0: 2.0, 1: 1.0, 2: 1.0, 57344: 1.0, 61006: 1.0, 80641: 1.0, 126469: 1.0, 142099: 1.0, 190228: 1.0, 219556: 1.0, 221426: 1.0, 231784: 1.0}))]

顺便说一下,考虑一下,“tfidf”有一个稀疏数组输出。我还有其他可用的数据(元数据)。我需要在Pyspark Dataframes中以某种方式聚合稀疏数组,并使用LSH算法的元数据。我已经尝试过VectorAssembler,但它也会返回密集的向量。也许有任何技巧来组合数据并仍然有稀疏数据作为输出。

pyspark sparse-matrix apache-spark-ml
1个回答
1
投票

只有两种回报的格式不同;在这两种情况下,你实际上得到了相同的稀疏向量。

  • 在第一种情况下,您将获得具有3个元素的稀疏向量:维度(262147)和两个列表,分别包含非零元素的索引和值。您可以轻松验证这些列表的长度是否相同,应该是: len([0,1,2,57344,61006,80641,126469,142099,190228,219556,221426,231784]) # 12 len([2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]) # 12
  • 在第二种情况下,您再次获得具有相同第一个元素的稀疏向量,但是这里将两个列表组合成{index: value}形式的字典,该字典与前一个表示的列表具有相同的长度: len({0: 2.0, 1: 1.0, 2: 1.0, 57344: 1.0, 61006: 1.0, 80641: 1.0, 126469: 1.0, 142099: 1.0, 190228: 1.0, 219556: 1.0, 221426: 1.0, 231784: 1.0} ) # 12

由于assembler.transform()返回Spark数据帧,因此差异是由于Spark SQL函数showtake分别返回的格式不同。

顺便说一句,考虑案例[...]

目前还不清楚你究竟在这里问什么,无论如何我建议你用一个可重复的例子打开一个新问题,因为它听起来像是一个不同的主题......

© www.soinside.com 2019 - 2024. All rights reserved.