基于余弦相似度的项目建议

时间:2019-04-18 13:31:17

标签: python apache-spark pyspark cosine-similarity recommender-systems

作为我正在构建的推荐器系统的一部分,我想基于余弦相似度实施一项项推荐。理想情况下,我想对由2048个特征的DenseVector表示的100万个项目进行余弦相似度计算,以使给定项的前N个最相似项。

我的问题是遇到的解决方案在数据集上的表现很差。

我尝试过:

这是使用columnSimilarities()的解决方案

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 个答案:

答案 0 :(得分:2)

考虑对new_df进行缓存,因为您至少要对其进行两次检查(一次适合模型,另一次需要转换数据)。

此外,别忘了可以传递给columnSimilarities方法的可选阈值。