我试图将ALS算法的Spark实现用于推荐系统,因此我构建了如下所示的DataFrame作为训练数据:
|--------------|--------------|--------------|
| userId | itemId | rating |
|--------------|--------------|--------------|
现在,我想创建一个稀疏矩阵,以表示每个用户和每个项目之间的交互。矩阵将是稀疏的,因为如果用户和项目之间没有交互,则矩阵中的对应值将为零。因此,最后,大多数值将为零。
但是如何使用CoordinateMatrix实现呢?我之所以说CoordinateMatrix是因为我正在使用Spark 2.1.1和python,并且在文档中,我看到仅当矩阵的两个维都很大且矩阵非常稀疏时才应使用CoordinateMatrix。
换句话说,我如何从该DataFrame到达CoordinateMatrix,其中行将是用户,列将是项,而等级将是矩阵中的值?
CoordinateMatrix只是MatrixEntrys的RDD的包装。MatrixEntry只是一个(长,长,浮点)元组的包装。Pyspark允许您从此类元组的RDD创建CoordinateMatrix。如果userId
和itemId
字段都是rating
IntegerTypes,并且和FloatType类似,则创建所需矩阵非常简单。
from pyspark.mllib.linalg.distributed import CoordinateMatrix
cmat=CoordinateMatrix(df.rdd.map(tuple))
如果userId
anditemId
字段具有StringTypes,则只会稍微复杂一点。您需要先为这些字符串建立索引,然后再将索引传递给CoordinateMatrix。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句