Как преобразовать столбец или последовательность векторов в SparseMatrix? - PullRequest
0 голосов
/ 10 сентября 2018

Как видно из заголовка, у меня есть последовательность векторов (в столбце DataFrame, но ее можно преобразовать в RDD или в последовательность с помощью .collect ()). Я хочу собрать эти векторы в локальный SparseMatrix. Для обратной совместимости со Spark 1.6.3 мне нужно, чтобы это была версия mllib SparseMatrix .

Собран как последовательность SparseVectors, я получаю

val seq_of_vectors = df_with_vectors.select("sparse").map(_.getAs[SparseVector](0)).collect()
seq_of_vectors: Array[org.apache.spark.mllib.linalg.SparseVector] = ...

Я могу легко создать RowMatrix, но я также не вижу способа конвертировать RowMatrix в локальную матрицу.

val exampleMatrix = new RowMatrix(df_with_vectors.select("sparse").rdd.map(_.getAs[SparseVector](0)))
exampleMatrix: org.apache.spark.mllib.linalg.distributed.RowMatrix = org.apache.spark.mllib.linalg.distributed.RowMatrix@2e6273dc

1 Ответ

0 голосов
/ 11 сентября 2018

Задана последовательность объектов SparseVector в форме

seq_of_vectors: Array[org.apache.spark.mllib.linalg.SparseVector] = 
    Array(..., (262144,[136034,155107,166596],[0.8164965809277259,0.40824829046386296,0.40824829046386296]), ...

Мы преобразуем в кортеж списка координат (строки, столбцы, значения), используя:

val coo = (seq_of_vectors.map(_.numNonzeros).zipWithIndex.flatMap{case (cnt, idx) => Array.fill(cnt)(idx) },
    seq_of_vectors.map(_.indices).flatten,
    seq_of_vectors.map(_.values).flatten
).zipped.toArray

coo: Array[(Int, Int, Double)] = 
    Array( ..., (28,136034,0.8164965809277259), (28,155107,0.40824829046386296), (28,166596,0.40824829046386296), ...

Затем мы используем fromCOO функцию SparseMatrix. Количество строк - это число пропущенных векторов; а количество столбцов - это длина самого длинного SparseVector:

SparseMatrix.fromCOO(seq_of_vectors.length,
    seq_of_vectors.map(_.size).max,
    coo)

res223: org.apache.spark.mllib.linalg.SparseMatrix = 
84 x 262144 CSCMatrix
...
(28,136034) 0.8164965809277259
...
(28,155107) 0.40824829046386296
...
(28,166596) 0.40824829046386296
...
...