Столбец Spark RowMatrixСходства сохраняют исходный индекс - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть следующий фрейм данных Scala Spark df из (String, Array[Double]): Примечание id имеет тип String (хэш base64)

id, values
"a", [0.5, 0.6]
"b", [0.1, 0.2]
...

Набор данных довольно большой (45 КБ)и я хотел бы выполнить парное косинусное подобие, используя org.apache.spark.mllib.linalg.distributed.RowMatrix для производительности.Это работает, но я не могу определить парные сходства, так как индексы превратились в целые числа (выходные столбцы i и j).Как использовать IndexedRowMatrix для сохранения исходных индексов?

val rows = df.select("values")
            .rdd
            .map(_.getAs[org.apache.spark.ml.linalg.Vector](0))
            .map(org.apache.spark.mllib.linalg.Vectors.fromML)

val mat = new RowMatrix(rows)

val simsEstimate = mat.columnSimilarities()

В идеале конечный результат должен выглядеть примерно так:

id_x, id_y, similarity
"a", "b", 0.9
"b", "c", 0.8
...

1 Ответ

0 голосов
/ 12 февраля 2019

columnSimilarities() вычисляет сходства между столбцами из RowMatrix, а не между строками, поэтому ваши "идентификаторы" не имеют смысла в этом контексте, а индексы являются индексами в каждом векторе признаков.

Кроме того, эти методы предназначены для длинных, узких и данных, поэтому очевидный подход - просто кодировать id с помощью StringIndexer, создавать IndedxedRowMatrix, транспонировать, вычислять сходства и возвращаться (с IndexToString) просто выиграл '

Ваша лучшая ставка здесь - взять crossJoin

df.as("a").crossJoin(df.as("b")).where($"a.id" <= $"b.id").select(
  $"a.id" as "id_x", $"b.id" as "id_y", cosine_similarity($"a.values", $b.values")
)

, где

val cosine_similarity = udf((xs: Array[Double], ys: Array[Double]) => ???)

- это то, что вы должны реализовать сами.

В качестве альтернативы вы можете разбить данные:

import org.apache.spark.sql.functions.posexplode

val long = ds.select($"id", posexplode($"values")).toDF("item", "feature", "value")

, а затем использовать метод, показанный в Spark Scala - Как сгруппировать строки данных и применить комплексную функцию к группам? для вычисления сходства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...