2016-03-07 2 views
4

Есть что-то очень раздражающее функцией VectorAssembler. В настоящее время я преобразовываю набор столбцов в один столбец векторов , а затем использую функцию StandardScaler для применения масштабирования к включенным функциям. Тем не менее, кажется, что SPARK для памяти причин, решает, следует ли использовать DenseVector или SparseVector для представления каждой строки функций. Но, когда вам нужно использовать StandardScaler, вход SparseVector (s) недействителен, допускаются только DenseVectors. Кто-нибудь знает об этом?Выход VectorAssembler только для DenseVector?

Edit: я решил просто использовать UDF функцию вместо, которая превращает разреженный вектор в плотный вектор. Вид глупый, но работает.

ответ

2

Вы правы, что VectorAssembler выбирает плотный или разреженный формат вывода на основе того, что меньше использует память.

Вам не нужен UDF для преобразования из SparseVector в DenseVector; просто использовать toArray() method:

from pyspark.ml.linalg import SparseVector, DenseVector 
a = SparseVector(4, [1, 3], [3.0, 4.0]) 
b = DenseVector(a.toArray()) 

Кроме того, StandardScaler принимает SparseVector, если вы установите withMean=True при создании. Если вам нужно отказаться от значения, вы должны вычесть (предположительно ненулевое) число из всех компонентов, поэтому разреженный вектор больше не будет более разреженным.

0

вы можете преобразовать его в плотный вектор после того, как VectorAssembler преобразует его в разреженный вектор.

Вот что я сделал,

Создать DenseVector случай класс

case class vct(features:Vector) 

преобразовать разреженный вектор столбец плотного вектора столбца

val new_df = df.select("sparse vector column").map(x => { vct(x.getAs[org.apache.spark.mllib.linalg.SparseVector](1).toDense)}).toDF()

Смежные вопросы