Рекомендация по пунктам по принципу косинуса - PullRequest
0 голосов
/ 18 апреля 2019

Как часть системы рекомендаций, которую я создаю, я хочу реализовать рекомендацию по пунктам по принципу косинуса.В идеале я хотел бы вычислить косинусное сходство для 1 миллиона элементов, представленных функциями DenseVector из 2048, чтобы получить топ-n наиболее похожих элементов для данного.

Моя проблема в том, что решения, которые янатолкнулся на результативность моего набора данных.

Я пробовал:

Вот решение с использованием columnSimilities ()

import pyspark
from pyspark.sql import SparkSession
from pyspark.ml.feature import PCA
from pyspark.mllib.linalg.distributed import IndexedRow, IndexedRowMatrix
from pyspark.sql.functions import row_number

new_df = url_rdd.zip(vector_rdd.map(lambda x:Vectors.dense(x))).toDF(schema=['url','features'])

# PCA
pca = PCA(k=1024, inputCol="features", outputCol="pca_features")
pca_model = pca.fit(new_df)
pca_df = pca_model.transform(new_df)

# Indexing my dataframe
pca_df.createOrReplaceTempView('pca_df')
indexed_df = spark.sql('select row_number() over (order by url) - 1 as id, * from pca_df')

# Computing Cosine Similarity
mat = IndexedRowMatrix(indexed_df.select("id", "pca_features").rdd.map(lambda row: IndexedRow(row.id, row.pca_features.toArray()))).toBlockMatrix().transpose().toIndexedRowMatrix()
cos_mat = mat.columnSimilarities()

Есть ли лучшее решение для pyspark для вычисления косинусного сходства и получения топ-n наиболее похожих элементов?

1 Ответ

2 голосов
/ 19 апреля 2019

Рассмотрим кеширование new_df, так как вы проходите его как минимум дважды (один раз, чтобы соответствовать модели, другой раз - для преобразования данных).

Кроме того, не забудьте о необязательном пороговом значении, которое вы можете передать методу columnSimilarities.

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