Кто-нибудь знает, как использовать Приблизительный поиск ближайших соседей, предоставляемый Spark MLlib? - PullRequest
0 голосов
/ 22 мая 2019

Я хочу использовать Приближенный поиск ближайших соседей, предоставленный Spark MLlib (ref.) , но я очень растерялся, потому что я не нашел пример или что-то, что могло бы мне помочь. Единственная информация, предоставленная для предыдущей ссылки:

Приблизительный поиск ближайшего соседа занимает набор данных (функции векторы) и ключ (один вектор признаков), и это примерно возвращает указанное количество строк в наборе данных, которые являются ближайшими к вектор.

Приблизительный поиск ближайшего соседа принимает как преобразованный, так и нетрансформированные наборы данных в качестве входных данных. Если используется не преобразованный набор данных, оно будет преобразовано автоматически. В этом случае хэш-подпись будет создан как outputCol.

Столбец расстояния будет добавлен в выходной набор данных, чтобы показать истинное значение. расстояние между каждой строкой вывода и искомым ключом.

Примечание. Приблизительный поиск ближайшего соседа вернет меньше, чем k строки, когда в хэш-памяти недостаточно кандидатов.

Кто-нибудь знает, как использовать Приближенный поиск ближайших соседей, предоставляемый Spark MLlib?

1 Ответ

1 голос
/ 22 мая 2019

Здесь вы можете найти пример https://spark.apache.org/docs/2.1.0/ml-features.html#lsh-algorithms:

import org.apache.spark.ml.feature.BucketedRandomProjectionLSH
import org.apache.spark.ml.linalg.Vectors

val dfA = spark.createDataFrame(Seq(
  (0, Vectors.dense(1.0, 1.0)),
  (1, Vectors.dense(1.0, -1.0)),
  (2, Vectors.dense(-1.0, -1.0)),
  (3, Vectors.dense(-1.0, 1.0))
)).toDF("id", "keys")

val dfB = spark.createDataFrame(Seq(
  (4, Vectors.dense(1.0, 0.0)),
  (5, Vectors.dense(-1.0, 0.0)),
  (6, Vectors.dense(0.0, 1.0)),
  (7, Vectors.dense(0.0, -1.0))
)).toDF("id", "keys")

val key = Vectors.dense(1.0, 0.0)

val brp = new BucketedRandomProjectionLSH()
  .setBucketLength(2.0)
  .setNumHashTables(3)
  .setInputCol("keys")
  .setOutputCol("values")

val model = brp.fit(dfA)

// Feature Transformation
model.transform(dfA).show()
// Cache the transformed columns
val transformedA = model.transform(dfA).cache()
val transformedB = model.transform(dfB).cache()

// Approximate similarity join
model.approxSimilarityJoin(dfA, dfB, 1.5).show()
model.approxSimilarityJoin(transformedA, transformedB, 1.5).show()
// Self Join
model.approxSimilarityJoin(dfA, dfA, 2.5).filter("datasetA.id < datasetB.id").show()

// Approximate nearest neighbor search
model.approxNearestNeighbors(dfA, key, 2).show()
model.approxNearestNeighbors(transformedA, key, 2).show()

Код выше взят из документации по искрам.

...