我正在尝试各种方法来计算项目-项目相似度,以实现协作过滤实现。在用户项目交互的缩减采样数据集中,我拥有大约3.9毫米用户数量和1,933个项目。在其他相似性度量中,我正在研究每个项目之间的余弦相似性,并在使项目向量居中或不居中的情况下进行。在没有平均居中的情况下,工作流程大致如下:
# setup - query user-item interactions
df = spark.sql("select user, item, r_ui from user_item_interactions")
items = [i.item for i in df.select("item").distinct().collect()
# pivot to create utility matrix (rows=users, columns=items, elements=user-item rating)
utility = df.groupBy('user').pivot("item", items).max("r_ui").fillna(0)
# without mean centering
feature_rdd = utility.rdd.map(lambda row : row[1:])
feature_mat = RowMatrix(feature_rdd)
# use RowMatrix cosine similarity method
cosine = feature_mat.columnSimilarities()
# output is of type CoordinateMatrix, so can access entries
cos_df = cosine.entries.toDF()
# cos_df.doStuff(...)
# with mean centering
assembler = VectorAssembler(inputCols=utility.drop('visitor_id').columns, outputCol='features')
# vectorize and apply scaler
vectorized_utility = assembler.transform(utility)
scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=False)
scaled_utility_inter = scaler.fit(vectorized_utility.transform(vectorized_utility)
# see footnotes for "extract" function --
# just takes vector entries and blows back out to DF columns
scaled_utility = scaled_utiltiy_inter.select("user", "scaled_features").rdd.map(extract).toDF(["user"] + items)
# repeat approach from above
scaled_feature_rdd = scaled_utility.rdd.map(lambda row : row[1:])
scaled_feature_mat = RowMatrix(scaled_feature_rdd)
scaled_cosine = scaled_feature_mat.columnSimilarities()
scaled_cos_df = scaled_cosine.entries.toDF()
# scaled_cos_df.doStuff(...)
按比例缩放的DataFrame(现在带有scaled_features
列)实际上已重新制作,以与https://stackoverflow.com/questions/38384347/how-to-split-vector-into-columns-using-pyspark中所述的未缩放的效用矩阵一致。
在两种方法中,columnSimilarities()
函数将返回对称(在这种情况下为1933x1933)pyspark.mllib.linalg.distributed.CoordinateMatrix
。在未缩放的环境中访问CoordinateMatrix
的基础RDD(cos_df.entries
)大约需要20秒。以缩放方式访问它只会创建无法运行的任务。我完全不知道为什么会这样。
编辑:我的群集是一个具有两个节点的Azure Databricks群集,两个节点均为Azure D14(16核,112 GiB RAM)。驱动程序与头部相同。 Python 3,Spark 2.3.0。