Python 基于余弦相似度的商品推荐

Python 基于余弦相似度的商品推荐,python,apache-spark,pyspark,cosine-similarity,recommender-systems,Python,Apache Spark,Pyspark,Cosine Similarity,Recommender Systems,作为我正在构建的推荐系统的一部分,我想实现一个基于余弦相似性的项目推荐。理想情况下,我想计算由2048个特征的DenseVector表示的100万个项目的余弦相似性,以便得到与给定项目最相似的前n个项目 我的问题是,我遇到的解决方案在我的数据集上表现不佳 我试过: 使用mllib.linalg.distributed中的ColumnComparison() 用主成分分析法降维 下面是使用ColumnComparison()的解决方案 pyspark上是否有更好的解决方案来计算余弦相似性并获

作为我正在构建的推荐系统的一部分,我想实现一个基于余弦相似性的项目推荐。理想情况下,我想计算由2048个特征的DenseVector表示的100万个项目的余弦相似性,以便得到与给定项目最相似的前n个项目

我的问题是,我遇到的解决方案在我的数据集上表现不佳

我试过:

  • 使用mllib.linalg.distributed中的ColumnComparison()

  • 用主成分分析法降维

下面是使用ColumnComparison()的解决方案


pyspark上是否有更好的解决方案来计算余弦相似性并获得前n个最相似的项?

考虑缓存
新的\u df
,因为您至少要对其进行两次检查(一次用于拟合模型,另一次用于转换数据)


此外,不要忘记可以传递给
方法的可选阈值。

考虑缓存
新的\u df
,因为您至少要对其进行两次检查(一次用于拟合模型,另一次用于转换数据)


此外,不要忘记可以传递给
方法的可选阈值。

我看到您使用的是lambda,因此强制反序列化到Python对象中。这可能是性能问题的根源。您能否在示例中提供完整的导入,以便我们获得实际的导入,并知道哪些部分来自pyspark,哪些不是?感谢您的回答Oliver,我编辑了代码。我看到您使用的是lambda,因此强制反序列化到Python对象中。这可能是性能问题的根源。你能在你的例子中提供完整的导入,这样我们就可以得到一个实际的导入,知道哪些部分来自pyspark,哪些不是?谢谢你的回复Oliver,我编辑了代码。谢谢你的提示!我尝试使用阈值,但在使用IndexedRowMatrix时,我似乎无法将参数传递给
ColumnComparizations
(但它与RowMatrix一起工作)。这是真的,只有从RowMatrix而不是IndexedRowMatrix使用
ColumnComparizations
时,阈值才是可接受的。感谢您的提示!我尝试使用阈值,但在使用IndexedRowMatrix(但它与RowMatrix一起工作)时,似乎无法将参数传递给
ColumnComparisons
。这是真的,只有从RowMatrix而不是IndexedRowMatrix使用
ColumnComparisons
时,阈值才是可接受的。
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()