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

时间:2018-01-03 13:01:11

标签: pyspark sparse-matrix apache-spark-ml

有人可以解释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”时,我得到不同的回报

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,但它也会返回密集的向量。也许有任何技巧来组合数据并仍然有稀疏数据作为输出。

1 个答案:

答案 0 :(得分: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分别返回的格式不同。

  

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

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