แปลง Dense Vector เป็น Sparse Vector ใน PySpark

มีวิธีสร้างเวกเตอร์กระจัดกระจายจากเวกเตอร์หนาแน่นใน PySpark หรือไม่? วิธีที่ฉันทำมีดังต่อไปนี้:

Vectors.sparse(len(denseVector), [(i,j) for i,j in enumerate(denseVector)  if j != 0 ])

ซึ่งเป็นไปตามรูปแบบ [ขนาด (ดัชนี ข้อมูล)] ดูเหมือนแฮ็คเลย มีวิธีที่มีประสิทธิภาพกว่านี้ไหม?


person manjam    schedule 25.05.2017    source แหล่งที่มา


คำตอบ (2)


import scipy.sparse
from pyspark.ml.linalg import Vectors, _convert_to_vector, VectorUDT
from pyspark.sql.functions import udf, col

หากคุณมีเวกเตอร์หนาแน่นเพียงอันเดียว สิ่งนี้จะทำได้:

def dense_to_sparse(vector):
    return _convert_to_vector(scipy.sparse.csc_matrix(vector.toArray()).T)

dense_to_sparse(densevector)

เคล็ดลับในที่นี้คือ csc_matrix.shape[1] จะต้องเท่ากับ 1 ดังนั้นให้ย้ายเวกเตอร์ ดูที่มาของ _convert_to_vector: https://people.eecs.berkeley.edu/~jegonzal/pyspark/_modules/pyspark/mllib/linalg.html

สถานการณ์ที่เป็นไปได้มากกว่าคือคุณมี DF พร้อมคอลัมน์ที่มีความหนาแน่นสูง:

to_sparse = udf(dense_to_sparse, VectorUDT())
DF.withColumn("sparse", to_sparse(col("densevector"))
person Tim    schedule 01.11.2017

ฉันไม่แน่ใจว่าคุณใช้ mllib หรือ ml อย่างไรก็ตาม คุณสามารถแปลงได้ดังนี้:

from pyspark.mllib.linalg import Vectors as mllib_vectors
from pyspark.ml.linalg import Vectors as ml_vectors

# Construct dense vectors in mllib and ml
v1 = mllib_vectors.dense([1.0, 1.0, 0, 0, 0])
v2 = ml_vectors.dense([1.0, 1.0, 0, 0, 0])

# Convert ml dense vector to sparse vector
arr2 = v2.toArray()
print('arr2', arr2)
d = {i:arr2[i] for i in np.nonzero(arr2)[0]}
print('d', d)

v4 = ml_vectors.sparse(len(arr2), d)
print('v4: %s' % v4)


# Convert mllib dense vector to sparse vector
v6 = ml_vectors.sparse(len(arr2), d)
print('v6: %s' % v6)
person DennisLi    schedule 29.03.2021